【问题标题】:Can getscript run imported scripts in jquery noconflict?getscript 可以在 jquery noconflict 中运行导入的脚本吗?
【发布时间】:2013-03-08 22:31:45
【问题描述】:

假设我正在运行一个没有冲突的 jQuery 版本:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><script type="text/javascript">var jQuery191 = $.noConflict(true);</script>

我有一个外部 .js 文件,应该使用无冲突版本 jQuery191 运行,并在脚本底部包含 (jQuery) 的 jQuery 对象。

如果我将 .js 文件包含在 getScript() 中并使用不冲突的 jQuery 对象运行它:

(function (jQuery) {
    $.getScript("js.js");
})(window.jQuery191)

脚本是用jQuery191 还是原来的jQuery 运行?还是这个逻辑很愚蠢。

【问题讨论】:

  • 在您的情况下,它使用原始 jQuery 运行,因为您从未将 jQuery191 版本设置为 $

标签: jquery jquery-plugins getscript


【解决方案1】:

getScript 只会加载脚本并将其添加到页面中,它根本不会影响脚本的行为。如果脚本通过全局名称访问 jQuery,则找不到它(由于调用了 noConflict),并且无法正常运行。

如果可以的话,我建议在调用noConflict 之前包含脚本之前,否则你将不得不修改脚本以在你放置它的地方查找jQuery (jQuery191 )。

【讨论】:

    【解决方案2】:

    在您的包装器 ((function() { ... })()) 中,您将 jQuery 变量定义为全局范围内的 jQuery191 变量的副本。

    这意味着$.getScript 不使用该变量,但调用jQuery.getScript 有效。 因为它是一个匿名函数,所以包装器内的 $ 现在引用外部 $ 变量(在这种情况下,是全局对象中的 $)。 您可以通过将包装器的第一个参数重命名为 $ 来解决此问题:

    (function ($) {
        $.getScript('foo.js');
    })(window.jQuery191);
    

    或者通过在你的包装器中添加这个:

    var $ = jQuery
    

    现在,$jQuery 都包含全局范围的 jQuery191 变量的副本。

    【讨论】:

    • 没错,但对于foo.js 来说并不重要——它仍然不会受到页面中包含它的上下文的影响。
    • 但是,$.getScript 会将脚本附加到 ,导致它在 $jQuery 不是 jQuery 1.9.1 的全局范围内运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-08-09
    • 2011-03-26
    相关资源
    最近更新 更多