重要なのは、article.jsを自分のページに含めたくないので、を使用することはできないということ.append()
です。
スクリプトがダウンロードされて評価されると、明示的に削除されない限り、スクリプトが残したものはすべて残ります。それらは要素自体にリンクされておらず、script
それを削除しても影響はありません。
周りに残っているものを取り除く唯一の方法は、article.js
それが作成して保持するすべてのものを削除または上書きすることです。
具体的な例:
// article.js
var foo = "bar";
jQuery(function($) {
$(".stuff").click(function() {
alert("You clicked stuff!");
});
});
上記のリストが処理された場合、それをロードした要素をarticle.js
削除できます。これは、フックしたグローバル変数またはイベントハンドラーには影響しません。script
foo
アンロードできるスクリプトが必要な場合は、次のようなプロパティに割り当てることで、追加する単一のグローバルシンボルを持つモジュールパターンを使用するようにします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">
ロードしただけarticles.js
でロードしていない場合はcustomers.js
、そのボタンをクリックすると「Articles!」が表示されます。次にロードする場合customers.js
、ボタンをクリックすると「Customers!」が表示されます。
これは、イベントハンドラーがを呼び出す foo()
ために機能しますが、イベントハンドラー自体はではありません foo
。このonclick
属性は、非表示のイベントハンドラーを作成します。同等のjQueryは次のようになります。
$("input[type='button'][value='Foo']").click(function() {
foo();
});
実行するだけで、非常に異なることが行われることに注意してください。それは、その時点でイベントハンドラーとして指す.click(foo)
関数をフックします。後で(ロードすることによって)ポイントを変更しても、古い関数がハンドラーとしてフックされているという事実は変わりません。foo
foo
customers.js
FWIW、質問とコメントから、このページ/アプリの戦略をじっくりと確認することをお勧めします。このコードのインとアウトの交換などはすべて、設計上の問題のようです。