4

我有一个 javascript 库,可以在不同类型的网站上运行,例如 wordpress 或 magento。js库动态加载jQuery并调用noConflict分配给脚本元素的onereadystatechange()中的另一个变量命名空间。但是,如果该站点还在我的 js 库之前加载了 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 覆盖的 '$'。

4

2 回答 2

3

您可以控制加载库的顺序。首先加载 jQuery 库(通过在您的脚本节点中添加该脚本节点,并在允许其他脚本加载之前<head>立即调用。$.noConflict()

于 2012-11-26T21:40:40.857 回答
2

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

您还可以设置 jQuery 以完全避免$使用类似的东西

var JQry = jQuery.noConflict();
于 2012-11-26T21:42:13.837 回答