我有一个可以在不同类型的网站上运行的javascript库,例如wordpress或magento。 js lib动态加载jQuery并调用noConflict以分配给script元素的onereadystatechange()中的另一个变量名称空间。但是,如果该站点还在我的js lib之前加载Prototype js,则可能会发生Prototype和jQuery之间的冲突。
在调用onereadystatechange回调之前,可能会解析页面并调用Prototype函数。如果Prototype函数使用任何'$',它会导致该函数失败,因为美元符号'$'仍然是jQuery,而不是Prototype(在调用jQuery.noConflict()之前)。
我可以构建一个自定义jQuery,根本不使用'$',因此不需要再次加载Prototype吗?
编辑1:
以下是我的js库(mylib.js)将在网站上使用的过程,以及jQuery如何与该网站上的Prototype发生冲突。
onepage.html来自其他人的网站
<head>
<script src="prototype.js" type="text/javascript"></script>
<script src="mylib.js" type="text/javascript"></script>
</head>
mylib.js
1. If jQuery is not defined, create a script element with jQuery src and insert to header.
2. In the script element, attach event onreadystatechange.
element.attachEvent('onreadystatechange', function () {
if (elem.readyState == 'loaded' || elem.readyState == 'complete') {
callback();
}
});
3. in callback(), I called noConflict().
var callback = function() {
return function() {
if (window['jQuery'] && hasJQueryReqVersion()) {
window.myJQ = jQuery.noConflict(true);
}
}
}();
问题是在调用callback()之前,可能会调用Prototype并且它会意外地使用已被jQuery覆盖的'$'。
答案 0 :(得分:3)
您可以控制加载库的顺序。首先加载jQuery库(在<head>
中加载该脚本节点,然后立即调用$.noConflict()
,然后再加载其他脚本。
答案 1 :(得分:2)
首先加载jQuery并立即调用$.noConflict()
。
您还可以设置jQuery以完全避免使用类似
的$
var JQry = jQuery.noConflict();