2016-10-01 3 views
0

Я использую этот скрипт для замены некоторого текста на моей странице.Остановить javascript от цикла

function initChangeText() { 
    var time = 2; 
    setInterval('changeText();', time * 1000); 
} 

function changeText() { 
    var divs_ = document.getElementsByTagName("div") 
    for (var i = 0; i < divs_.length; i++) 
    if (divs_[i].className == "change") 
     changeULText(divs_[i]);  
} 

function changeULText(obj) { 
    var ul = obj.getElementsByTagName("ul")[0]; 
    var li = obj.getElementsByTagName("li"); 
    for (var i = 0; i < li.length; i++) { 
    if (li[i].className == "show") { 
     li[i].className = ""; 
     li[(i + 1) % li.length].className = "show"; 
     return; 
    } 
    } 
} 
window.onload = initChangeText; 

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

Как это сделать?

+1

звучит, как вы должны использовать 'setTimeout' вместо' setInterval' –

+0

Вы должны избегать прохождения 'string' значение' 'setTimeout' или setInterval' функции, как объяснено [HTTP://stackoverflow.com/a/5801700/6832715](http://stackoverflow.com/a/5801700/6832715) –

ответ

3

Это:

function initChangeText() { 
    var time = 2; 
    setInterval('changeText();', time * 1000); 
} 

вызывает скрипт каждый второй. Удалить эту функцию и изменить window.onload = initChangeText; к window.onload = changeText;

0

window.onload = changeText;
или, если вы хотите сохранить первоначальный тайм-аут: заменить setInterval с setTimeout.

1

Как Crayon Violent говорит в комментарии, вы должны использовать setTimeout вместо setInterval.

С Mozilla Developer Network:

  • setTimeout:

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

  • setInterval:

    Многократно вызывает функцию или выполняет фрагмент кода, с фиксированной задержкой по времени между каждым вызовом. Возвращает интервалID.

Вы также можете очистить setInterval после определенного периода времени, или после нескольких циклов с использованием счетчика.

После периода времени
Допустим, вы хотите выполнить цикл в течение 3000 мс. Тогда вы могли бы сделать:

function initChangeText() { 
    var time = 2; 
    // Store the id to be able to clear it 
    var intervalId = setInterval('changeText();', time * 1000); 
    // Clear the interval 3000 ms after the interval started 
    setTimeout(function() {window.clearInterval(intervalId);}, time * 1000 + 3000); 
} 

function changeText() { 
    // remains the same 
} 

function changeULText(obj) { 
    // remains the same 
} 
window.onload = initChangeText; 

После ряда петель
Допустим, вы хотите выполнить свой цикл ровно в 6 раз. Вы можете сделать:

var loopCount = 0; // Initialize a global counter 
var intervalId; // Store the ID in the global scope 
function initChangeText() { 
    var time = 2; 
    intervalId = setInterval('changeText();', time * 1000); // Stores the ID 
} 

function changeText() { 
    // Add an if statement to clear the intervalId when 
    // the loopCount reaches the limit of 6 repetitions 
    if(++loopCount >= 6 && intervalId) { 
    window.clearInterval(intervalId); 
    } 
    // rest of the function remains the same 
} 

function changeULText(obj) { 
    // remains the same 
} 
window.onload = initChangeText; 
Смежные вопросы