2012-01-09 27 views
98

tôi có chức năng sau:jQuery nhận được giá trị đầu vào sau khi bấm phím

$(document).ready(function() { 
    $("#dSuggest").keypress(function() { 
     var dInput = $('input:text[name=dSuggest]').val(); 
     console.log(dInput); 
     $(".dDimension:contains('" + dInput + "')").css("display","block"); 
    }); 
}); 

Đối với một số lý do nào, cho bấm phím đầu tiên, tôi nhận được một chuỗi rỗng ra cửa sổ Console log.

Trả lời

122

Điều này là do keypress sự kiện được bắn trước nhân vật mới được thêm vào value của phần tử (do đó sự kiện đầu tiên keypress là bắn trước khi ký tự đầu tiên được thêm vào, trong khi value vẫn còn trống). Bạn nên sử dụng keyup thay thế, được kích hoạt sau khi ký tự đã được thêm.

Lưu ý rằng, nếu phần tử của bạn #dSuggest cũng giống như input:text[name=dSuggest] bạn có thể đơn giản hóa mã này đáng kể (và nếu nó không phải là, có một phần tử với một tên có nghĩa là giống như id của nguyên tố khác là không tốt ý kiến).

$('#dSuggest').keypress(function() { 
    var dInput = this.value; 
    console.log(dInput); 
    $(".dDimension:contains('" + dInput + "')").css("display","block"); 
}); 
+2

trình, nhưng với jquery 2.x ra đây là hết hạn bây giờ là câu trả lời dưới đây bằng cách sử dụng trên và đầu vào là cách tốt nhất để làm điều đó ngay bây giờ. – ppumkin

+1

@ppumkin: Chỉ vì jQuery 2 đã hết, không có nghĩa là mọi người không cần hỗ trợ IE8 và thấp hơn. Và tôi không thấy bất kỳ điều gì trong các tài liệu đề xuất hỗ trợ thực sự cho loại sự kiện 'input'. –

+6

Bạn chính xác, họ nên ngừng hỗ trợ IE, điểm. Hầu hết các "cách giải quyết" trong jQuery 1.x là dành cho IE, vì vậy nó thực sự cần được đổi tên thành jQuerIE. – ppumkin

28

Sử dụng .keyup thay vì nhấn phím.

Cũng sử dụng $(this).val() hoặc chỉ this.value để truy cập giá trị đầu vào hiện tại.

DEMO đây

Thông tin về .keypress từ tài liệu jQuery,

Sự kiện bấm phím sẽ được gửi đến một yếu tố khi trình duyệt đăng ký đầu vào bàn phím. Điều này tương tự như sự kiện keydown, ngoại trừ trong trường hợp lặp lại khóa . Nếu người dùng nhấn và giữ một phím, một sự kiện keydown được kích hoạt một lần, nhưng các sự kiện nhấn phím riêng biệt được kích hoạt cho mỗi ký tự được chèn. Ngoài ra, các phím bổ trợ (chẳng hạn như Shift) kích hoạt sự kiện nhấn phím nhưng không phải các sự kiện nhấn phím.

+3

'keyup' quá chậm, và một phím có thể được nhấn và giữ mà không bị nhả và mọi thứ phải xảy ra. tốt hơn để sử dụng 'keydown' với một chút thời gian chờ để giá trị thực sự thay đổi. – vsync

+0

nhược điểm duy nhất tôi đã tìm thấy là nếu người dùng nhấn nhiều hơn một nhân vật bàn phím với nhau, nó sẽ không đăng ký chính xác. – vsync

5

Bạn phải làm gián đoạn chuỗi thực hiện để cho phép đầu vào cập nhật.

$(document).ready(function(event) { 
     $("#dSuggest").keypress(function() { 
      //Interrupt the execution thread to allow input to update 
       setTimeout(function() { 
        var dInput = $('input:text[name=dSuggest]').val(); 
        console.log(dInput); 
        $(".dDimension:contains('" + dInput + "')").css("display","block"); 
       }, 0); 
     }); 
    }); 
+0

Nó hoạt động ... nhưng keyup là sự kiện thích hợp để sử dụng sự chậm trễ 'keyup' là – ppumkin

+1

quá chậm cho một số mục đích và cũng không tự động lọc các phím bổ trợ. Điều này thực sự làm việc tốt hơn cho tôi. –

+0

câu trả lời hay nhất. keyup - chậm và không thể bắt các ký tự như @ với hai phím bấm. –

150

Nhận thấy đây là một bài đăng khá cũ, tôi sẽ cung cấp câu trả lời cho dù tôi đang gặp khó khăn với cùng một vấn đề.

Thay vào đó, bạn nên sử dụng sự kiện "input" và đăng ký với phương thức .on. Điều này nhanh - không có độ trễ keyup và giải quyết vấn đề nhấn phím mới nhất mà bạn mô tả.

$('#dSuggest').on("input", function() { 
    var dInput = this.value; 
    console.log(dInput); 
    $(".dDimension:contains('" + dInput + "')").css("display","block"); 
}); 

Demo here

+23

Điều này sẽ được đánh dấu là câu trả lời đúng - keyup có thể giải quyết vấn đề thiếu ký tự, nhưng có vấn đề để xác định xem ký tự đã được viết hay chưa (và khóa không phải là "tab" hay "home"). +1 cho bạn – Nashi

+2

Bạn thưa bạn, là thiên tài –

+0

Câu trả lời hay nhất, nên ở trên cùng. – Jacob

3

Điều này là do Keypress sự kiện là bắn trước khi nhân vật mới được thêm vào. Thay vào đó, hãy sử dụng sự kiện 'keyup', sự kiện này sẽ hoạt động hoàn hảo trong tình huống của bạn.

$(document).ready(function() { 
    $("#dSuggest").keyup(function() { 
     var dInput = $('input:text[name=dSuggest]').val(); 
     console.log(dInput); 
     $(".dDimension:contains('" + dInput + "')").css("display","block"); 
    }); 
}); 

tôi muốn thêm vào đó, nếu bạn có nhiều textbox và bạn phải làm điều tương tự về sự kiện KeyUp của họ, bạn chỉ có thể cung cấp cho họ một lớp css chung (ví dụ commoncss) và áp dụng KeyUp sự kiện như thế này .

$(document).ready(function() { 
    $(".commoncss").keyup(function() { 
     //your code 
    }); 
}); 

điều này sẽ giúp bạn giảm thiểu mã khi bạn không phải áp dụng sự kiện khóa bằng id cho mỗi hộp văn bản.

0

Tôi nghĩ rằng những gì bạn cần là nguyên mẫu dưới đây

$(element).on('input',function(){code}) 
0

tôi đang tìm kiếm một ví dụ ES6 (vì vậy nó có thể vượt qua Linter của tôi) Vì vậy, đối với người khác, những người đang tìm kiếm giống nhau:

$('#dSuggest').keyup((e) => { 
    console.log(e.currentTarget.value); 
}); 

tôi cũng sẽ sử dụng KeyUp bởi vì bạn nhận được giá trị hiện tại được điền vào.

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