2010-12-20 5 views
6

Im mit jqplot, um einige Diagramme zu zeichnen. Es ist ein großartiges Tool, aber es fehlt eine einfache Clickhandler-Option für jedes Diagramm.Wie verknüpfe ich ein Ereignis mit nur einem Objekt? jqplot

Die Plugins wie Highlighter, ziehbar und Cursor registrieren ihr Interesse für sich zu jqplot.eventListenerHooks Zugabe (eventListenerHooks.push ([ ‚jqplotClick‘, Rückruf]) Klick/Maus-Ereignisse aus der jqplot Leinwand einzufangen, zum Beispiel. oder ‚jqplotMouseDown‘ oder wie auch

Nach meinem Grundstück mit dem üblichen $ .jqplot machen (Ziel, Daten, Optionen.), dann macht mich die

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

und sicher genug myFunc wird überall dort aufgerufen, wo ich mitauf die Handlung klicke, neighbour, datapos und gridpos. Nachbar ist am interessantesten, es enthält meinen Datenpunkt, wenn es einen Klick darauf gab. Dies sind die Daten, die ich brauche, um ein Popup in der Nähe des Gitters mit zusätzlichen Informationen auf dem Datenpunkt zu erstellen.

Aber das Problem ist, wenn ich zwei Diagramme auf der gleichen Seite habe und verschiedene Rückrufe für jedes jqplot registrieren möchte. Wie es jetzt ist, wenn ich das zweite myFunc2 registriere, gehen alle Klicken auf dem zweiten Diagramm durch das myFunc aswell!

Muss ich Änderungen an jqplot vornehmen? Irgendwelche Richtungen?

Dank

Antwort

10

Das ist nicht gut dokumentiert, aber Sie können eine Diskussion darüber here finden.

Im Grunde müssen Sie Ereignishandler für Ihr Diagramm erstellen vor aufrufen jqplot das tatsächliche Diagramm erstellen. Um das zu tun, müssen Sie so etwas wie dies tun:

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

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

Das sind nur ein einfacher Event-Handler, der überprüft, ob es ein Punkt benachbarten Daten in der Nähe, wo Sie geklickt haben. Sehen Sie ein funktionierendes Beispiel hier: http://jsfiddle.net/andrewwhitaker/PtyFG/

Update: Wenn Sie wollen nur auf Ereignisse auf einem bestimmten Grundstück zu hören, Sie so etwas tun könnte:

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... 
}; 

Wo Sie #chartdiv mit dem, was die ersetzen würde ID des Diagramms, für das Sie Ereignisse anhören möchten, ist. Das Beispiel wurde aktualisiert.

Update 2: Sieht aus wie Sie eine regelmäßige bind Veranstaltung mit den Plot Ereignisse verwenden:

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

Beispiel dieser Methode mit 2-Charts:

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

Hoffnung, dass hilft!

+0

Danke Andrew! Ich klärte meine Frage, während Sie antworteten, ich habe das ausgearbeitet und es funktioniert gut, wenn Sie Zeit haben, siehe meinen Beitrag oben. Wie mache ich für zwei Diagramme, wo jeder einen anderen Handler hat? Oh, und danke für die Links!Checke sie jetzt aus. – rapadura

+0

@AntonioP: Kein Problem, nur meine Antwort aktualisiert. –

+0

Ah! Ich habe daran gedacht, aber es scheint wie eine nicht so schöne Lösung. Das Ereignis wird an beide Diagramme weitergegeben. Ich schaue jetzt auf https://bitbucket.org/cleonello/jqplot/src/a806b42e34e2/examples/barTest.html versuchen, es funktioniert zu bekommen ... – rapadura