質問: JSのremove 外部スクリプトを読み込んでremove()を使い読み込んだスクリプトを停止したいと考えています。 テストとして作った外部スクリプトは、onkeyupで、離されたキーをコンソールに書き込むものです。 setAttributeを使ってsrcとidを設定しappendChildで bodyに追加しています。 その後にgetElementByIdでHTMLScriptElementの取得まではできています。 document.getElementById(ID).remove() をして、その前後でコンソールにgetElementById()を書かせると一応nullになっているのですが、コンソールにはキーが離されたと書かれます。 念のためremoveAttributeも行いましたが効果なしでした。 何が原因なのでしょうか。
回答: あの、根本的な勘違いをされているようですが、「スクリプトの停止」なんて不可能ですよ? JavaScriptは基本的にシングルスレッドで動きますので、あるスクリプトが動いているときに他のスクリプトからその実行を止めるなんてことはできません。言語仕様的にその「他のスクリプト」を並行して動かすことができないので。 で、おそらく本当になさりたいのは設定されたイベントを解除するということですよね? これもScriptタグを消しても全くの無意味です。 すでに「イベントハンドラを設定する」という命令が実行されたあとなので、Scriptタグを消そうがその処理が無かったことにはなりません。 下のデモで確認できます。 title スクリプト要素削除 アラート スクリプト要素を削除しても、設定されたイベントハンドラは解除されないことがわかると思います。 くどいようですが、イベントハンドラを設定する処理が既に走ったあとだからです。 あなたが本当に注力すべきは、スクリプト要素の削除ではなく、イベントハンドラの解除です。 onkeyupで設定されたとおっしゃいますが、設定されたときの文は window.onkeyup = (略) ですか? それとも、 document.onkeyup = (略) ですか? 前者なら、 window.onkeyup = null; 後者なら、 document.onkeyup = null; で解除できます。 質問等返信していただければ、できる限りの範囲で対応します。