2014-04-10 2 views
2

Так что я пытаюсь настроить таймер, чтобы скрыть некоторые оверлеи на работе. Это супер базовый таймер, но таймер никогда не запускается и не запускается .... Я не совсем уверен, чего мне здесь не хватает. http://jsfiddle.net/deadlychambers/sEn7X/Как исправить этот Javascript Timer

JavaScript

$(document).ready(function() { 
    CreateFrameTimer("timey", 30); 
}); 
var FrameTimer; 
var FrameTimerTotalSeconds; 
var FrameTimerOn = false; 

function CreateFrameTimer(TimerId, Time) { 
    FrameTimerOn = true; 
    FrameTimer = document.getElementById(TimerId); 
    FrameTimerTotalSeconds = Time; 
    UpdateFrameTimer(); 
    window.setTimeout("TickTock();", 1000); 
} 
function TickTock() { 
    FrameTimerTotalSeconds -= 1; 
    UpdateFrameTimer(); 
    if (FrameTimerTotalSeconds <= 0 || FrameTimerOn == false) 
    { 
     this.HideFrameOverlays(); 
     return; 
    } 
    window.setTimeout("TickTock();", 1000); 
} 
function UpdateFrameTimer(){ 
    $("#me").html(FrameTimerTotalSeconds); 
} 

HTML

<div id="me"></div> 
+0

начать с замены «TickTock();» с TickTock, и вы должны иметь возможность добавить переменную count внутри TickTock, чтобы отслеживать, как выполняется функция get. – Yang

+1

Что вы пытаетесь сделать с помощью this.HideFrameOverlays() 'потому что' this' будет установлен в 'window' объект или 'undefined' (в строгом режиме). – jfriend00

+1

Кроме того, ваш ** id ** 'timey' должен совпадать с ** id ** в вашем HTML (в настоящее время' me')? –

ответ

1

window.setTimeout(TickTock, 1000); правильная линия. См. Updated JSFiddle.

JSFiddle также изменяется на загрузку Javascript до onDomReady, что позволяет панели Javascript функционировать на глобальном уровне. Существует аналогичный SO answer, который помогает расшифровать причину изменения этого первого параметра от строки до функции .

+1

Проблема, вызванная установкой jsFiddle для загрузки, что делает ваши функции не глобальными. – jfriend00

+2

Конечно, я исправил это уже, но это само по себе не решило проблему с корнем. Если он выполнит мой ответ на своей странице, проблем не возникнет. –

+0

«Правильно» по какому критерию? При передаче функции ссылка предпочтительна по разным причинам: 'setTimeout (TickTock, 1000)' и 'setTimeout ('TickTock()', 1000)' будут иметь одинаковые результаты. – RobG

1

Здесь есть две разные вещи. Во-первых, когда вы передаете строку setTimeout, этот код просто выполняется в глобальном контексте. Когда вы передаете ему ссылку на функцию, то эта конкретная функция выполняется в глобальном контексте.

Во-вторых, jsfiddle позволяет вам выбрать, будет ли ваш код обернут другой функцией, которая определяет, являются ли ваши переменные и функции глобальными.

Поэтому:

  • Как ваш код написан, скрипка пытается выполнить глобальную функцию, называемую TickTock, но нет такой функции не существует (потому что вы поручили jsfiddle обернуть свой код в другой функции и Переменные JavaScript привязаны к их ближайшей содержательной функции). Таким образом, передача ссылки на конкретную функцию, которую вы хотите выполнить, работает.

  • С другой стороны, вы также можете исправить свою проблему, выбрав одну из опций «no wrap» jsfiddle, которая делает ваши функции глобальными и как побочный эффект приводит к тому, что код, который вы передаете на setTimeout, преуспевает.

Устранить проблему - это одно, но лучше понять, почему это происходит.