Prototype 1.7 vs. jQuery 1.4.3+ Workaround

Bin gerade auf ein Problem gestoßen und möchte hier schnell meine Lösung festhalten.

Situation
Man will prototype und jQuery parallel benutzen. Dafür gibt es ja bekanntlich jQuery.noConflict().

Problem
Ab Version 1.4.3 von jQuery klappt das nicht mehr richtig. Version 1.4.2 funktioniert bei mir perfekt.
Siehe: jQuery Bugtracker und jQuery Forum

Lösung
Im Bugreport bzw. im Forum wird ein Fix für jQuery vorgeschlagen.
Ich bin den anderen Weg gegangen und habe prototype gepatcht.
Ist vielleicht nicht die schönste und beste Lösung, aber es funktioniert bei mir bisher ohne Probleme.

--- prototype.js.orig	2010-11-16 21:33:26.000000000 +0100
+++ prototype.js	2011-01-07 21:06:39.039888000 +0100
@@ -5971,7 +5971,7 @@
     var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
     if (!classNames && !className) return elements;
 
-    var nodes = $(element).getElementsByTagName('*');
+    var nodes = Prototype.$alias(element).getElementsByTagName('*');
     className = ' ' + className + ' ';
 
     for (var i = 0, child, cn; child = nodes[i]; i++) {
@@ -5985,7 +5985,7 @@
   };
 
   return function(className, parentElement) {
-    return $(parentElement || document.body).getElementsByClassName(className);
+    return Prototype.$alias(parentElement || document.body).getElementsByClassName(className);
   };
 }(Element.Methods);
 
@@ -6080,3 +6080,5 @@
     }
   });
 })();
+
+Prototype.$alias = $;

Download: prototype.js.patch

Update (17.03.2011):
Inzwischen scheint der Bug seitens jQuery in Version 1.5.1 gefixt zu sein.

#8033 jQuery 1.4.4+ fails to load on pages with old Prototype (< = 1.5) or Current Prototype + Scriptaculous in IE

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.