Phát hiện hộp văn bản đầu vào đã thay đổi


289

Tôi đã xem xét rất nhiều câu hỏi khác và tìm thấy câu trả lời rất đơn giản, bao gồm cả đoạn mã dưới đây. Tôi chỉ đơn giản muốn phát hiện khi ai đó thay đổi nội dung của hộp văn bản nhưng vì một số lý do, nó không hoạt động ... Tôi không gặp lỗi bảng điều khiển. Khi tôi đặt một điểm dừng trong trình duyệt tại change()chức năng, nó không bao giờ chạm vào nó.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
chỉ cần một vài điều để thử: cung cấp cho đầu vào một kiểu = "văn bản" và biến nó thành một yếu tố đơn lẻ. <input id = "inputDatabaseName" type = "text" />
szeliga

Làm sạch một số mã không cần thiết, chỉ 7 năm quá muộn.
Devil's Advocate

Câu trả lời:


523

Bạn có thể sử dụng inputsự kiện Javascript trong jQuery như thế này:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

Trong JavaScript thuần túy:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

Hoặc như thế này:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
Dường như không thể tìm thấy tài liệu cho sự kiện này, nhưng nó hoạt động chính xác theo cách tôi mong đợi. Bất kỳ ý tưởng nơi tôi có thể tìm thấy trang tài liệu?
Jorge Pedret

3
Bạn có thể tìm thấy nó trong danh sách các sự kiện HTML5: w3schools.com/tags/ref_eventattribut.asp hoặc tại đây help.dottoro.com/ljhxklln.php
Ouadie

7
Giải pháp này thực sự tốt hơn nhiều so với sử dụng keyup. Ví dụ: IE cho phép người dùng xóa trường nhập bằng cách nhấp vào X không kích hoạt khóa.
Georg

7
Giải pháp gần nhất cho đến nay, nhưng vẫn không hoạt động khi trình duyệt thực hiện tự động điền trên hộp văn bản.
Saumil

3
Điều này là tốt hơn nhiều so với câu trả lời đầu tiên. Các phím Ctrl, Shift đều được tính là keyup. Và phần tồi tệ nhất là, nếu bạn gõ nhanh, một số đầu vào sẽ đăng ký dưới dạng chỉ một sự kiện keyup.
octref

173

thử keyup thay vì thay đổi.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Đây là tài liệu jQuery chính thức cho .keyup () .


1
thở dài Tôi thề tôi đã thử điều đó (sau khi xem câu hỏi này: stackoverflow.com/questions/1443292/ mẹo ) ... nhưng dường như không phải vì nó hoạt động ngay bây giờ!
Devil's Advocate

27
thay đổi chỉ kích hoạt khi phần tử mất tiêu điểm và keyup được kích hoạt khi một phím trên bàn phím được giải phóng.
Declan Cook

9
Điều gì xảy ra nếu người dùng dán mã bằng ctrl + v hoặc bằng cách kéo văn bản đã chọn bằng chuột vào #inputDatabaseName? Làm thế nào để bạn phát hiện ra điều đó?
Radu Simionescu

5
Vấn đề chính với điều này là nó vẫn không tính đến nếu nội dung thực sự thay đổi. Chỉ có một nút được nhấn
Đô thị

@Metropolis, bạn đã thấy câu trả lời của tôi ?? stackoverflow.com/a/23266812/3160597
azerafati

103

Mỗi câu trả lời đều thiếu một số điểm, vì vậy đây là giải pháp của tôi:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Các Input Eventvụ cháy trên đầu vào Bàn phím , Kéo chuột , Tự động điềnSao chép-Dán đã được thử nghiệm trên Chrome và Firefox. Kiểm tra giá trị trước đó làm cho nó phát hiện các thay đổi thực sự, có nghĩa là không bắn khi dán cùng một thứ hoặc gõ cùng một ký tự, v.v.

