2010-01-15 2 views
3

텍스트 입력란에 입력 된 키 입력을 1 초 간격으로 보내고 싶습니다.1 초 후에 ajax로 키 입력을 보냅니 까?

이것은 각 키 누르기에서 ajax 요청을 보내는 부하를 줄이기위한 것입니다.

예. 사용자가 초 안에 4 개의 문자를 입력하면 요청은이 4 개의 문자를 모두 보냅니다. 그가 1 분 안에 논스톱을 타자 고 말하면, 스크립트는 타이핑을 멈출 때까지 1 초 간격으로 보낼 것입니다.

$("#type_post").live('keyup', function() { 
     $.post('posts.php', {post: $("#type_post").val()}); 
}); 

을하지만 모든 키 누르기에 보냅니다 순간

내 스크립트는 다음과 같습니다.

사람이 여기

UPDATE 나를 도울 수 있습니다 : 여기 내가 사용하는 코드입니다.

var last_post = ''; 

$('#type_post').focus(function() { 
    // check if text has been changed every second when input field is focused 
    setInterval(function() { 
      if($('#type_post').val() != last_post) 
      { 
       // if changed, post it and set the new text as last text 
       $.post('posts.php', {post: $("#type_post").val()}); 
       last_post = $("#type_post").val(); 
      } 
    }, 1000); 
}); 

답변

4

음,이 기능이 얼마나 성가신 무시, 당신은 함수마다 두 번째를 실행하고 텍스트를 잡아 setTimeout() (info here)를 사용하는 것이 좋습니다. 그것이 다르다면, 아약스 호출을하십시오.

이 외에도 텍스트 상자에 포커스가있을 때만이 기능을 사용할 수 있으므로 '포커스'및 '흐림'이벤트에 필드 및 관련 작업을 설정할 수 있습니다.

+0

하지만, 최고의 솔루션과 같은 나던 소리 도움이되지 않습니다 단지의 키에이를 활성화하는 또 다른 방법이있을 – ajsie

+0

'제목 없음 : jspcal은 당신을위한 솔루션을 가지고 있습니다. 당신은 keypress에서도이를 활성화 할 수 있지만, jspcal의 접근 방식에서 타이머를 멈출 시간 (* 예)을 알아 내야합니다. 시간을 비교하고 업데이트를 수행하기 만하면됩니다. 아마도 그의 솔루션은 더 좋습니다. –

+0

또한 동적 바인딩 방법을 사용하지 않습니다. 동적으로 해당 기능을 사용하여 새 필드 상자를 만들지 않는 한 .bind ('keyup', ...)를 대신 사용하십시오. –

3

변수에 마지막 업데이트 시간을 저장 한 다음 게시를 수행하기 전에 지연 기간이 경과했는지 확인할 수 있습니다. 완전히 추가로 다시 검토

clearInterval(this.onChangeInterval); 
    if (this.currentValue !== this.el.val()) { 
    if (this.options.deferRequestBy > 0) { 
     // Defer lookup in case when value changes very quickly: 
     var me = this; 
     this.onChangeInterval = setInterval(function() { me.onValueChange(); }, this.options.deferRequestBy); 
    } else { 
     this.onValueChange(); 
    } 
    } 

내가 제안 :

+0

좋은 생각, 아프다 시도하고 다시 업데이트와 함께 – ajsie

1

내가 jQuery를위한 아약스 자동 완성 기능을 사용하고, 정중하게 그 문제를 해결 버전 1.1,이 코드의 조각이 OnKeyUp을 이벤트에 포함되어 있습니다 알다.

+0

그래서 내가 자동 완성 플러그인을 다운로드해야합니까? – ajsie

3

매초마다 AJAX 요청을 보내는 것은 끔찍한 생각입니다. 사용자가 입력을 중지 한 후에 만 ​​키스트 로크 요청을 보내려면 setTimeoutclearTimeout의 조합을 사용하는 것이 좋습니다. 뜨거운 순간에 예를 들어 보겠습니다. 명심해야 할

var timer = 0; 
$("#type_post").live('keyup', function(e) { 
    var val = $(this).val(); 
    // clear any existing timer 
    clearTimeout(timer); 
    // set a 1 second timeout 
    timer = setTimeout(function() { keyLogger(val) }, 1000); 
}); 

function keyLogger(val) { 
    $.post('posts.php', {post: $("#type_post").val()}); 
} 
+0

그러나 나는 이것이 다른 사람들이 당신이 타이핑하고있는 것을 보는 라이브 일종의 종류 인 모든 초 원인을 보내고 싶습니다. – ajsie

+1

@noname - 사용자가 1 초 동안 입력을 일시 중지 한 경우이 메시지가 전송됩니다. 일시 중지는 1000 (밀리 초 단위)을 ** 250 **으로 낮추면 쉽게 조정할 수 있습니다. 이렇게하면 요청 (및 대역폭)이 감소하고 사용자가 다음에 입력 할 내용을 생각할 때 전송됩니다. –

3

한 가지 중요한 점은 사용자 상호 작용 측면에서, 사초 일이 뭔가를 기다릴 수있는 매우 긴 시간이 있다는 것입니다. 사용자가 오랫동안 의견을 기다릴 것으로 기대하는 것은 다소 실용적입니다.

내가 말했던 부분 구현은 다음과 같습니다. 사용자가 흐린 후에 데이터를 전송하는 것을 고려하지 않으므로 종료 될 때 약간 어색 할 수 있습니다. 나는 그것을 테스트하지 않았지만, 일반적인 원칙이 있습니다.

var sendInterval; 
var lastValue; 
$("#type_post").focus(function() { 
     var input = $(this); 
    sendInterval = setInterval(function() { sendData(input.val()); }, 4000); 
}); 

$("#type_post").blur(function() { 
    if(sendInterval) 
     clearInterval(sendInterval); 
}); 

function sendData(data) { 
    if(lastValue != data) { 
     lastValue = data; 
     $.post('posts.php', {post: data}); 
    } 
} 
1

나는 http://obviousspoilers.com/member/register에서 등록 양식을 살펴 (에 사용자 이름을 입력합니다) 가지고 ... 대신에 jQuery를의 Mootools의를 사용하여 제외하고, 전에 비슷한 일을했습니다.

눈에 잘 띄지 않는 JavaScript를 배우기 전에 onkeyup = "..."onblur = "..."을 사용하여 코딩했습니다. 코드는 확실히 정리할 수 있지만 아무 것도 사용하지 않아도됩니다. JavaScript는 http://obviousspoilers.com/res/script.js입니다. Register 객체를 살펴보십시오.

편집 :.. 정확하게 질문을 읽어 보지 않았, 그래서 이것은 아마 :(

관련 문제