2011-05-06 8 views
28

사용자가 텍스트 상자에 입력을 마친 후 2 초와 같은 기능을 실행하고 싶습니다. 1 초 후에 타이핑을 계속하면 지연 시간은 2로 다시 설정됩니다.jQuery 값 변경 이벤트 지연

자동 완성 상자와 비슷한 기능을 수행해야합니다.

나는 2 가지 이벤트를 알고 있습니다 : changekeyup. 내가 가진 change 문제는 텍스트 상자가 느슨하게 초점을 맞추어야한다는 것입니다. keyup의 경우 마우스를 사용하여 텍스트를 붙여 넣으면 어떻게됩니까?

여기에서 도울 수 있습니까?

답변

27

HTML5의 oninput 이벤트, 현재의 모든 주요 브라우저에서 지원하고 IE 8로 작업 할 수 있으며, 낮은있다 :

$("#myInput").bind("input", function() { 
    // ... 
}) 

매우 간단한 크로스 브라우저 접근 방식은

$("#myInput").bind("input propertychange", function (evt) { 
    // If it's the propertychange event, make sure it's the value that changed. 
    if (window.event && event.type == "propertychange" && event.propertyName != "value") 
     return; 

    // Clear any previously set timer before setting a fresh one 
    window.clearTimeout($(this).data("timeout")); 
    $(this).data("timeout", setTimeout(function() { 
     // Do your thing here 
    }, 2000)); 
}); 

이 두 번 IE 9 (propertychange 하나, input 하나)에서 이벤트 불을 만들 것입니다 것입니다,하지만 때문에 이벤트 핸들러의 특성 중요하지 않습니다.

+0

예에서 event.type을 evt.type로 설정해야합니까? 좋아 보인다, 나는 이것을 빌릴지도 모른다. IE7은 onblur조차도 여러 속성 변경을 발생시킵니다. 이걸 잡아서 한 번만 처리 할 수 ​​있습니까? 또한 타이머의 목적은 무엇입니까? – armyofda12mnkeys

+1

@ armyofda12mnkeys : 아니요, 'event.type'은 정확합니다. IE에서 제공되는 전역'event' 객체를 찾고 있습니다. 좀 더주의하고 싶다면'window.event. * '로 바꿀 수 있습니다. 'value' 속성에 대한 변경 만 처리합니다. 두 번 이상 발생하면 이전에 설정된 타이머를 취소합니다. –

2

당신은 변화와의 keyup에 모두 넣을 수 있습니다 :

var globalTimeout; 

$(function() { 
    $("#myInput").change(initTimer).keyup(initTimer); 
}); 

function initTimer() { 
    if (globalTimeout) clearTimeout(globalTimeout); 
    globalTimeout = setTimeout(handler, 2000); 
} 

function handler() { 
    ... 
} 
0

keyup 작동합니다 :

$("#s").keyup(function(e){ 
    $("#t").html($(this).val()); 
}); 

Jsfiddle을 : http://jsfiddle.net/3nx6t/

+0

'keyup '은 사용자 입력을 탐지하기에 좋지 않은 이벤트입니다. 사용자가 키에서 손가락을 들어 올리면 키보드 입력 (붙여 넣기, 드래그/드롭, 맞춤법 검사기 수정 등) 만 발생합니다. –

+0

@Andy : 데모를 참조하십시오. jQuery 1.6 지원도 붙여 넣기! –

+0

마우스 오른쪽 버튼을 클릭하고 붙여 넣기를 선택하면 발동하지 않습니다 –

0

내가 이런 식으로 할 거라고 :

$("selector").keyup(function(){ 
    if(typeof(window.delayer) != 'undefined') 
     clearTimeout(window.delayer); 
    window.delayer = setTimeout(function_you_want_to_get_execute_with_delay, 2000); 
}); 

환호

12

input 이벤트를 바인딩 할 수 있으며 이전 브라우저에서는 대체 할 수 있습니다. keyup을 대체 할 수 있습니다. 그런 다음 사용자 작업이 감지 될 때마다 재설정되는 타이머를 시작할 수 있습니다. 타이머 핸들을 현재 요소의 데이터에 저장하면 여러 요소가 서로 간섭하지 않도록 할 수 있습니다.

$('input').bind('input keyup', function(){ 
    var $this = $(this); 
    var delay = 2000; // 2 seconds delay after last input 

    clearTimeout($this.data('timer')); 
    $this.data('timer', setTimeout(function(){ 
     $this.removeData('timer'); 

     // Do your stuff after 2 seconds of last user input 
    }, delay)); 
}); 
+2

'keyup '보다'propertychange'가 더 좋습니다. 그것은 Internet Explorer에서 지원되며 사용자가 입력 필드의 'value'속성을 변경하기 위해 무언가를 할 때마다 실행되어 'input'만큼이나 좋습니다. 위의 내 대답을 참조하십시오. –

+0

도'keyup' 작업으로'select' 입력을 만드시겠습니까? – GusDeCooL

+0

'select'는이 목적을 위해'change'를 가지고 있습니다. – pebbo