2013-06-29 4 views
0

Я не могу понять, где синтаксис логическая ошибка находится в сценарии, расположенном ниже. По сути, это то, что он предупреждает людей, что они должны ждать 1,5 секунды, прежде чем они смогут ответить на вопрос типа радиокнопки и автоматически перейти к следующей странице. Нет предупреждения, если они проводят более 1,5 секунд.функция внутри функции javascript логическая ошибка

Этот сценарий был написан только для события с одним щелчком мыши, но мне нужно, чтобы он работал для двух вложенных событий, когда нажатие на кнопку переключателя автоматически запускает кнопку «Далее», чтобы перейти к следующей странице. Например, если вы берете следующее событие (и его концевые кронштейны), он хорошо работает:

$("[class*=bfasg] .radio").click(function(){  

Я проверил синтаксис в Esprima, чтобы убедиться, что скобки являются правильными, поэтому проблема заключается в другом.

$(document).ready(function() { 
    minTime(1.5); 
    function minTime(minTime) { 
     var startTime = new Date(); 
     $("[class*=bfasg] .radio").click(function(){$("#movenextbtn").click(function(){ 
      var endTime = new Date(); 
      if((endTime - startTime)/1000 <= minTime) { 
       alert('You must spend at least '+minTime+' seconds on the question.'); 
       return false; 
      } 
      else { 
       return true; 
      } 
     }); 
     }); 
    } 
}); 

Любые эксперты, которые могут обнаружить проблему?

+0

попробуйте добавить цитаты вокруг 'bfasg' –

+0

@JanDvorak: Это не нужно, если нет пробелов. –

+1

В коде, который вы указали, нет синтаксической ошибки, вы получаете ошибку времени выполнения и, если да, то что это такое и на какой строке? – HMR

ответ

4

(см ответ на обновленный вопрос ниже)

Это не ошибка синтаксиса. Это логическая ошибка.

становится немного понятнее, если вы форматировать код последовательно:

$(document).ready(function() { 
    minTime(1.5); 

    function minTime(minTime) { 
     var startTime = new Date(); 
     // Hooking up a click handler 
     $("[class*=bfasg] .radio").click(function() { 
      // This code doesn't run until/unless someone clicks 
      // one of the `[class*=bfasg] .radio` elements. 
      $("#movenextbtn").click(function() { 
       var endTime = new Date(); 
       if ((endTime - startTime)/1000 <= minTime) { 
        alert('You must spend at least ' + minTime + ' seconds on the question.'); 
        return false; 
       } else { 
        return true; 
       } 
      }); 
     }); 
    } 
}); 

Что вы сделали Eсть сказал «Когда кто-то нажимает на [class*=bfasg] .radio элемент, подключить обработчик событий на #movenextbtn элемент»

Возможно, вы не хотите ждать, чтобы подключить событие, пока кто-то не нажмет на переключатель. Если ваша цель состоит в том, чтобы подключить событие щелчка на обоих наборов элементов, объединить их в том же селекторе, как вы бы в CSS:

$(document).ready(function() { 
    minTime(1.5); 

    function minTime(minTime) { 
     var startTime = new Date(); 
     $("[class*=bfasg] .radio, #movenextbtn").click(function() { 
      var endTime = new Date(); 
      if ((endTime - startTime)/1000 <= minTime) { 
       alert('You must spend at least ' + minTime + ' seconds on the question.'); 
       return false; 
      } 
     }); 
    } 
}); 

(Кстати, возвращаясь true из обработчика событий JQuery не имеет смысла, поэтому я удалил его выше)


Ниже вы прокомментировали:.

Wha Это происходит потому, что я хочу щелкнуть переключатель, чтобы автоматически запускать кнопку «Далее» для перехода на следующую страницу, так как у меня есть один вопрос на странице.

Это не принципиально меняет ситуацию. Вы не указали, что кнопка делает для перехода на следующую страницу, но вы просто поместите этот код в один обработчик click выше. Например, вы по-прежнему подключаете click как к переключателям, так и к кнопке, и вы по-прежнему обрабатываете это событие с использованием общего кода. Например:

$(document).ready(function() { 
    minTime(1.5); 

    function minTime(minTime) { 
     var startTime = new Date(); 
     $("[class*=bfasg] .radio, #movenextbtn").click(function() { 
      var endTime = new Date(); 
      if ((endTime - startTime)/1000 <= minTime) { 
       alert('You must spend at least ' + minTime + ' seconds on the question.'); 
       return false; 
      } else { 
       // ****Move to next page here**** 
      } 
     }); 
    } 
}); 

В качестве альтернативы, вы можете иметь переключатель нажмите вызвать событие щелчка на кнопке, например:

$(document).ready(function() { 
    minTime(1.5); 

    function minTime(minTime) { 
     var startTime = new Date(); 

     // Hook up `click` on the radio buttons 
     $("[class*=bfasg] .radio").click(function() { 
      // Respond to click by firing click on the #movenextbtn 
      $("#movenextbtn").click(); 
     }); 

     // Hook up `click` on the #movenextbtn 
     $("#movenextbtn").click(function() { 
      var endTime = new Date(); 
      if ((endTime - startTime)/1000 <= minTime) { 
       alert('You must spend at least ' + minTime + ' seconds on the question.'); 
       return false; 
      } 
     }); 
    } 
}); 

Я не большой поклонник стрельбы синтетических событий, как, что, когда вы можете использовать общую логику, но это вариант.

+0

Спасибо, я действительно оговорюсь, когда Я сказал, что «объединил два события щелчка». Что происходит, так это то, что я хочу щелкнуть переключатель, чтобы автоматически запускать кнопку «Далее» для перехода на следующую страницу, так как у меня есть один вопрос на странице. Поэтому они должны оставаться вложенными в путь. Я уточню это в сообщении. – AlexR

+0

@AlexR: Я обновил ответ. –

+0

спасибо! Мне было всего несколько минут назад, что второе событие click должно быть частью инструкции else, но вы избили меня. Эти два вложенных события на самом деле были частью автономной функции, прежде чем я решил также включить аспекты синхронизации, но я не видел ошибку в логике. – AlexR

0
function callMe() { 
    // Do Something 
} 

$(document).ready(function() { 
    callMe(); 
}); 

DECLARE FUNCTION вне готовности(), но затем определить функции внутри готовых(). Что лучше определить их за пределами документа готов. И, если вам нужно, поместите реализацию метода в документ готовым.