Ví dụ hoạt động: http://jsfiddle.net/g6pcp/473/


cập nhật:

Và nếu bạn muốn chạy change function chỉ khi người dùng nhập xong và ngăn thực hiện hành động thay đổi nhiều lần, bạn có thể thử điều này:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

Nếu người dùng bắt đầu nhập (ví dụ: "foobar"), mã này sẽ ngăn bạn change actionchạy cho mọi loại người dùng chữ cái và chỉ chạy khi người dùng dừng gõ, Điều này đặc biệt tốt khi bạn gửi đầu vào đến máy chủ (ví dụ: đầu vào tìm kiếm), đó là cách máy chủ không chỉ có một tìm kiếm foobarvà không sáu tìm kiếm fvà sau đó fovà sau đó foofoobvân vân.


1
Đây là lần đầu tiên làm việc từ khoảng 6 tôi đã thử. Tuyệt vời. Cảm ơn.
Enkode

Hầu như hoạt động trên IE9: nếu bạn xóa một ký tự, nó sẽ không kích hoạt sự kiện. Cách giải quyết rất tốt mặc dù
Soma

@Soma, như những người khác nói "phá vỡ IE không phải là một lỗ hổng" đó là một tính năng ";) mặc dù IE không được tiếp tục nữa nhưng nếu bạn có một bản sửa lỗi cho chúng tôi biết
azerafati 4/12/2015

Tôi biết, nhưng tôi phải làm việc đó vì công việc :( Như một vấn đề thực tế, tôi làm: sử dụng $("#input").focusout(function () {}). Khi bạn nhấp vào bên ngoài đầu vào của mình, sự kiện sẽ được kích hoạt. Hoạt động trên phiên bản hiện tại của Chrome và Firefox và IE9
Soma

2
@Soma, nếu đó là cách duy nhất để IE hoạt động, bạn có thể sử dụng theo cách của mình chỉ với việc thay đổi dòng này$("#input").on("input focusout",function(e){
azerafati

18

Đầu vào văn bản không kích hoạt changesự kiện cho đến khi chúng mất tập trung. Nhấp vào bên ngoài của đầu vào và cảnh báo sẽ hiển thị.

Nếu cuộc gọi lại sẽ kích hoạt trước khi nhập văn bản mất tiêu điểm, hãy sử dụng .keyup()sự kiện.


changeđang làm việc ở đây: jsfiddle.net/g6pcp ; keyupcảnh báo sau mỗi khóa không phải là cách tốt
diEcho

1
@diEcho Tôi nghĩ rằng cảnh báo chỉ là một ví dụ để làm cho mã của anh ấy hoạt động ... không phải là những gì anh ấy dự định làm cuối cùng.
Scott Harwell

@diEcho Những gì Scott nói, nó chỉ dành cho mục đích thử nghiệm. Đó là cách tôi gỡ lỗi: D
Devil's Advocate

@ Xin vui lòng sử dụng một trình gỡ lỗi thích hợp hơn là alert(). Nó sẽ làm cho việc gỡ lỗi dễ dàng hơn nhiều.
Matt Ball

13

onkeyup, onpaste, onchange, oninputdường như không thành công khi trình duyệt thực hiện tự động điền trên các hộp văn bản. Để xử lý trường hợp như vậy, hãy bao gồm " autocomplete='off'" trong trường văn bản của bạn để ngăn trình duyệt tự động điền vào hộp văn bản,

Ví dụ,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

Trong trường hợp của tôi, tôi đã có một hộp văn bản được đính kèm với một datepicker. Giải pháp duy nhất hiệu quả với tôi là xử lý nó bên trong sự kiện onSelect của datepicker.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

Tôi nghĩ bạn cũng có thể sử dụng keydown:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

ĐANG LÀM VIỆC:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

Trông giống như mã cho một câu hỏi khác ... nội dung đó là gì về các giá trị cao cấp và hiển thị / ẩn nội dung về?
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.