Frage

Ich weiß sehr wenig über JavaScript aber trotz dieser Ich versuche, etwas zusammen auf meinem Wordpress-Blog schustern. Es funktioniert nicht, und ich weiß nicht, wie es zu lösen, und hey, das ist, was Stackoverflow für ist, nicht wahr?

Zuerst wird die Fehlermeldung lautet:

Error: element.dispatchEvent is not a function
Source File: http://.../wp-includes/js/prototype.js?ver=1.6
Line: 3936

Es kommt beim Laden der Seite. Meine Seite Last-Handler registriert thusly:

Event.observe(window, 'load', show_dates_as_local_time);

Der Fehler geht weg, wenn ich einige andere Plug-ins zu deaktivieren, und diese (plus googeln) führte mich zu dem Schluss, dass es einen Konflikt zwischen Prototyp und jQuery war (die von einigen der anderen Plugins verwendet wird).

Zweitens verfolge ich die Wordpress-Praxis empfohlen verwenden wp_enqeue_script eine Abhängigkeit hinzuzufügen von mein JavaScript in der Prototype-Bibliothek wie folgt:

add_action( 'wp_print_scripts', 'depo_theme_add_javascript' );

function depo_theme_add_javascript() {
    wp_enqueue_script('friendly_dates', 'javascript/friendly_dates.js', array('prototype'));
}

Jetzt bin ich auch bewusst, dass es einige mögliche Konflikte zwischen jQuery und Prototype sind, die das jQuery noConflicts Methode aufgelöst verwenden. Ich habe versucht, dass von den verschiedenen Plätzen fordern aber nicht gut. Ich weiß nicht denken das ist das Problem, weil a) die noConflict Funktion ausschließlich auf die $ Variable bezieht, die nicht das Problem hier zu sein scheint, und b) Ich würde erwarten Wordpress es für mich zu klären, denn es kann ...

Schließlich mit den Venkman-Debugger ich festgestellt habe, dass der element in der Fehlermeldung verwiesen wird, ist in der Tat ein HTMLDocument, sondern auch eine dispatchEvent mangelt. Nicht sicher, wie das passieren konnte, da es eine Standard-DOM-Methode?

War es hilfreich?

Lösung 4

Danke für die Vorschläge alle. Am Ende denke ich, Kents Erklärung war in der Nähe, die im Wesentlichen in Höhe von „Prototype ist gebrochen“. (Sorry, wenn ich zusammenfassend Sie falsch:)

Wie für die jQuery.noConflict Option - ich dies in der Frage bereits erwähnt. Es macht einen Unterschied , wenn Sie führen Sie dieses Verfahren, und ich habe sehr wenig Kontrolle darüber. Wie gesagt, habe ich versucht, es in ein paar verschiedenen Orten (speziell der Seitenkopf und auch von meiner Skript-Datei) ausgeführt wird, keine Wirkung. So viel, wie wir würden alle wie es zu sein „nur verwenden noConflict“ ist nicht eine Antwort auf diese Frage, zumindest nicht ohne weitere Informationen.

Außerdem jQuery.noConflict scheint über die $ variabel zu sein, und den Code um den Fehlerpunkt nicht mit diesen Variablen beschäftigt überhaupt. Natürlich konnten sie indirekt in Beziehung gesetzt werden, ich habe es nicht aufgespürt.

Also im Grunde ich das Drehbuch umschreiben am Ende mit jQuery anstelle von Prototype, die eigentlich seine eigenen Probleme hatte. Auf jeden Fall habe ich die ganze Kriegsgeschichte auf meinem Blog rel="nofollow sollten Sie interessiert sein.

Andere Tipps

Es gibt einen fiesen Trick viele Bibliotheken zu tun, dass ich eine deutliche Vorliebe genommen habe, und es sieht aus wie Prototyp eines davon ist.

Mootools tut dies, wenn ich recht habe, und es beinhaltet viele der Prototypen auf den Grundklassen Überlastung, Affe sie patchen.

Und ebenso, ich ähnlich seltsames Verhalten auftreten, wenn Mootools und jQuery vorhanden war, in der Regel sterben jQuery, weil es einige Objektmethode ruft der von Mootools irgendwie überlastet / Affen geflickt worden ist.

Auch auf mysteriöse Weise, Mootools aus der Skript Einsatzliste führte in alles läuft viel schneller nehmen, was ich war auf weniger Objekt Verschmutzung geschlossen.

Jetzt kann ich falsch sein, aber ich schloss aus meiner Erfahrung solche Bibliotheken einfach nicht miteinander koexistieren mögen, und zu sehen, wie Mootools Code schien mir Geschwindigkeit abzubauen, zu der normalen Dinge getan wurden, ich aufgesaugt und portierte alle mootools zu jQuery (A Zeit viel raubend ich versichern Ihnen) basierten Code, und das Ergebnis war Code, war schnell und nicht hatte seltsame Fehler dass waren unerklärlich.

Ich empfehle Ihnen, die Migration betrachten als zumindest Ein Ihre Möglichkeiten.

Eine weitere Sache, beim Schreiben:

Ich neige dazu, diese Syntax mit allen meinem jQuery angetrieben Code zu verwenden, für ein wenig sichere Verkapselung im Fall jemand bricht irgendwie ‚$‘.

Runtime-Code Diese wartet auf document.ready vor der Ausführung:

 jQuery(function($){ 
      code_with_$_here; 
 }); 

jQuery Plugins

(function($){ 
    code_with_$_here; 
})(jQuery); 

diese Verwendung wird es leichter für Menschen mit jeder jQuery Sie es in der Lage sein passieren schreiben eines Konflikts Problem ohne viel zu verwenden.

Dies wird ihnen im Grunde verlassen ihren Code, um sicherzustellen, ist nichts wirklich magisch tun.

Es lohnt sich, diesen Artikel auf der Website JQuery Lesen über JQuery Verwendung mit anderen Bibliotheken . Es befasst sich mit mehr als nur die noConflict Option.

Ich glaube, Sie sollten gut suchen, da alle jQuery-Plugins eine Prototyp-Version hat und alle Prototypen Plugins, um eine jQuery-Version hat. Wenn Sie wirklich nicht finden, was Sie suchen und Sie können nicht nur eine Bibliothek verwenden, werfen Sie einen Blick hier bei

jQuery.noConflict();

Aber noch einmal, ich denke, es keinen Sinn machen 15-20kb für jede Bibliothek zu laden über:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top