Функция JavaScript иногда не определена - PullRequest
0 голосов
/ 29 января 2012

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

На моем веб-сайте http://euphoricsoftware.com/ есть необычный сценарий обратного отсчета для автоматического перехода на обычный сайт, в отличие от мобильного или с низкой пропускной способностью.Сценарий работает в любом браузере с <body onload="setTimeout(countDown(8),1000);"> (где 8 - это число, с которого начинается), за исключением того, что иногда в Chrome обратный отсчет не перемещается, и при открытии консоли JS отображается Uncaught ReferenceError: countDown is not defined.

Также на странице есть кнопка, которая позволяет приостановить и возобновить обратный отсчет.Возобновление вызывает также функцию countDown(), и даже когда неопределенная ошибка возникает при загрузке, если вы дважды нажмете кнопку, обратный отсчет сработает, так что, похоже, это как-то связано с onload.

Вот кодЯ использовал (формат кода SO немного увеличил расстояние):

<html>
<head>
    <!-- ... -->
    <script type="text/javascript">
    var stopRedirect = false;
    var back = 0;

    function redirect()
    {
        if (!stopRedirect) {window.location = "home.html";}
    }
    function countDown(num)
    {
        if (!stopRedirect)
        {
            back = num-1;
            if (num < 10)
            {
                document.getElementById("top").innerHTML=num+1;
            }
            document.getElementById("middle").innerHTML=num;
            if (num > 1)
            {
                document.getElementById("bottom").innerHTML=num-1;
                var t = setTimeout("countDown("+(num-1)+")",1000);
            }
            else
            {
                document.getElementById("bottom").innerHTML="&nbsp;";
                document.getElementById("unit").innerHTML=" second&nbsp;";
                var r = setTimeout("redirect()",1000);
            }
        }
    }

    function stop()
    {
        if (!stopRedirect)
        {
            stopRedirect = true;
            document.getElementById("stop").style.display="none";
            document.getElementById("start").style.display="block";
        }
    }
    function start()
    {
        if (stopRedirect)
        {
            stopRedirect = false;
            document.getElementById("stop").style.display="block";
            document.getElementById("start").style.display="none";
            var c = setTimeout("countDown("+(back)+")",1000);
        }
    }
</script>
</head>
<body onLoad="setTimeout(countDown(8),1000);">
    <!-- ... -->

, и вы можете увидеть сайт в действии на http://euphoricsoftware.com/
Кто-нибудь знает, почему это происходит?Спасибо

1 Ответ

1 голос
/ 29 января 2012

Я не совсем уверен, почему вы получаете эту ошибку, учитывая, что ваша функция определена в <head>, и вы не пытаетесь использовать ее до onload тела, но ваш код имеет проблема. Эта часть из вашего onload="":

setTimeout(countDown(8),1000);

будет, когда onload произойдет и код будет запущен, немедленно вызовет функцию countDown() , передав параметр 8, а затем возьмет все, что возвращает эта функция, и передаст setTimeout() будет выполнено за 1 секунду. В вашем случае ваша функция не возвращает определенное значение, поэтому в действительности вы передаете undefined в setTimeout().

То, что вы хотите сделать, это передать setTimeout() ссылку на функцию или строку.

Вы не можете передать ссылку на countDown() напрямую одновременно с передачей параметра для этой функции (по крайней мере, не с синтаксисом setTimeout(), который будет работать в IE), поэтому вам потребуется оберните это в анонимную функцию как это:

onload="setTimeout(function() { countDown(8); }, 1000);"

Или вы можете использовать строковый формат, аналогичный вашему countDown() телу функции (используя одинарные кавычки, поскольку атрибут onload в настоящее время использует double):

onload="setTimeout('countDown(8);', 1000)"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...