构建一个没有$ dollar符号的自定义jQuery

时间:2012-11-26 21:38:07

标签: jquery

我有一个可以在不同类型的网站上运行的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覆盖的'$'。

2 个答案:

答案 0 :(得分:3)

您可以控制加载库的顺序。首先加载jQuery库(在<head>中加载该脚本节点,然后立即调用$.noConflict(),然后再加载其他脚本。

答案 1 :(得分:2)

首先加载jQuery并立即调用$.noConflict()

您还可以设置jQuery以完全避免使用类似

$
var JQry = jQuery.noConflict();