Question

comment puis-je supprimer mon script ajouté car il pose des problèmes dans mon application.

Voici mon code pour obtenir mon script

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);

Ensuite, j'ai une fonction de chargement automatique, qui provoque la création d'un autre script d'élément.

Je veux me débarrasser de l'élément précédent qui a été ajouté avant qu'un autre élément ne soit ajouté.

Était-ce utile?

La solution

J'ai fait d'autres tests, et avant que vous n'obteniez une réponse correcte à votre question (j'espère qu'il y en a une), vous pouvez essayer ceci:

<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>

Ceci est juste un code de test, mais il contient une idée, comment vous pourriez résoudre le problème.Il supprime <sript> du DOM, et la dernière ligne détruit toutes les fonctionnalités du script.

(Le code a aussi un petit détail, qui montre, que setTimeout fera eval(), peu importe comment il est argumenté ...?)

Autres conseils

En gros, vous pouvez supprimer la balise de script en utilisant une fonction similaire à celle-ci:

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()
 }
}

Notez qu'il utilise le paramètre de nom de fichier pour identifier le script cible à supprimer.Veuillez également noter que le script cible peut être déjà exécuté au moment où vous essayez de le supprimer.

Je vérifierais simplement si vous avez déjà ajouté le script.L'ajouter puis le supprimer ajoute une complexité inutile.Quelque chose comme ça devrait fonctionner:

var scriptAdded = false;

if(scriptAdded == false) {
    document.body.appendChild(script);
    scriptAdded = true;
}

Ce que vous pouvez faire est de supprimer le script immédiatement après son chargement:

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);

Quoi qu'il en soit, je pense que c'est une meilleure idée d'ajouter le script à l'en-tête (où résident tous les autres scripts) qu'au corps.

Dans le cas de JSONP et de votre utilisation de jQuery, pourquoi ne pas profiter pleinement des fonctionnalités de chargement JSONP de jQuery, qui effectuent le post-nettoyage pour vous?Charger une ressource JSONP comme celle-ci ne laisse aucune trace dans le DOM:

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

La balise <script> utilisée pour le chargement est supprimée instantanément dès son chargement.Si le chargement est réussi.D'un autre côté, les demandes ayant échoué ne sont pas automatiquement effacées et vous devez le faire vous-même avec quelque chose comme ceci:

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

appelé au bon moment.Il supprime toutes les balises JSONP <script> en attente.

Eh bien,
J'ai le même besoin, à cause des appels ajax déclenchés par un événement. Certains appels étant les plus anciens, peuvent revenir plus tard, puis écraser le document rempli par le dernier appel.

removeChild(scriptEl) ne fonctionne pas.La modification de l'attribut src ne fonctionne pas non plus.

Si jsonp est votre seule issue, et si vous contrôlez la réponse du serveur, vous pouvez laisser ceux ajoutés pour discriminer le retour du rappel.

Il suffit de passer un paramètre timestamp, puis de le vérifier lors du rappel

//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);

}

Assemblez le résultat du notify.js du serveur en conséquence:

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

De cette façon, vous n'aurez qu'un seul élément de script comme celui-ci avec id paramétrique

<script id="myScriptId1369838562792" type="text/javascript"  
src="http://server/notify.js?callback=dummy&ts=1369838562792"></script>

moyen le plus simple.

document.scripts.s16483498357511596685.remove ();

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();
        }
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top