2013-06-29 39 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; 
       } 
      }); 
     }); 
    } 
}); 

你做了什麼沒有說。「當有人點擊一個[class*=bfasg] .radio元素,勾了#movenextbtn元素上的事件處理程序」

您可能不想等到有人點擊一個單選按鈕時才掛鉤事件。如果你的目標是掛鉤的Click事件上兩個組元素,在相同的選擇,你在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; 
      } 
     }); 
    } 
}); 

(順便說一句,從一個jQuery的事件處理程序返回true已經沒有任何意義,所以我刪除它上面)


下面你發表過評論:

什我想要點擊單選按鈕來自動觸發「下一步」按鈕進入下一頁,因爲每頁有一個問題。

這並沒有從根本上改變事情。您沒有顯示該按鈕移動到下一頁的操作,但是您只需將該代碼放在上面的一個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**** 
      } 
     }); 
    } 
}); 

或者,你可以有單選按鈕,點擊該按鈕觸發click事件,像這樣:

$(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

謝謝!幾分鐘前,我發現第二個點擊事件應該是else語句的一部分,但是你打敗了我。這兩個嵌套事件實際上是一個獨立功能的一部分,然後我決定也包括時序方面,但是我沒有看到邏輯上的錯誤。 – AlexR

0
function callMe() { 
    // Do Something 
} 

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

聲明函數就緒()之外,同時再定義的內部功能就緒()。這是更好地定義它們的文件準備之外。而且,如果您需要,請將該方法的實現放在文檔中。