Странная проблема с кодом JavaScript

Привет, мастера веб-разработки, во-первых, я хочу сказать, что я не поверил своим глазам - у меня есть кусок javascript, который отлично работает в IE7, и не работает в Firefox!!! :)))) Это была маленькая шутка. :) Итак, я уже рассказал вам о проблеме (это была не шутка), теперь я вставляю javascript:

<script type="text/javascript">

<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!! http://javascript.internet.com -->

<!-- Begin
var ms;
ms = %%CONTENT_REFRESH%% - 5;
var stop;
stop = 0;
var myvalue;

function display() {
    if (!stop) {
        setTimeout("display();", 1000);
    }
    thetime.value = myvalue;
}
function recalc() {
    var hours;
    var minutes;
    var seconds;

    ms = ms - 1;
    hours = Math.floor(ms / 3600);
    minutes = Math.floor(ms / 60);
    if (minutes < 10) {
        minutes = "0"+minutes;
    }
    seconds = ms - (minutes*60) - (hours*3600);
    if (seconds < 10) {
        seconds = "0"+seconds;
    }
    myvalue = hours+":"+minutes+":"+seconds;
    thetime.value = myvalue;
    if (myvalue == "0:00:00") {
        stop = 1;
    }
    if (!stop) {
        setTimeout("recalc();", 1000);
    }
}
// End -->
</SCRIPT>

Это очень старый сценарий, я это знаю. Это занимает мое текущее оставшееся время песни, из моего винампа и обратного отсчета на сайте. Но, как я уже сказал, это не работает в Firefox.

Тело и код, вызывающий таймер обратного отсчета, выглядят так:

<body class="playlist_body" onLoad="recalc();display();">

Time Left In Song: <INPUT align="center" TYPE="text" Name="thetime" size=5 />

</body>

//Редактировать: я смотрю на FireBug и вижу следующую ошибку:

thetime is not defined
recalc()playlist.cgi (line 87)
function onload(event) { recalc(); display(); }(load )1 (line 2)
error source line: [Break on this error] thetime.value = myvalue;\n

person Spoonk    schedule 23.10.2009    source источник
comment
Получаете ли вы какие-либо ошибки в консоли Javascript Firefox или в консоли Firebug?   -  person jason    schedule 23.10.2009
comment
КАКОЙ ГЛУПОЙ Я БЫЛА ИНОГДА!!! Я забыл посмотреть в FireBug! Да, выдало ошибку. Я редактирую свой вопрос с ошибкой! Спасибо Джейсон! :)   -  person Spoonk    schedule 23.10.2009
comment
Так что же происходит, когда вы правильно определяете «время»?   -  person James Black    schedule 23.10.2009
comment
Вы должны прочитать stackoverflow.com/questions/1513286 /   -  person Esteban Küber    schedule 23.10.2009


Ответы (3)


Проблема в том, что он обращается к элементам DOM по имени.

Добавьте следующий код вверху, чтобы объявить переменную для элемента thetime, добавьте id="thetime" к INPUT и добавьте вызов init(); в onload в элемент body.

var thetime;

function init() {
    thetime = document.getElementById('thetime');
}

Кстати, вы можете заменить текстовое поле обычным элементом DIV, установив идентификатор div на thetime и заменив thetime.value на thetime.innerHTML.

Кроме того, setTimeout лучше вызывать с помощью функции, а не строки; вы должны заменить "display();" и "recalc();" на display и recalc соответственно.

person SLaks    schedule 23.10.2009
comment
Что ж... это выглядит умным решением, но... оно ни о чем мне не говорит. Если... я могу попросить вас написать это мне... - person Spoonk; 23.10.2009
comment
Что происходит, когда вы пытаетесь? Убедитесь, что вы добавили init(); в начало onload=. - person SLaks; 23.10.2009
comment
ПРОКЛИНАТЬ!!! Раньше это не работало, потому что я добавил init(); после пересчета и отображения! Теперь, когда вы сказали мне добавить его в начале, он работает ПРОСТО ОТЛИЧНО!!! Большое спасибо! :)) - person Spoonk; 23.10.2009

В IE есть «функция», в которой элемент с атрибутом имени помещается в объект окна, например.

<div name=foo></div>

Дает вам переменную "foo" - это нестандартно, вы должны сделать

document.getElementByName("foo") 

Чтобы получить элемент вывода таймера.

person olliej    schedule 23.10.2009
comment
Это будет document.getElementsByName(foo)[0]. getElementByName не является функцией - person Mike Blandford; 23.10.2009
comment
Я ничего не понял... Я новичок в этом... :( - person Spoonk; 23.10.2009

var thetime = document.getElementById("thetime");

и добавьте id="thetime" вместо просто name="thetime" на вход

person Mike Blandford    schedule 23.10.2009
comment
Это не удастся, потому что элемент еще не выйдет. - person SLaks; 23.10.2009
comment
это зависит от того, где вы это делаете. - person Mike Blandford; 23.10.2009