Hi, I found a conflict between jQuery and Prototype while debugging
diigolet, a rather complex bookmarklet that uses jQuery.
To reproduce it:
Open
http://prototypejs.org/ in google chrome, copy and paste content from
http://code.jquery.com/jquery-1.4.3.js to the javascript console and run it. An error is thrown:
Error: NOT_SUPPORTED_ERR: DOM Exception 9
The error is thrown by a call to div.getElementsByClassName("e") in sizzle.js.
HTMLElement.prototype.getElementsByClassName is overwritten by prototype.js and it uses $ which is overwritten by jQuery. The result is that jQuery can't finish initializing and prototype is also left broken.
window.$ and window.jQuery is exposed at the end of core.js before the feature detection code in sizzle.js.
- // Expose jQuery to the global object
- return (window.jQuery = window.$ = jQuery);
My fix to the problem is simple: just move the exposure code to the end of outro.js and call jQuery.noConflict(true) right after the jQuery code. Then both prototype and jQuery will be fine.
I know why the exposure is advanced to core.js but maybe there is a better way to avoid the conflict. e.g. Put sizzle.js code to the beginning because it doesn't rely on jQuery anyway.