Nasıl jQuery kullanarak kullanıcı girilmesiyle sırasında önemli bir duraklama bir AJAX isteği başlatmak için?

3 Cevap php

Bir kullanıcı bir şey girerek olduğunda, AJAX kullanarak veritabanındaki ilgili verilere karşı kullanıcı girişi kontrol etmek gerekir, ama bu benim veritabanı sunucusu korkutur çünkü ben sürekli veritabanındaki verilere karşı kullanıcı girişi kontrol edemez. Ben sadece kullanıcı girilmesiyle sırasında önemli / belirgin / mantıklı bir aradan bir AJAX isteği başlamak istiyorum. Örneğin, giriş imleç bir veya iki seconds.From için kullanıcı bakış hareket etmez, o çek gerçek-zamanlı olduğunu düşünüyor. Jquery kullanarak bunu nasıl?

Neden benim kod çalışma, tahmin değil gibi?

function subjectivecheck(id){
    alert(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(" ");
    		}
    	}

    });

}
var ajaxCallTimeoutID = null;
function subjectivecheckcallback(id){
    if (ajaxCallTimeoutID != null)
    clearTimeout(ajaxCallTimeoutID);

  ajaxCallTimeoutID = setTimeout(subjectivecheck(id), 1000);

}

3 Cevap

Temel olarak, AJAX çağrı kullanıcının son giriş bir süre sonra başlatmak istiyorum. Eğer bir metin kutusu kullanıyorsanız, size keyup olay işleme ve setTimeout() kullanarak AJAX çağrı zamanlama yapabilirsiniz. Olay işleyicisi başında, programlı bir görüşme için kontrol edebilirsiniz ve (kullanıcı tekrar yazmaya başladığımdan beri) iptal:

var ajaxCallTimeoutID = null;
function doAjax() {
  // Do AJAX call here...
}

$('#myTextbox').keyup(function(ev) {

  if (ajaxCallTimeoutID != null)
    clearTimeout(ajaxCallTimeoutID);

  ajaxCallTimeoutID = setTimeout(doAjax, 300);
});

Eğer tüm form genelinde kullanıcı girişine tepki istiyorsanız, o zaman sadece işleyici kolları olayları genişletmek zorundayız. Muhtemelen, keyup metin kutuları için textareas işlemek ve her şeyi elemanları, change seçeneğini elemanları, ve muhtemelen focus seçmek isterim.

Ben aşağıdaki işlevi kullanın, temelde kullanıcı zaman belirli bir miktar için yazmaya durduktan sonra geri yürütür:

var typewatch = function(){
    var timer = 0;
    return function(callback, ms){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    }  
}();

Usage:

$('input').keyup(function() {
    typewatch(function(){
      alert('Time elapsed, make Ajax request...');
    }, 1000 ); // wait one second
});

Sen daha karmaşık bir şey için jQuery Typewatch eklentisi bir görünüm verebilir.

Sadece makul bir gecikme için bir zamanlayıcı başlar:

var delaying = false;

function doAjax() {
  // ... begin Ajax
  delaying = false;
}

$('#myTextbox').keyup(function(ev) {
  if (!delaying) {
    delaying = true;
    setInterval(doAjax, 3000);
  }
});