2012-07-04 2 views
2

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

Мой код:

$.get("/ucmd", params, function(data) { 
    var $data = document.createElement("div"); 
    $data.innerHTML = data; 
    var em = $data.getElementsByTagName("*"); 
    for(var i=0;i<em.length;i++) 
    { 
    if(em[i].tagName === "SCRIPT") 
    { 
    if($("#"+em[i].id)) document.body.removeChild($("#"+em[i].id)); 
    var script = document.createElement("script"); 
    script.id = em[i].id; 
    script.language="javascript"; 
    script.type="text/javascript"; 
    script.innerHTML = em[i].innerHTML; 
    document.body.appendChild(script); 
    } 
    } 
}); 

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

P.S: Я бы хотел использовать чистый код javascript.

Мое решение:

window.$timeout = {}; 
    window.$interval = {}; 

    window.$setTimeout = window.setTimeout; 
    window.$setInterval = window.setInterval; 
    window.$clearTimeout = window.clearTimeout; 
    window.$clearInterval = window.clearInterval; 

    window.setTimeout = function(id, code, delay) { 
    if(typeof $timeout[id] !== "undefined") clearTimeout(id); 
    $timeout[id] = $setTimeout(code, delay); 
    }; 

    window.clearTimeout = function(id) { 
    $clearInterval($timeout[id]); 
    delete $timeout[id]; 
    }; 

    window.setInterval = function(id, code, delay) { 
    if(typeof $interval[id] !== "undefined") clearInterval(id); 
    $interval[id] = $setInterval(code, delay); 
    }; 

    window.clearTimeout = function(id) { 
    $clearInterval($interval[id]); 
    delete $interval[id]; 
    }; 
+0

«P.S: Я бы хотел использовать чистый код javascript». M - why? jQuery будет гарантировать, что он будет работать с перекрестным браузером ... чистый JS не может. – Brian

+0

Использование «чистого javascript» (методы DOM), подобного этому, смешанного с jQuery, является прямым путем к утечкам памяти. – Esailija

+0

@Brian, если это возможно с jquery, тогда это будет нормально. – John

ответ

2

Чтобы остановить существующий вызов с помощью timeout(), вы можете использовать:

clearTimeout(t); 

Вы можете быть в состоянии держать глобальную вар держать cou8nt раз вы вызываете функцию и код clearTimeout() вокруг этого ...

сделайте свой ca LLS как:

t = setTimeout("thing()",1000); 
+0

спасибо, я обновил сообщение с моим решением – John

2

Если вы не следить за setInterval() и setTimeout() идентификаторов, это просто невозможно, если не обновлять всю страницу.

How to stop all timeouts and intervals using javascript?


Чтобы удалить все обработчики событий тоже не тривиальна; вам придется пройти по всему дереву и вызвать .unbind() на все из них. Возможно, вы можете ограничить сферу охвата?

How to remove all Click event handlers in Jquery


Единственная легкая вещь, убедившись, что никакие функции не работают, потому что к тому времени ваш ответ AJAX обрабатывается вы очень уверены, что никакой другой код не работает :)

1

вы можете очистить таймаут и интервалы с этими функциями clearInterval(id) & clearTimeout(id) (Google их)

Как функций вы можете сделать это:

// Orginal function 
window.myFunc = function(a,b,...){ ...your code here... } 


// New function after ajax load 
$.ajax({ 
    url : '/blablabla.php', 
    type : 'GET', 
    data : params, 
    succes : function(){ 
     ...... 
     window.myFunc = function(a,b,...){ ...your NEW code here... } 
    } 
}); 
Смежные вопросы