2010-12-20 11 views
6

Im przy użyciu jqplot do rysowania niektórych wykresów. Jest to doskonałe narzędzie, ale brakuje mu prostej opcji obsługi ręcznej dla każdego wykresu.Jak powiązać wydarzenie z tylko jednym obiektem? jqplot

Jego wtyczki, takie jak zakreślacz, przeciągalne i kursor rejestrują swoje zainteresowanie przechwytywaniem zdarzeń kliknięcia/myszy z obszaru roboczego jqplot, dodając się do jqplot.eventListenerHooks (eventListenerHooks.push (['jqplotClick', oddzwanianie]), na przykład. lub 'jqplotMouseDown' lub takie dostępne są również

Po dokonaniu moją działkę ze zwykłymi $ .jqplot (docelowego danych, opcje);. następnie zrobić to

$.jqplot.eventListenerHooks.push(['jqplotClick', myFunc]);

i na pewno wystarczy myFunc zostaje wywołany, gdziekolwiek kliknę na działce, z event, neighbour, datapos i gridpos. Sąsiad jest najciekawszy, zawiera mój punkt danych, jeśli zostało kliknięte. Jest to dane potrzebne do utworzenia wyskakującego okienka blisko gridpos z dodatkowymi informacjami o punkcie danych.

Ale problem polega na tym, że mam dwa wykresy na tej samej stronie i chcę zarejestrować różne wywołania zwrotne dla każdego jqplota. Tak jak to jest teraz, kiedy rejestruję drugi myFunc2, wszystkie kliknięcia na drugim wykresie przechodzą przez myFunc!

Czy muszę wprowadzić zmiany w jqplot? Jakieś wskazówki?

Dzięki

Odpowiedz

10

To nie jest dobrze udokumentowane, ale można znaleźć dyskusję na jego temat here.

Zasadniczo, musisz utworzyć programy obsługi zdarzeń dla swojego wykresu przed, wywołując jqplot, aby utworzyć rzeczywisty wykres. Aby to zrobić, trzeba zrobić coś takiego:

var handler = function(ev, gridpos, datapos, neighbor, plot) { 
    if (neighbor) { 
     alert('x:' + neighbor.data[0] + ' y:' + neighbor.data[1]); 
    } 
}; 

$.jqplot.eventListenerHooks.push(['jqplotClick', handler]); 

to tylko prosty obsługi zdarzeń, który sprawdza, czy istnieje sąsiedni punkt danych w pobliżu gdzie kliknąłeś. Zobacz przykład pracuje tu: http://jsfiddle.net/andrewwhitaker/PtyFG/

Aktualizacja: Jeśli chcesz tylko słuchać zdarzeń na pewnej działce, można zrobić coś takiego:

var handler = function(ev, gridpos, datapos, neighbor, plot) { 
    if (plot.targetId === "#chartdiv") { 
     if (neighbor) { 
      alert('x:' + neighbor.data[0] + ' y:' + neighbor.data[1]); 
     } 
    } 
    else if (plot.targetId === "#chart2div") { 
     .... 
    } 
    // etc... 
}; 

Gdzie zastąpi #chartdiv z cokolwiek Identyfikator wykresu, dla którego chcesz słuchać zdarzeń, jest. Przykład został zaktualizowany.

Aktualizacja 2: Wygląda na to, można użyć zwykłej bind wydarzenie wydarzeń działki:

$("#chartdiv").bind("jqplotClick", function(ev, gridpos, datapos, neighbor) { 
    if (neighbor) { 
     alert('x:' + neighbor.data[0] + ' y:' + neighbor.data[1]); 
    } 
}); 

przykład stosując tę ​​metodę, z 2 wykresów:

http://jsfiddle.net/andrewwhitaker/PtyFG/5/

nadzieję, że pomaga!

+0

Dzięki Andrew! Wyjaśniłem moje pytanie, podczas gdy ty odpowiadając, pracowałem nad tym i działa świetnie, jeśli masz czas, zobacz mój post powyżej. Jak zrobić dla dwóch wykresów, z których każdy ma inny program obsługi? Aha, i dzięki za linki!Sprawdź je teraz. – rapadura

+0

@AntonioP: Nie ma problemu, tylko zaktualizowałem moją odpowiedź. –

+0

Ah! Myślałem o tym, ale wygląda na to, że nie jest to piękne rozwiązanie. Zdarzenie jest propagowane do obu wykresów. Zamierzam teraz spojrzeć na https://bitbucket.org/cleonello/jqplot/src/a806b42e34e2/examples/barTest.html próbując uruchomić ... – rapadura

Powiązane problemy