почему этот код JavaScript не работает вообще? - PullRequest
2 голосов
/ 18 ноября 2011
  function help(n){

    document.write(n + '<br/>');
    if(n==10){ n=1;}
    n++;

    main(n);
 }

 function main(n){

  setTimeout('help(n)',500);

 }

Я хочу напечатать

1 2 3 4 5 6 7 8 9 10

, а затем снова

1 2 3 4 5 6 и т. Д.

через 0,5 секунды

Я хочу сделать это с помощью метода setTimeout, но этот подход не работает вообще

Мой элемент тела похож на это

<body onload='main(1)'>

Может кто-нибудь объяснить мне, почему?

Редактировать : Я изменил метод foo, чтобы помочь.Я сделал ошибку при редактировании своего кода, чтобы опубликовать этот вопрос.

Ответы [ 5 ]

3 голосов
/ 18 ноября 2011

Я полагаю, что причина, по которой вы можете получить:

попытка запустить скрипт compile-and-go в очищенной области

в Firebug, связана с использованиемdocument.write() после загрузки страницы.Это также представляется новой ошибкой Firebug JS.

После первоначального запуска вы пишете в документ после того, как вам это разрешено.Я попытался использовать document.open() и document.close(), и добавление обоих не решило проблему.

Хотя есть и лучшие способы.Вы можете использовать это для замены body содержимого:

document.body.innerHTML = n + '<br/>;

Или это, чтобы добавить к нему:

document.body.innerHTML += n + '<br/>;

Или это (что я бы порекомендовал):

var div = document.createElement('div');
div.innerHTML = n + '<br/>';
document.body.appendChild(div);

Обратите внимание, не используйте setTimeout('help(n)',##), так как это eval() код для вызова функции, что является плохой практикой.Также избегайте второго примера, приведенного выше, поскольку в некоторых браузерах могут возникать проблемы с производительностью из-за способа, которым .innerHTML добавляется к узлу.Следовательно, это еще одна плохая практика, которую следует избегать.

Далее следует демонстрация третьего метода.

function help(n){
    var div = document.createElement('div');
    div.innerHTML = n + '<br/>';
    document.body.appendChild(div);

    if (n == 10) {
        n = 1;
    }

    n++;

    main(n);
}

function main(n){
    setTimeout(function(){
        help(n);
    }, 500);
}

main(5);

http://jsfiddle.net/be6He/1

1 голос
/ 18 ноября 2011
function main(n){  
    setTimeout(help,500,n);
}

или для полной совместимости с IE:

 function main(n){  
    setTimeout(function(){
        help(n);
    },500);
}
0 голосов
/ 18 ноября 2011

n больше не находится в области действия при выполнении функции справки. Ваш main должен сделать что-то вроде:

function main(n) {
    window.setTimeout(function() {
        help(n);
    }, 500);
}
0 голосов
/ 18 ноября 2011

setTimeout принимает ссылку на функцию, а не строку. Попробуйте что-то вроде:

function main(n)
{
  setTimeout(function () {
     help(n);
   }, 500);
}

EDIT:

setTimeout может принять строку, но эта функция не будет запущена при закрытии main, а n выйдет из области видимости. Кроме того, настоятельно рекомендуется использовать ссылку на функцию, как в примере выше.

0 голосов
/ 18 ноября 2011

Ваш setTimeout вызывает несуществующую функцию, foo().

...