Strano problema con il codice JavaScript
-
05-07-2019 - |
Domanda
Ciao maestri di sviluppo Web, per prima cosa voglio dire che non credevo nei miei occhi - ho un pezzo di javascript che funziona perfettamente su IE7 e non su Firefox !!! :)))) Era uno scherzo. :) Quindi ti ho già detto il problema (non era uno scherzo), ora sto incollando il 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>
Questo è uno script molto vecchio, lo so. Prende il tempo rimanente della mia canzone, dal mio winamp e dai conti alla rovescia sul sito. Ma come ho detto, non funziona in Firefox.
Il corpo e il codice che chiama il conto alla rovescia è simile al seguente:
<body class="playlist_body" onLoad="recalc();display();">
Time Left In Song: <INPUT align="center" TYPE="text" Name="thetime" size=5 />
</body>
// Modifica: guardo FireBug e ho visto il seguente errore:
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
Soluzione
Il problema è che sta accedendo agli elementi DOM per nome.
Aggiungi il codice seguente all'inizio per dichiarare una variabile per l'elemento thetime
, aggiungi id = " thetime "
a INPUT
e aggiungi una chiamata a init ();
in onload
nell'elemento body
.
var thetime;
function init() {
thetime = document.getElementById('thetime');
}
A proposito, puoi sostituire la casella di testo con un normale elemento DIV
impostando l'ID div
su thetime
e sostituendo thetime.value
con thetime.innerHTML
.
Inoltre, è meglio chiamare setTimeout con una funzione anziché una stringa; è necessario sostituire " display (); "
e " recalc (); "
con display
e recalc rispettivamente.
Altri suggerimenti
IE ha una funzione "quotata" dove un elemento con un attributo name è posizionato nell'oggetto window, ad es.
<div name=foo></div>
Ti darà una variabile " pippo " - questo non è standard, dovresti farlo
document.getElementByName("foo")
Per ottenere l'elemento di output del timer.
var thetime = document.getElementById("thetime");
e aggiungi id = " thetime " anziché solo name = " thetime " all'input