【问题标题】:jQuery remembering if a script was already injected?jQuery 记住脚本是否已经被注入?
【发布时间】:2011-03-02 01:01:07
【问题描述】:

更新:实际上没有必要删除添加的脚本,因为一旦它们运行,您就无法真正擦除或删除它们在页面上产生的所有效果。

这会让很多人感到困惑,所以请坐下来,放松一下,喝杯咖啡。真的要努力去理解这一点。

首先我要解释一下我在做什么。

1.) Ajax 使用特定 ID 从 php 请求数据。
2.) PHP 使用特定 ID 的脚本进行响应。
3.) Javascript 将那些返回的脚本注入到 dom 中以供运行。

我需要帮助:我想确保同一个脚本不会被注入两次。所以我可以使用 url 并以某种方式将该值存储在某处。然后javascript可以检查脚本是否已经执行,而不是运行它。

注意:不推荐使用 jQuery.getscript();或类似的东西。

xhr = jQuery.ajax({ url: 'getscript.php?id=something', dateType: 'json', 方法: 'GET', async:false}); xhr.success(函数(json){ 如果(json.script){ var script = document.createElement("script"); script.type = "文本/javascript"; script.text = json.script; document.body.appendChild(脚本); // 从 dom 中移除 document.body.removeChild(document.body.lastChild); 删除未使用的引用对象; } });

【问题讨论】:

    标签: javascript jquery plugins


    【解决方案1】:

    只需存储已执行的所有脚本 ID 的列表,并在每次要在成功函数中执行新脚本时检查它。

    【讨论】:

    • 我的问题是找出存储 url 之类的最佳方法。我不知道我是否应该使用 jQuery.data();或将它们附加到实际元素。
    • 可以通过.success($.proxy(callback_func() {..}, loaded_scripts_array));绑定一个list对象到回调函数内部的“this”对象,然后在执行前检查回调函数内部是否设置了this[id]
    【解决方案2】:

    如果您在创建的脚本块上设置了一个 id,您应该能够简单地查询该 id 是否存在于 dom 上。

    您的 ajax 调用将如下所示。

    var theId = "something";
    xhr = jQuery.ajax({ url: 'getscript.php?id=' + theId, dateType: 'json', method: 'GET', async:false});
    
    xhr.success(function(json){
    
         if(json.script && $('#'+theId).length == 0) {                  
                var script   = document.createElement("script");
                script.type  = "text/javascript";
                script.text   = json.script;
                script.id = theId;
                document.body.appendChild(script);
    
                // remove from the dom
                document.body.removeChild(document.body.lastChild);
                delete UnusedReferencedObjects;
          }
    });
    

    jsfiddle 上的示例。

    【讨论】:

    • 这很好,但我没有在您的代码中看到您实际将该 ID 分配给脚本的位置。比如 script.id = url;
    • Nm 在您的 jsfiddle.net 示例中,我正在查看您帖子中的那个。
    • 还有另一个问题,如果你的 url 包含这些 (. ? =) 例如如果你的 url 是 (get.script.php?i=5&s=sripts) 那么你的脚本会失败。此处显示为jsfiddle.net/Y5n4v。我想你必须使用正则表达式来去除 (. ? =) 但这对浏览器来说每次都很难做到这一点,有什么建议可以解决这个问题吗?
    • url是怎么生成的?您是否有机会使用您的 i=s= 值来生成 id 而不是依赖 id 的完整 url?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2022-07-28
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多