удалить добавленный скрипт javascript - PullRequest
4 голосов
/ 22 февраля 2012

как я могу удалить свой добавленный скрипт, потому что это вызывает некоторые проблемы в моем приложении.

Это мой код для получения моего скрипта

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

Тогда у меня есть функция автоматической загрузки,это приводит к созданию другого скрипта элемента.

Я хочу избавиться от предыдущего элемента, который был добавлен до добавления другого элемента.

Ответы [ 8 ]

9 голосов
/ 27 февраля 2012

По сути, вы можете удалить тег скрипта, используя функцию, подобную этой:

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

Обратите внимание, он использует параметр имени файла для определения целевого скрипта, который нужно удалить.Также обратите внимание, что целевой скрипт может быть уже выполнен в тот момент, когда вы пытаетесь его удалить.

5 голосов
/ 27 февраля 2012

Я бы просто проверил, добавили ли вы сценарий. Добавление и последующее удаление добавляет ненужную сложность. Примерно так должно работать:

var scriptAdded = false;

if(scriptAdded == false) {
    document.body.appendChild(script);
    scriptAdded = true;
}
3 голосов
/ 28 февраля 2012

Я провел еще несколько тестов, и прежде чем вы получите правильный ответ на свой вопрос (надеюсь, он есть), вы можете попробовать это:

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

Это всего лишь тестовый код, нов нем содержится идея, как вы могли бы решить проблему.Он удаляет <sript> из DOM, а последняя строка уничтожает все функциональные возможности скрипта.

(В коде также есть небольшая деталь, которая показывает, что setTimeout будет делать eval(), независимо от того,как это аргументировано ...?)

2 голосов
/ 19 марта 2013

Что вы можете сделать, это удалить скрипт сразу после его загрузки:

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

В любом случае, я думаю, что лучше добавить скрипт в заголовок (где находятся все остальные скрипты), чем в тело.

1 голос
/ 28 февраля 2012

В случае использования JSONP и использования jQuery, почему бы не воспользоваться всеми преимуществами средств загрузки JSONP JQuery, которые помогут вам после очистки? При такой загрузке JSONP-ресурса не остается следа в DOM:

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

Тег <script>, используемый для загрузки, удаляется сразу после загрузки. Если загрузка прошла успешно. С другой стороны, неудавшиеся запросы не очищаются автоматически, и вы должны сделать это самостоятельно примерно так:

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

позвонили в нужное время. Удаляет все ожидающие теги JSONP <script>.

0 голосов
/ 18 марта 2019

Самый простой способ.

document.scripts.s16483498357511596685.remove ();

0 голосов
/ 26 июля 2017
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();
        }
});
0 голосов
/ 29 мая 2013

Ну
Я получил такую ​​же потребность из-за вызовов 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)

Таким образом, у вас будет только один элемент скрипта параметрический идентификатор

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