【问题标题】:Replacing script src using jquery not executed使用 jquery 替换脚本 src 未执行
【发布时间】:2011-01-14 15:40:55
【问题描述】:

我想动态替换脚本的源 URL 以加快开发阶段,因此没有实际的生产使用。这种替换适用于 css 或图像。但是很难让它与 javascript src 一起工作。该脚本似乎没有执行,尽管是通过 src 加载的。

这是我所做的。

..................
  return this.each(function() {
    $(this).click(function() {
    var t = $(this);
    options.newVal = t.val();
    var absUrl = '/root_path_still_within_the_same_domain/';
    //options.oldVal is just to limit the replacement scope
    var oldJsUrl = absUrl + options.oldVal + '.js';
    var newJsUrl = absUrl + options.newVal + '.js';

    var reJsUrl = $('script[type*=javascript][src*=' + options.oldVal + ']' || 'script[type*=javascript][src*=' + options.newVal + ']');

        if (oldJsUrl.length && options.oldVal.length) {
          reJsUrl.attr('src', newJsUrl);
        }

        options.oldVal = options.newVal;

    });
  }); 

......................

在 Firebug 中,目标旧 src url (/old_path_to_file.js) 被新的 (/new_path_to_file.js) 替换。所以替换工作。但它报告,(请参阅真正的绝对网址 http://,如果相关):

无法加载源代码:http://localhost/........js

所以脚本 src 被替换了,但没有被执行。我错过了什么,如果这些东西仍然允许的话?

我也尝试过使用$.getScript(absUrl + options.newVal + '.js');,但这并没有取代旧的src,只是在dom中添加更多的js,这不是我想要的。这部分也有任何提示吗?

感谢所有可能的帮助。

【问题讨论】:

    标签: jquery dom


    【解决方案1】:

    您想“替换”旧脚本吗?也就是说,加载了script标签的javascript已经不在内存中,而新的javascript在?你不能这样做。您必须取消定义并取消附加由原始脚本执行的事件。

    【讨论】:

    • 如果有的话我应该走什么路线呢?也许 $.getScript 可以替换?您能否提供示例如何取消定义和取消附加事件?谢谢
    • 嗯...好吧,我想我得看看原始脚本是什么样子的。
    • 每个脚本处理相同的事情不同:one.js: $('.rounded').corner("8px"); two.js: $('.rounded').corner("6px");等相关内容比较复杂。我试图避免将它们合并到一个带有条件 .etc 的脚本中,因为在开发完成后它们需要分开生活。
    • 好的,我们还需要看看脚本到底做了什么。例如,“替换”圆角的最有效和正确的方法是不加载另一个 js 文件。
    • 好的,明白了。你和尼克说了同样的话,但我对看到真相的期望太高了:)我仍然必须走老路,如果有必要的话,可以按照你说的取消定义。有些更简单,例如 uncorner(:) 感谢您引导我朝着正确的方向前进。
    【解决方案2】:

    如果您只想包含另一个脚本:

    var script = document.createElement("script");
    script.src = url; //Specify url here
    script.type = "text/javascript";
    $("body").append(script);
    

    这将添加一个脚本并执行它...出于安全原因,您不能替换 src 并让它运行。您也不能只是“撤消”原始脚本所做的任何事情……根据您的问题,我认为这不是问题,但如果是,也许您不应该包含初始脚本标签,决定您需要什么并像上面展示的那样动态创建脚本元素。

    【讨论】:

    • 这就像getScript,在dom中添加更多的js,只是没有inline。需要“撤消”实际上是因为另一个脚本以不同的方式处理相同的事情。所以必须删除旧的内存。但是,我可以用 script.remove() 来“撤消”之前加载的脚本吗?这边?
    • @kuswantin - 这将删除脚本元素...但不会撤消脚本所做的任何事情。
    • 我明白了。这就解释了。谢谢尼克。
    猜你喜欢
    • 2015-06-06
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2014-12-21
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多