是否可以在同一页面上加载多个不同版本的jQuery?

我正在创建一个bookmarklet,如果找不到该对象,它将加载jQuery。 加载将检查jQuery的版本。 代码如下:

(function(){ var myBkl = { loadScript: function(src) { if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){ return; } var s = document.createElement('script'); s.setAttribute('src', src); s.setAttribute('type', 'text/javascript'); document.getElementsByTagName('head')[0].appendChild(s); }, whenLoaded: function(callback){ if (typeof(window.jQuery) !== 'undefined' && window.jQuery.fn.jquery == '1.3.2') { callback(window.jQuery); } else { setTimeout((function() {myBkl.whenLoaded(callback); }), 100); } }, init: function($){ console.log($.fn.jquery); } }; myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js'); myBkl.whenLoaded(myBkl.init); })(); 

我使用这个bookmarklet构建器来创建书签http://subsimple.com/bookmarklets/jsbuilder.htm

显然,如果页面已经加载了jQuery。 加载1.3.2脚本将覆盖页面上的window.jQuery对象。 我只是想知道有没有让1.3.2加载到另一个自命名变量? 使用jQuery.noConflict(true);

我怀疑你已经看到了所有的警告并理解你可以将jQuery移动到另一个命名空间:

 //Completely move jQuery to a new namespace in another object. var dom = {}; dom.query = jQuery.noConflict(true); 

并且该插件可能无法工作,您必须在加载或使用其他脚本之前完成所有这些操作。

祝你好运/有点好奇,如果这对你有用〜

是。 我通过这段代码得到了它:

  (function(){ var myBkl = { jq: null, loadScript: function(src) { if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){ return; } var s = document.createElement('script'); s.setAttribute('src', src); s.setAttribute('type', 'text/javascript'); document.getElementsByTagName('head')[0].appendChild(s); }, whenLoaded: function(callback){ if (typeof(window.jQuery) !== 'undefined' && window.jQuery.fn.jquery == '1.3.2') { myBkl.jq = window.jQuery.noConflict(true); callback(myBkl.jq); } else { setTimeout((function() {myBkl.whenLoaded(callback); }), 100); } }, init: function($){ console.log($.fn.jquery); console.log(window.jQuery.fn.jquery); } }; myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js'); myBkl.whenLoaded(myBkl.init); })(); 

运行“jQuery.noConflict(true);”时 使用第一个jQuery版本的代码可能会破坏。
在某些情况下,代码甚至不属于您。 你编写了一个脚本,它应该被添加到页面并使用jQuery,你对托管页面一无所知。
托管代码可能会加载其jQuery版本,检测到它已加载,开始使用它,然后等待(setTimeout),然后您的代码启动,执行“jQuery.noConflict(true);” ,并等待它加载。 当您的代码等待时,控件可能会返回到托管代码,该代码尝试运行其jQuery并发现它不存在。

对于这种情况,我的建议是将jQuery加载到另一个新窗口中,而不是从原始窗口中删除它。 然后,当它被加载时,使用“jQuery.noConflict(true);” 在新窗口上将其复制到原始窗口。 但是,新的jQuery对象实际上是在新窗口及其文档上运行的。 因此,当使用新的jQuery时,原始的window.document必须作为第二个参数传递,如下所示:

 newJq("#elementInOriginalDocument", window.document).html("some text"); 

在我实现这个想法之后:

      Test jQuery 
hostScope
guestScope

查看此博客

您可以使用该方法

 $.noConflict(true); 

实现这一目标。 例如: