2016-04-30 3 views
0

Это мой первый вопрос JS. У меня есть эта функция, которая находится внутри setInterval. Таким образом, эта функция повторяется.JavaScript - innerHTML не запускается независимо в setInterval

function chooseAnswer() { 
correct.onclick = function() { 
    if (range == 0) { 
     score++; 
     isGameOver = false; 
    } 
    else { 
     isGameOver = true; 
    } 
} 

incorrect.onclick = function() { 
    if (range != 0) { 
     score++; 
     isGameOver = false; 
    } 
    else { 
     isGameOver = true; 
    } 
} 

// Display score 
displayScore.innerHTML = score; 
} 

Все работает отлично, за исключением оценки (innerHTML) не обновляется сразу после того, как onlick срабатывает. Он ждет до следующего раунда интервала времени для обновления. Однако, если я перееду

displayScore.innerHTML = score; 

и поставить его сразу после

score++; 

в любом из, если заявление, счет будет обновляться сразу после того, как onlick срабатывает. Почему это происходит? Не работает ли эта функция независимо от setInterval? То есть, это линия выполняет по линии, так что

displayScore.innerHTML = score; 

обновит сразу же, не придется ждать до следующего раунда.

+0

Как у вас установлен setInterval()? – jeff

+0

Непонятно, почему - в вашем первом блоке кода вы думаете, что 'displayScore.innerHTML = score;' будет обновлять 'displayScore' сразу после щелчка. Если происходит щелчок, выполняется только код в обратном вызове. 'correct.onclick = function() {....}', не приостанавливает выполнение, он устанавливает обратный вызов 'onclick' для элемента. –

+0

Это просто простой наборInterval, window.setInterval (selectAnswer, 5000), который находится прямо над моей функцией selectAnswer(). –

ответ

0

Это больше комментарий, но потому что это долго я буду писать здесь:

Это не связано с continue в цикле. Когда вызывается chooseAnswer, независимо от того, вручную или по setInterval. Затем три инструкции выполняются:

  1. назначение обратного вызова для correct.onclick
  2. назначение обратного вызова для incorrect.onclick
  3. displayScore.innerHTML = score;

Сами обратные вызовы только хранятся в onclick в то время , но в данный момент они не выполняются/не оцениваются. Только в то время, когда вы нажимаете на correct или incorrect, тогда браузер проверяет, сохраняется ли обратный вызов в onclick, и если он есть, то он будет выполнен. Но этот обратный вызов содержит только этот код:

function() { 
    if (range == 0) { 
    score++; 
    isGameOver = false; 
    } else { 
    isGameOver = true; 
    } 
} 

следующий код эквивалентен вашему, но с другой структурой и может быть более понятным:

function correctCallback() { 
    if (range == 0) { 
    score++; 
    isGameOver = false; 
    } else { 
    isGameOver = true; 
    } 
} 

function incorrectCallback() { 
    if (range != 0) { 
    score++; 
    isGameOver = false; 
    } else { 
    isGameOver = true; 
    } 
} 

function chooseAnswer() { 
    correct.onclick = correctCallback; //correctCallback is not call but just assigned to correct.onclick 
    incorrect.onclick = incorrectCallback; //incorrectCallback is not call but just assigned to correct.onclick 

    // Display score 
    displayScore.innerHTML = score; 
} 

Дальше больше не имеет смысла перезаписывать onclick в интервале снова и снова.

+0

Я думаю, мой вопрос в том, что происходит ПОСЛЕ того, как нажата одна из кнопок? Когда будет «выполненная линия»? –

+0

@PhuLe Что вы имеете в виду с 'выполненной линией' и с' Когда будет выполняться строка 'be'?Механизм JavaScript ожидает ввода любого пользователя, если клик происходит на элементе, механизм JavaScript проверяет, есть ли функция обратного вызова, зарегистрированная для этого события, и будет выполнять эти функции обратного вызова, а затем снова будет ждать ввода или выполнения другой код, который был поставлен в очередь с использованием 'setTimeout' или' setInterval'. Но обработка событий происходит после выполнения 'selectAnswer'. –