2012-04-19 5 views
0

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

Как я могу сохранить переменную url, чтобы сохранить ее значение?

 <a id="" onClick="doTimer('http://www.domain.com/downloadfile.php?photo=foo.jpg')" href="#"><button id="download">Download this photo</button></a> 

     var timer_is_on=0; 
     var countdownfrom=5 
     var currentsecond=document.getElementById('countdown').innerHTML=countdownfrom+1 

     function countredirect(url) 
     { 
      if (currentsecond!=1) 
      { 
       currentsecond-=1 
       document.getElementById('countdown').innerHTML = currentsecond; 
      } 
      else 
      { 
       window.location=url 
       return 
      } 
      setTimeout("countredirect()",1000) 
     } 
     function doTimer(url) 
     { 
      if(!timer_is_on) 
      { 
       document.getElementById('download').innerHTML="Your download starts in <span id=\"countdown\"></span>seconds"; 
       timer_is_on=1; 
       countredirect(url) 
      } 
     } 
+0

Какая переменная не определена? – JJJ

+3

** Никогда ** передайте строку 'setInterval()' или 'setTimeout()'. Это так же плохо, как использование 'eval()', и это приводит к нечитаемому и, возможно, небезопасному коду, как только вы используете переменные, так как вам нужно вставить их в строку вместо передачи фактической переменной. Правильным решением является 'setInterval (function() {/ * ваш код *)}, msecs);'. То же самое относится к 'setTimeout()'. Если вы просто хотите вызвать одну функцию без каких-либо аргументов, вы также можете передать имя функции напрямую: 'setInterval (someFunction, msecs);' (обратите внимание, что в имени функции нет ** ** '()') – ThiefMaster

+0

Переназначение URL-адреса, которое я использую в функции дотимера. – 9edge

ответ

5
setTimeout("countredirect()",1000) 

Вы не пропуская ни одного аргумента в вашей countredirect функции.

Передача строк в setTimeout и setInterval - это, как правило, плохая идея (дает вам всевозможные проблемы с областью). Передайте функцию вместо:

setTimeout(function() { 
    countredirect(url); 
}, 1000); 

В новых браузерах (или с подкладкой), вы можете также использовать .bind()[MDN] (bind возвращает новую функцию):

setTimeout(countredirect.bind(null, url), 1000); 
0

Альтернативный подход к повторной планирования вашей функции:

setTimeout(countredirect.bind(null, url), 1000); 
Смежные вопросы