关键是我不想再将 article.js 包含在我的页面中,所以我不能只使用.append()
.
一旦脚本被下载和评估,它留下的任何东西都会保留下来,除非明确删除;它们没有链接到script
元素本身,删除它不会对它们产生任何影响。
摆脱article.js
周围的东西的唯一方法是删除或覆盖它创建和保留的每一个东西。
具体例子:
// article.js
var foo = "bar";
jQuery(function($) {
$(".stuff").click(function() {
alert("You clicked stuff!");
});
});
如果article.js
处理了上面列出的内容,您可以删除script
加载它的元素,这不会影响foo
全局变量或它连接的事件处理程序。
如果您想拥有可以卸载的脚本,请让他们使用带有单个全局符号的模块模式,他们通过分配给属性 on 来添加window
,例如:
// article.js
window.articleScript = (function() {
var foo = "bar";
jQuery(function($) {
$(".stuff").bind("click.article", function() {
alert("You clicked stuff!");
});
});
function remove() {
$(".stuff").unbind("click.article");
try {
delete window.articleScript;
}
catch (e) { // Early IEs throw incorrectly on the above
window.articleScript = undefined;
}
}
return {
remove: remove
};
})();
然后,您可以通过执行以下操作将其删除:
articleScript.remove();
重新评论您对该问题的评论:
也许我应该提到两个文件中都有同名的方法。
如果你有全局函数声明,customers.js
它使用与全局函数声明相同的名称articles.js
,当你加载时customers.js
,它将替换那些函数。
所以如果你有这个articles.js
:
function foo() {
alert("Articles!");
}
...这在customers.js
:
function foo() {
alert("Customers!");
}
你有一个按钮:
<input type="button" onclick="foo();" value="Foo">
当您加载了 justarticles.js
和 notcustomers.js
时,单击该按钮会为您提供“文章!”。如果您然后加载customers.js
,单击按钮将为您提供“客户!”。
这是有效的,因为事件处理程序调用 foo()
,但事件处理程序本身不是 foo
。该onclick
属性为您创建一个隐藏的事件处理程序。等效的 jQuery 将是:
$("input[type='button'][value='Foo']").click(function() {
foo();
});
请注意,只是做.click(foo)
会做一些非常不同的事情:它将连接当时指向的函数作为foo
事件处理程序。即使您稍后更改指向的内容(通过加载),也不会改变旧函数作为处理程序连接的事实。foo
customers.js
FWIW,从问题和您的评论来看,我想我建议您坐下来查看您针对此页面/应用程序的策略。所有这些代码的进出交换似乎都是一个设计问题。