好消息是:
100% 正常工作。
只需在脚本标签内添加一些内容,例如alert('voila!');。您可能想问的正确问题可能是,“为什么我没有在 DOM 中看到它?”。
Karl Swedberg 对jQuery API site 中访客的评论做了很好的解释。我不想想重复他的所有话,你可以直接阅读there这里(我发现那里的cmets很难导航) .
jQuery 的所有插入方法都使用
内部的 domManip 函数
清洁/处理元素之前和
在它们被插入到 DOM 之后。
domManip 的一件事
功能是拉出任何脚本
即将插入和运行的元素
他们通过“evalScript 例程”
而不是将它们与其余部分一起注入
DOM 片段。它插入
分别编写脚本,评估它们,
然后将它们从 DOM 中移除。
我相信 jQuery 的原因之一
这是为了避免“权限
拒绝”错误可能发生在
插入时的 Internet Explorer
特定情况下的脚本。
也避免了反复
插入/评估相同的脚本
(这可能会导致
问题)如果它在包含
您要插入的元素和
然后在 DOM 中移动。
接下来,我将通过使用.append() 函数添加脚本来总结什么是坏消息。
坏消息是..
你不能调试你的代码。
我不是在开玩笑,即使您在要设置为断点的行之间添加 debugger; 关键字,您最终也只会得到对象的调用堆栈而看不到源代码上的断点, (更不用说这个关键字只在webkit浏览器中有效,其他所有主流浏览器似乎都省略了这个关键字)。
如果您完全了解您的代码的作用,那么这将是一个小缺点。但如果你不这样做,你最终会在所有地方添加一个debugger; 关键字,只是为了找出你(或我的)代码有什么问题。无论如何,还有一个替代方案,不要忘记 javascript 可以原生操作 HTML DOM。
解决方法。
使用 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.
此解决方法的缺点是您可能会意外添加重复的脚本,这很糟糕。从这里您可以稍微模仿.append() 函数,方法是在添加之前添加对象验证,并在添加脚本后立即从 DOM 中删除脚本。考虑这个例子:
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()添加脚本。