In meinem Projekt hatte ich bereits gut definierten JavaScript-Code geschrieben, der die Seitenstatistiken nach einem AJAX-Aufruf aktualisierte.
Da ich die Funktionen wiederverwenden wollte, ohne "jQuery zu erweitern", kam ich zu der folgenden Lösung, bei der eine vorhandene jQuery-Funktion verwendet wurde, anstatt eine neue zu definieren. Dies wurde durch die Funktionsweise des "Flags" -Moduls inspiriert - es löst einfach ein Ereignis aus und ermöglicht es vielen Javascript-Ereignis-Listenern, als Reaktion darauf zu reagieren, anstatt nur ein einziges fest codiertes, benutzerdefiniertes jQuery-Plugin / eine Erweiterung wie in der Lösung zu haben in den vorherigen Antworten untersucht.
In einem Drupal-Modul:
// in_some_ajax_function()
$commands[] = ajax_command_invoke('html', 'trigger', array('MY_EVENT'));
In Javascript:
// Added an event binding to my $(document).ready();
$(document).ready(function(){
$(document).bind('MY_EVENT', function() {
alert('MY_EVENT');
});
});
Ich musste beachten, dass der erste Parameter für ajax_command_invoke NIEMALS native JavaScript-Objekte sind, daher funktioniert Folgendes nie, da es in einen Selektor 'document' (Element) übersetzt wird:
// This tries to select $('document')
// ... which is nothing, since there are no 'document' elements.
$commands[] = ajax_command_invoke('document', 'trigger', array('MY_EVENT'));
Seltsamerweise sind Binden $(document)
und Auslösen $('html')
kompatibel. Ich nehme an, Sie können sehr kreativ werden und spezifischere Elemente auf tieferer Ebene binden / auslösen. Wenn Sie sich ein Szenario vorstellen können, in dem dies sinnvoller ist als ein Ereignisauslöser der obersten Ebene, kommentieren Sie dies bitte!