2010-03-23 2 views
2

Допустим, я это сделать:Javascript - Jquery .load() и setInterval() вопрос

$("#content").load(...); 

В чем я загружаю некоторые JavaScript включен:

var myCounter = 0; 
var myInterval = setInterval(function(){ 
    myCounter++; 

    $("#counter-display").html("Count: "+myCounter); 
}); 

По неизвестной причине , если я перезагружу контент с помощью $ ("# content"). load (...); - myInterval теперь вызывается дважды.

Я пытался сделать что-то вроде:

if (myInterval !== undefined){ 
    //dont set interval again 
} 

Однако, это не работает. Кто-нибудь знает какой-либо метод, так что myInterval очищается на .load, без необходимости помещать javascript за пределы загруженного файла?

ответ

2

Попытайтесь держать интервал и сосчитать в объект данных на счетчик элемента, например:

var disp = $("#counter-display"); 
if(!disp.data("interval")) { 
    disp.data("interval", setInterval(function() { 
    var count = (disp.data("count") || 0) + 1; 
    disp.data("count", count).html("Count: " + count); 
    }, 500)); 
} 

Немного больше кода один раз, но гораздо чище для глобальных переменных и т.д.

+0

Я думал о том, чтобы сделать это изначально, но я хотел попробовать метод без необходимости извлекать значение из html каждый раз. Однако это лучше работает, поэтому я буду использовать это. Благодаря! – Joe

+0

После дальнейшего тестирования, хотя этот метод слова, чтобы обновить подсчет, при попытке использовать этот счет внутри скрипта, он все еще удваивается. Я не мог найти никакого решения, кроме как разместить мой сценарий OUTSIDE загруженного содержимого (например, на странице, где я делаю .load()). – Joe

+0

@Joe: Вероятно, вы снова создаете элемент '@ counter-display'. Поместите данные в элемент, который не будет заменен. – SLaks

0

Ваш код выполняет дважды.

Попробуйте проверить if (typeof myInterval !== "undefined") перед объявлением переменной.

+0

Протестировано - не работает. Кажется, каждый «myInterval» фактически обрабатывается отдельно в DOM. – Joe

+0

Является ли ваш код функцией? – SLaks

+0

Да. В любом случае решение Ника Крейвера отлично работает. – Joe

0

Вы» Вероятно, вы обнаружите, что myInterval определяется в некоторой локальной области.

Попробуйте использовать:

var myCounter = 0; 
myInterval = setInterval(function(){ 
    myCounter++; 

    $("#counter-display").html("Count: "+myCounter); 
}); 

myInterval теперь будут объявлены в глобальном масштабе.

Вы можете, конечно, использовать clearInterval, и сделать clearInterval(myInterval), который также обеспечит только, например, интервал в использовании.

+0

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

+0

Переменная объявляется глобальной, если не используется оператор var. 'myInterval = ....' делает myInterval глобальным; почти эквивалентный 'window.myInterval = ...' – Matt

Смежные вопросы