无法追加<脚本>元素

2022-08-30 00:12:31

任何想法为什么下面的代码段没有将脚本元素添加到DOM中?

var code = "<script></script>";
$("#someElement").append(code);

答案 1

好消息是:

它是100%有效的。

只需在脚本标记中添加一些内容,例如 .您可能想问的正确问题可能是,“为什么我没有在DOM中看到它?alert('voila!');

Karl Swedberg对访问者在jQuery API站点上的评论做了很好的解释。我不想重复他所有的话,你可以直接在这里阅读(我发现很难浏览那里的评论)。

所有jQuery的插入方法都在内部使用domManip函数来清理/处理元素之前和之后插入DOM。domManip 函数所做的一件事是提取任何即将插入的脚本元素,并通过“evalScript 例程”运行它们,而不是将它们与 DOM 片段的其余部分一起注入。它单独插入脚本,计算它们,然后从 DOM 中删除它们。

我相信jQuery这样做的原因之一是避免在某些情况下插入脚本时Internet Explorer中可能发生的“权限被拒绝”错误。它还避免重复插入/评估相同的脚本(这可能会导致问题),如果它位于要插入的包含元素中,然后在 DOM 中移动。

接下来的事情是,我将通过使用函数添加脚本来总结什么是坏消息。.append()


坏消息是..

无法调试代码。

我不是在开玩笑,即使你在要设置为断点的行之间添加关键字,你最终也只会得到对象的调用堆栈,而不会在源代码上看到断点,(更不用说这个关键字只适用于webkit浏览器,所有其他主流浏览器似乎都省略了这个关键字)。debugger;

如果您完全了解代码的作用,那么这将是一个小缺点。但是,如果您不这样做,您最终会到处添加一个关键字,只是为了找出您(或我的)代码的问题。无论如何,还有另一种选择,不要忘记javascript可以本机操作HTML DOM。debugger;


解决方法。

使用javascript(不是jQuery)来操作HTML DOM

如果你不想失去调试能力,那么你可以使用javascript原生HTML DOM操作。请考虑以下示例:

var script   = document.createElement("script");
script.type  = "text/javascript";
script.src   = "path/to/your/javascript.js";    // use this for linked script
script.text  = "alert('voila!');"               // use this for inline script
document.body.appendChild(script);

就是这样,就像过去的日子一样,它不是。不要忘记清理所有内容,无论是在DOM中还是在内存中,对于引用且不再需要的所有对象,以防止内存泄漏。您可以考虑使用此代码来清理内容:

document.body.removechild(document.body.lastChild);
delete UnusedReferencedObjects; // replace UnusedReferencedObject with any object you created in the script you load.

此解决方法的缺点是您可能会意外添加重复的脚本,这很糟糕。从这里,您可以通过在添加之前添加对象验证并在添加脚本后立即从DOM中删除脚本来稍微模仿函数。请考虑以下示例:.append()

function AddScript(url, object){
    if (object != null){
        // add script
        var script   = document.createElement("script");
        script.type  = "text/javascript";
        script.src   = "path/to/your/javascript.js";
        document.body.appendChild(script);

        // remove from the dom
        document.body.removeChild(document.body.lastChild);
        return true;
    } else {
        return false;
    };
};

function DeleteObject(UnusedReferencedObjects) {
    delete UnusedReferencedObjects;
}

这样,您可以添加具有调试功能的脚本,同时避免脚本重复。这只是一个原型,你可以扩展任何你想要的东西。我一直在使用这种方法,对此非常满意。果然,我永远不会使用jQuery来添加脚本。.append()


答案 2

我见过一些问题,当你直接做它们时,一些浏览器不尊重某些更改(我的意思是从文本创建HTML,就像你尝试使用脚本标签一样),但是当你使用内置命令进行它们时,事情会变得更好。试试这个:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );

来自: JSON for jQuery