2009-12-28 14 views
0

這是關鍵代碼:如何在用戶上次輸入一段時間後發起包含AJAX請求的函數?

var ajaxCallTimeoutID = null; 
$(document).ready(function() { 
$("input[id^='question']").live('keyup',function(ev){ 
    id=this.id.substr(8); 
    if (ajaxCallTimeoutID != null) 
    clearTimeout(ajaxCallTimeoutID); 
ajaxCallTimeoutID = setTimeout(subjectivecheck(id), 1000); 

}); 
}); 

然而,

subjectivecheck(ID) 當用戶輸入一個字母,立即執行,而是希望用戶已經停止打字後,它被稱爲持續一段指定的時間。如何解決這個問題呢?

function subjectivecheck(id){ 
    var cost=(new Date().getTime() - start.getTime())/1000; 
    var value=$('#question'+id).val(); 
    $.post("subjectivecheck.php?",{val:value, qid:id,time:cost, a_id:"<?php echo $announcementid; ?>"},function(xm){ 

     switch(parseInt(xm)){ 
      case 4: 
      { $htm='Congrats,you have passed the test.'; 
       $('#success').css({"color":"green"}); 
       $('#success').text($htm); 
      return; 
      } 
      case 1: 
      { 
      $htm='V'; 
     $('#sign'+id).css({"color":"green"}); 
     $('#sign'+id).text($htm); 
     break; 
      } 
      case 0:{ 

       $htm='X'; 
     $('#sign'+id).css({"color":"red"}); 
     $('#sign'+id).text($htm); 
     break; 
      } 
      case 3:{ 
       $('#subjectivequestion').text('You have failed at this announcement.'); 

       $('#choicequestions').text(" "); 
      } 
     } 

    }); 

} 

回答

2

你需要將其包裝在一個匿名函數:

ajaxCallTimeoutID = setTimeout(function(){subjectivecheck(id)}, 1000); 

沒有包裹function(){}功能subjectivecheck立即調用,但是當你把它包起來傳遞作爲函數的引用一個論點。稍後可以調用該函數,然後調用您的函數。

+0

當我用匿名函數包裝它時,主體檢查(id)永遠不會被調用。 – Steven 2009-12-28 15:46:09

+0

它不工作.ajaxCallTimeoutID = setTimeout(function(){subjectivecheck(id)},1000); 不起作用。 – Steven 2009-12-28 15:57:19

+0

我用警報而不是主觀檢查來測試,而且工作正常。這個問題與主觀檢查有關,而不是你在這裏發佈的代碼。 – Marius 2009-12-28 16:16:23

0

我通常會做的是在keyup上啓動超時,並清除keydown(或按鍵)上的超時時間。

var timers=[]; 
$('input[id^="question"]').keydown(function(){ 
    while(timers.length){ 
    clearTimeout(timers.shift()); 
    } 
}).keyup(function(){ 
    var timeout=setTimeout(function(){ 
    //ajax call here 
    }, 300); 
    timers.push(timeout); 
}); 
+0

對不起,它必須是$(「input [id^='question']」)。live(),因爲相應的代碼是動態創建的。 – Steven 2009-12-28 15:50:11

+0

將上面的代碼改爲'live('keydown')並不難。 – czarchaic 2009-12-28 16:55:43