8

アプリで問題が発生するため、追加したスクリプトを削除するにはどうすればよいですか。

これは私のスクリプトを取得するための私のコードです

var nowDate = new Date().getTime();
var url = val.redirect_uri + "notify.js?nocache=" + nowDate + "&callback=dummy";
var script = document.createElement('script');
script.src = url;
document.body.appendChild(script);

次に、自動ロード機能があります。これにより、別の要素スクリプトが作成されます。

別の要素が追加される前に追加された前の要素を削除したい。

4

9 に答える 9

13

基本的に、次のような関数を使用してスクリプトタグを削除できます。

function removeJS(filename){
 var tags = document.getElementsByTagName('script');
 for (var i = tags.length; i >= 0; i--){ //search backwards within nodelist for matching elements to remove
  if (tags[i] && tags[i].getAttribute('src') != null && tags[i].getAttribute('src').indexOf(filename) != -1)
   tags[i].parentNode.removeChild(tags[i]); //remove element by calling parentNode.removeChild()
 }
}

これは、filenameパラメーターを使用して、削除するターゲットスクリプトを識別することに注意してください。また、ターゲットスクリプトは、削除しようとしたときにすでに実行されている可能性があることに注意してください。

于 2012-02-27T18:12:20.327 に答える
5

スクリプトがすでに追加されているかどうかを確認するだけです。追加してから削除すると、不必要な複雑さが増します。このようなものが機能するはずです:

var scriptAdded = false;

if(scriptAdded == false) {
    document.body.appendChild(script);
    scriptAdded = true;
}
于 2012-02-27T13:26:39.670 に答える
3

私はさらにいくつかのテストを行いました、そしてあなたがあなたの質問に対する正しい答えを得る前に(それがあればいいのですが)あなたはこれを試すことができます:

<button onclick="foo()">ShowHTML</button>
<script>
(function foo(){
    var b=function moo(){
        var c=document.getElementsByTagName('script');
        alert(document.body.innerHTML);
        c[0].parentElement.removeChild(c[0]);
        alert(document.body.innerHTML);
    }
    var a=setTimeout(b,1000);
    b=null;
})();
foo=null;
</script>

これは単なるテストコードですが、問題をどのように解決できるかというアイデアが含まれています。DOMから削除<sript>され、最後の行でスクリプトのすべての機能が破棄されます。

(コードには少し詳細があり、どのように議論されても、それsetTimeoutはうまくいくことを示しています...?)eval()

于 2012-02-27T20:38:09.853 に答える
2

できることは、スクリプトがロードされた直後にスクリプトを削除することです。

var nowDate = new Date().getTime();
var url = val.redirect_uri + "notify.js?nocache=" + nowDate + "&callback=dummy";
var script = document.createElement('script');
script.src = url;
script.onload = function( evt ) {
    document.body.removeChild ( this );
}
document.body.appendChild(script);

とにかく、本文よりもヘッダー(他のすべてのスクリプトが存在する場所)にスクリプトを追加する方が良いと思います。

于 2013-03-19T09:56:28.900 に答える
1

JSONPとjQueryを使用する場合は、ポストクリーンアップを行うjQueryのJSONP読み込み機能を最大限に活用してみませんか?このようにJSONPリソースをロードしても、DOMに痕跡は残りません。

$.ajax({ url: 'http://example.com/', dataType: 'jsonp' })

ロードに使用された<script>タグは、ロードされるとすぐに削除されます。ロードが成功した場合。一方、失敗したリクエストは自動的にクリアされないため、次のような方法で自分でクリアする必要があります。

$('head script[src*="callback="]').remove();

適切なタイミングで呼び出されます。保留中のJSONP<script>タグをすべて削除します。

于 2012-02-27T22:18:01.307 に答える
1

スクリプト要素を作成するときに、スクリプト要素にIDを追加するだけです。

このようにして、ソースに一致するすべての「script」タグを繰り返す必要はありません。代わりに、

const script = document.createElement("script");

script.src = "SOME_SCRIPT";
script.id = 'SOME_ID';

document.body.append(script);

その後、削除します

const scriptElem = document.getElementById('SOME_ID'); 
scriptElem.remove()

何人かの男がここでスクリプトタグにIDを追加しても大丈夫な理由を説明しています https://stackoverflow.com/a/2741488/13156886

于 2021-01-26T13:11:05.180 に答える
0

ええと、
イベントによってトリガーされたajax呼び出しのために、私は同じニーズを得ました。最も早い呼び出しが後で戻って、最後の呼び出しによって入力されたドキュメントを上書きする場合があります。

removeChild(scriptEl) 動作しません。属性の変更srcも機能しません。

が唯一の方法であり、サーバーの応答を制御できる場合jsonpは、追加されたものを区別してコールバックに戻すことができます。

timestampパラメータを渡して、コールバックで確認するだけです

//callback
function dummy(res, ts) {
 if(YAHOO.util.Selector.query('script[id='scriptIdPrefix+ts+']').length>0) {
     do your job
 } else {
     do nothing
 }
}

//add script
var scriptIdPrefix='myScriptId';
function ajaxCall() {
    var timestamp = new Date().getTime();
    var scriptId = scriptIdPrefix+timestamp;
    //remove the previous script el
    s=YAHOO.util.Selector.query('script[id^='+scriptIdPrefix+']');
    if(s.length>0) {
        document.body.removeChild(s[0]);
    }
    var script = document.createElement('SCRIPT');
    script.id = scriptId;
    script.type = 'text/javascript';
    script.src = 'http://server/notify.js&callback=dummy&ts='+timestamp;
    document.body.appendChild(script);

}

notify.jsそれに応じてサーバーの結果を組み立てます。

dummy([{"datax":"x","datay":"y"}], 1369838562792)

このようにして、パラメトリックIDを持つこのようなスクリプト要素が1つだけ作成されます

<script id="myScriptId1369838562792" type="text/javascript"  
src="http://server/notify.js?callback=dummy&ts=1369838562792"></script>
于 2013-05-29T15:01:16.597 に答える
0

最も簡単な方法。

document.scripts.s16483498357511596685.remove();

于 2019-03-18T14:05:28.200 に答える
-2
var flag1=0,flag2=0;
$(window).resize(function(){
    if ($(window).width() < 480){
        flag1++;
        console.log(flag1);
        flag2=0;  
    }
    else 
        if($(window).width() > 480){
            flag2++;
            console.log(flag2);
            flag1=0;
        }   
    if(flag1==1){
        $("body").append("<script class='abc' src='custom.js'/>");
    }
    else
        if(flag2==1){
            $(".abc").remove();
        }
});
于 2017-07-26T06:57:56.083 に答える