Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 多个jQuery版本的Internet Explorer中的脚本onreadystatechange竞赛条件_Javascript_Jquery_Internet Explorer_Onreadystatechange - Fatal编程技术网

Javascript 多个jQuery版本的Internet Explorer中的脚本onreadystatechange竞赛条件

Javascript 多个jQuery版本的Internet Explorer中的脚本onreadystatechange竞赛条件,javascript,jquery,internet-explorer,onreadystatechange,Javascript,Jquery,Internet Explorer,Onreadystatechange,设想以下设置: 一个页面有一个旧的jQuery版本(比如1.5.2)——我无法控制它——从我的服务器加载一个Javascript文件,该文件也需要jQuery,但需要一个更新的版本。(例如1.8.3)现在,我的脚本尝试执行以下操作: <!-- load your jQuery version --> <script type="text/javascript" src="http://example.com/jquery-1.9.1.js"></script>

设想以下设置: 一个页面有一个旧的jQuery版本(比如1.5.2)——我无法控制它——从我的服务器加载一个Javascript文件,该文件也需要jQuery,但需要一个更新的版本。(例如1.8.3)现在,我的脚本尝试执行以下操作:

<!-- load your jQuery version -->
<script type="text/javascript" src="http://example.com/jquery-1.9.1.js"></script>
<script type="text/javascript">
    var $_mine = $.noConflict(true);
</script>

<!-- initialize their scripts -->
<script type="text/javascript" src="http://example.com/their-jquery.js"></script>
<script type="text/javascript" src="http://example.com/their-script.js"></script>
var script=document.createElement(“脚本”);
setAttribute(“type”、“text/javascript”);
script.setAttribute(“src”http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js");
script.onreadystatechange=function(){//IE
如果(script.readyState==“完成”| | script.readyState===“加载”){
ready();
}
};
script.onload=function(){//其他浏览器
ready();
};
(document.getElementsByTagName(“head”)[0]| | document.documentElement).appendChild(脚本);
然后,
ready
函数检查
$
是否有正确版本的jQuery,如果有,它会将该jQuery实例绑定到另一个变量,并通过
newjQuery=window.jQuery.noConflict(true)将
$
返回到原始jQuery版本

现在这一切都很好,而且在加载“我的”jQuery版本和将$恢复到“他们的”jQuery版本之间没有(外部)代码执行——至少在Chrome、Firefox等上是这样。这种方法失败的地方是Internet Explorer,出于某种原因,它至少处理了一个“勾号”可能并行运行的Javascript代码。这往往会弄乱与“my”jQuery版本不兼容的代码,并在IE尚未执行就绪事件的5ms内执行

这里有一个小提琴示例:

在fiddle中,我每10毫秒测试一次当前绑定的jQuery版本。只有在IE9中,
$
引用“我的”jQuery时,有时会有一个很短的时间跨度,如“这不应该发生”日志所示

现在我的问题是:
在调用noConflict之前覆盖“他们的”jQuery的短时间内,将“我的”jQuery版本加载到自己的变量中,而不导致页面代码执行出现任何问题的最佳解决方案是什么?

加载jQuery版本时,请尝试以下操作:

<!-- load your jQuery version -->
<script type="text/javascript" src="http://example.com/jquery-1.9.1.js"></script>
<script type="text/javascript">
    var $_mine = $.noConflict(true);
</script>

<!-- initialize their scripts -->
<script type="text/javascript" src="http://example.com/their-jquery.js"></script>
<script type="text/javascript" src="http://example.com/their-script.js"></script>
下面是一个正在工作的JSFIDLE,它显示了此方法的工作原理:


诀窍是按顺序加载这两个项,并在jQuery版本就位后加载依赖项。

您是否仅对“我的”jQuery版本没有控制权?是否有可能将您的版本和加载的版本都置于无冲突模式,并分别引用每个版本(如中所示)?在查看该线程之前,我不知道这一点,但如果加载了两个版本,则第二个版本将接管
$
,但原始版本的备份将保留为
\u$
。也许你可以利用它。@Cory我只能控制“我的”jQuery,而不能控制“他们的”jQuery。这意味着,如果我将“他们的”jQuery移动到另一个变量名,他们的代码将中断
$
必须是“他们的”jQuery,而“我的”jQuery可以与我想要的任何变量相关联。您是否托管/能否托管较新的jQuery文件?然后,您可以编辑jQuery代码以使用不同的名称,这是一个单行更改。我曾考虑过托管我自己的jQuery版本,但这是有代价的:缓存命中率将大大低于Google CDN托管的jQuery版本,每当我想切换到新版本时,我都必须更新自定义jQuery库。这是我最后的选择,所以如果有更好的解决方案,我宁愿不这样做。实际上,这可能是好主意的重复。尽管我必须根据他们使用的版本动态加载他们的jQuery,但我必须尝试这样做。谢谢,特洛伊,我测试完后会给你回复的。