2010-03-21 35 views
5

Tôi có một hộp văn bản trên trang web có giá trị mà tôi muốn gửi đến XMLHttpRequest. Bây giờ tôi muốn người dùng chỉ cần nhập giá trị mà không cần nhấn nút. Nhưng nếu tôi chỉ gửi yêu cầu int ông bàn phím sự kiện, nó sẽ cháy mỗi khi một phím được nhấn.Javascript: Xử lý khi người dùng đã ngừng nhập

Vì vậy, về cơ bản tôi muốn một cái gì đó liek này

function KeyUpEvent() 
{ 
    if (user is still typing) 
    return; 
    else 
    //do processing 
} 

Nó sẽ là tuyệt vời nếu các giải pháp có thể đến từ đồng bằng javascript hoặc mootools. Tôi không muốn sử dụng bất kỳ thư viện nào khác.

+0

Bộ hẹn giờ sẽ không bao giờ đủ. Người dùng chỉ đơn giản có thể bị phân tâm hoặc nhập chậm hơn bất kỳ lúc nào bạn chọn làm thời gian chờ của mình. Giải pháp của tôi là giải pháp hợp lý duy nhất và là cách người dùng mong muốn tương tác với các trường và nó không yêu cầu bất kỳ nút nào. Nếu bạn không biết độ dài của giá trị, bạn không biết liệu người dùng có hoàn thành hay không. Vì vậy, sau đó bạn có nguy cơ truyền một giá trị người dùng không muốn hoặc mong đợi và kinh nghiệm của họ chỉ đơn giản là thất vọng bởi bộ đếm thời gian của bạn, không tăng cường. Khi nói đến trải nghiệm giao diện người dùng, bạn nên gắn bó với các tình huống sử dụng tiêu chuẩn. – nicerobot

Trả lời

9

Cách thức này thường được thực hiện bằng cách khởi động lại bộ hẹn giờ trên sự kiện keyup. Một cái gì đó như thế này:

var keyupTimer; 
function keyUpEvent(){ 
    clearTimeout(keyupTimer); 
    keyupTimer = setTimeout(sendInput,1000); // will activate when the user has stopped typing for 1 second 
} 

function sendInput(){ 
    alert("Do AJAX request"); 
} 
+0

bạn đang quên khóa, nếu họ quyết định bắt đầu nhập lại sau 30 giây thì sao? sự kiện của bạn vẫn cháy –

+1

không phải là câu trả lời hợp lệ, điều đó sẽ kích hoạt sự kiện [số lượng ký tự được nhập] số lần –

9

Về cơ bản, bạn muốn bắt đầu bộ hẹn giờ trên KeyUp và khi KeyUp khởi động lại, hãy đặt lại bộ hẹn giờ. Khi người dùng ngừng nhập, bộ hẹn giờ sẽ hết và yêu cầu của bạn có thể đi vào thời điểm đó.

Ví dụ:

var timout_id; 

function keyup_handler(event) { 
    if (timout_id) { 
    clearTimeout(timout_id); 
    } 

    timout_id = setTimeout(function(){ 
    alert('sending data: \n' + event.target.value) 
    }, 800); 
} 

Chỉ cần đính kèm các chức năng để đầu vào sử dụng phương pháp ưa thích của bạn, và thay thế alert với hành động ưa thích của bạn.

Tất nhiên có nhiều cách bạn có thể khái quát hóa cách tiếp cận này và làm cho nó có thể sử dụng lại nhiều hơn, v.v. Nhưng tôi nghĩ điều này minh họa ý tưởng cơ bản.

2

Bạn không bao giờ biết khi nào người dùng thực sự gõ "xong". Người dùng có thể nghỉ ngơi hắt hơi hoặc nghỉ ngơi hoặc nghỉ giải lao và sau đó tiếp tục nhập.

Tuy nhiên, nếu bạn đang triển khai một cái gì đó như cơ chế tự động hoàn thành, bạn có thể đặt hẹn giờ (xem window.setTimeout(...)) để xem liệu người dùng chưa nhập bất kỳ thứ gì trong một khoảng thời gian nhất định. Nếu bạn nhận được một sự kiện quan trọng khác trong khi bộ hẹn giờ đang chạy, bạn có thể khởi động bộ hẹn giờ.

-1

Sử dụng onBlur và có thể onKeyDown để kiểm tra người dùng nhấn phím trả về/enter.

+0

Nghiêm túc !? Bỏ phiếu này xuống khi nó là phương tiện thực sự duy nhất để biết khi người dùng gõ xong? Đó là, họ đã rời khỏi trường hoặc nhấn một phím cho biết họ muốn gửi. Nếu không, không có cách nào để biết. Không phải là một bộ đếm thời gian vì chúng có thể đơn giản bị phân tâm. – nicerobot

5

tôi luôn luôn sử dụng chức năng đơn giản này để xử lý một giờ, mà sẽ cháy một chức năng gọi lại, sau khi người dùng đã ngừng gõ trong một khoảng thời gian nhất định:

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

sử dụng (ví dụ với MooTools):

$('textInput').addEvent('keyup', function(e){ 
    typewatch(function() { 
    // executed only 500 ms after the last keyup event 
    // make Ajax request 
    }, 500); 
}); 

sự khác biệt chính giữa giải pháp này và các giải pháp từ câu trả lời khác là tất cả bộ đếm thời gian logic được xử lý bởi các typewatch chức năng riêng của mình, xử lý sự kiện không cần phải biết một nything về bộ đếm thời gian, nó chỉ gọi hàm. Ngoài ra, không có biến toàn cục nào cần lưu ý (id hẹn giờ là không phải được lưu trữ trên biến toàn cầu).

1
var keyTimer; 
function onKeyUp(){ 
clearTimeout(keyTimer); 
setTimeout(stoppedTyping,1500); 
} 
function stoppedTyping(){ 
// Profit! $$$ 
} 

EDIT: Chết tiệt ninja

0

Tôi đã viết một sự kiện jQuery tùy chỉnh vì tôi sử dụng logic này rất nhiều:

jQuery.event.special.stoppedtyping = { 
    setup: function(data, namespaces) { 
    jQuery(this).bind('keyup', jQuery.event.special.stoppedtyping.keyuphandler); 
    }, 
    teardown: function(namespaces) { 
    jQuery(this).bind('keyup', jQuery.event.special.stoppedtyping.keyuphandler); 
    }, 
    keyuphandler: function(e) { 
    var interval = 1000; 
    var el = this; 

    if (jQuery.data(this, 'checklastkeypress') != null) { 
     clearTimeout(jQuery.data(this, 'checklastkeypress')); 
    } 

    var id = setTimeout(function() { 
     jQuery(el).trigger('stoppedtyping'); 
    }, interval); 
    jQuery.data(this, 'checklastkeypress', id); 
    } 
}; 

Bạn có thể sử dụng nó như thế này:

$('input.title').bind('stoppedtyping', function() { 
    // run some ajax save operation 
}); 

Đối với một số lý do tôi không bao giờ có thể làm cho nó hoạt động với .live (...). Tôi không chắc tại sao ...

Các vấn đề liên quan