Làm cách nào để tôi triển khai onchange <input type = hung text văn bản> với jQuery?


Câu trả lời:


219

Bạn có thể dùng .change()

$('input[name=myInput]').change(function() { ... });

Tuy nhiên, sự kiện này sẽ chỉ kích hoạt khi bộ chọn bị mất tiêu điểm, vì vậy bạn sẽ cần phải nhấp vào một nơi khác để có tác phẩm này.

Nếu điều đó không hoàn toàn phù hợp với bạn, bạn có thể sử dụng một số sự kiện jQuery khác như keyup , keydown hoặc keypress - tùy thuộc vào hiệu ứng chính xác mà bạn muốn.


Thật không may, điều này không làm việc cho một đầu vào ẩn. Một giải pháp khả thi khi yêu cầu một onchange trên một đầu vào ẩn là: <input type = 'text' style = 'display: none' /> (với css) ..
NickGreen

303
Lưu ý rằng changesẽ chỉ bắn khi phần tử đầu vào bị mất tiêu điểm. Ngoài ra còn có inputsự kiện kích hoạt bất cứ khi nào hộp văn bản cập nhật mà không cần mất tập trung. Không giống như các sự kiện chính, nó cũng hoạt động để dán / kéo văn bản.
pimvdb

4
Nhận xét tuyệt vời @pimvdb. Tôi đã sử dụng nó, và biến nó thành một câu trả lời cho câu hỏi này.
iPadDeveloper2011

1
Khi tôi đang thử điều này, và vừa biết rằng sự kiện chỉ kích hoạt khi hai điều kiện được đáp ứng: 1) thay đổi giá trị; và 2) mờ, tôi tự hỏi liệu những gì nhiều người mong đợi về sự thay đổi () được xử lý tốt hơn bởi keyup ()?
TARKUS

Do changeIE9 không hỗ trợ, bạn có thể sử dụng focusoutđể có cùng một sự ép buộc
Soma

247

Như @pimvdb đã nói trong bình luận của mình,

Lưu ý rằng thay đổi sẽ chỉ kích hoạt khi phần tử đầu vào bị mất tiêu điểm. Ngoài ra còn có sự kiện đầu vào kích hoạt bất cứ khi nào hộp văn bản cập nhật mà không cần mất tập trung. Không giống như các sự kiện chính, nó cũng hoạt động để dán / kéo văn bản.

(Xem tài liệu .)

Điều này rất hữu ích, nó đáng để đưa nó vào một câu trả lời. Hiện tại (v1.8 *?) Không có fn thuận tiện .input () trong jquery, vì vậy cách để làm điều đó là

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

6
Đặc biệt, IE <9 hoàn toàn không hỗ trợ.
dlo

13
Vì bạn có thể liên kết với nhiều sự kiện $('form').on('change input', function);đã lừa tôi. Cảm ơn.
justnorris

9
@Norris. Điều đó có thể sẽ bắn hai lần khi một yếu tố được thay đổi (thứ 1) và mất tiêu điểm (thứ 2). Đó không phải là một vấn đề cho nhiều mục đích, nhưng vẫn đáng chú ý.
iPadDeveloper2011

Đã thử nghiệm tại IE9, backspace sẽ không bị sa thải
Jaskey

Lưu ý, điều này sẽ kích hoạt cho mọi thay đổi đầu vào được thực hiện (có thể là những gì bạn đang tìm kiếm). Nhưng, nếu bạn đang tìm kiếm một sự kiện như "Khi thay đổi hoàn thành", đây là một ví dụ tuyệt vời .
Trevor Nestman

79

Tôi sẽ đề nghị sử dụng sự kiện keyup như sau:

$('elementName').keyup(function() {
 alert("Key up detected");
});

Có một vài cách để đạt được kết quả tương tự vì vậy tôi đoán đó là tùy theo sở thích và phụ thuộc vào cách bạn muốn nó hoạt động chính xác.

Cập nhật: Điều này chỉ hoạt động cho đầu vào thủ công không sao chép và dán.

Để sao chép và dán tôi muốn giới thiệu như sau:

$('elementName').on('input',function(e){
 // Code here
});

Tôi chắc chắn đề nghị cái này cho đầu vào văn bản!
Vercas

20
Nội dung của phần tử đầu vào có thể được thay đổi mà không bị khóa. Ví dụ, bạn có thể dán văn bản bằng chuột.
celicni

Ngoài ra, thay đổi dường như vẫn được yêu cầu để chụp các hộp kiểm
turbo2oh

30

Đây là mã tôi sử dụng:

$("#tbSearch").on('change keyup paste', function () {
    ApplyFilter();
});

function ApplyFilter() {
    var searchString = $("#tbSearch").val();
    //  ... etc...
}

<input type="text" id="tbSearch" name="tbSearch" />

Điều này hoạt động khá độc đáo, đặc biệt khi kết hợp với một jqGridđiều khiển. Bạn chỉ có thể nhập vào một hộp văn bản và ngay lập tức xem kết quả trong của bạn jqGrid.


22

một và chỉ một cách đáng tin cậy để làm điều này , và đó là bằng cách kéo giá trị trong một khoảng và so sánh nó với một giá trị được lưu trữ.

Lý do tại sao đây là cách duy nhất là vì có nhiều cách để thay đổi trường đầu vào bằng nhiều cách nhập khác nhau (bàn phím, chuột, dán, lịch sử trình duyệt, giọng nói, v.v.) và bạn không bao giờ có thể phát hiện tất cả chúng bằng cách sử dụng các sự kiện tiêu chuẩn trong một chéo môi trường -browser.

May mắn thay, nhờ cơ sở hạ tầng sự kiện trong jQuery, việc thêm sự kiện trao đổi đầu vào của bạn khá dễ dàng. Tôi đã làm như vậy ở đây:

$.event.special.inputchange = {
    setup: function() {
        var self = this, val;
        $.data(this, 'timer', window.setInterval(function() {
            val = self.value;
            if ( $.data( self, 'cache') != val ) {
                $.data( self, 'cache', val );
                $( self ).trigger( 'inputchange' );
            }
        }, 20));
    },
    teardown: function() {
        window.clearInterval( $.data(this, 'timer') );
    },
    add: function() {
        $.data(this, 'cache', this.value);
    }
};

Sử dụng nó như: $('input').on('inputchange', function() { console.log(this.value) });

Có một bản demo ở đây: http://jsfiddle.net/LGAWY/

Nếu bạn sợ nhiều khoảng thời gian, bạn có thể liên kết / hủy liên kết sự kiện này trên focus/ blur.


Có thể làm cho mã của bạn hoạt động như thế này : $('body').on('inputchange', 'input', function() { console.log(this.value) });? Hoặc không, như được đề cập ở đây: github.com/EightMedia/hammer.js/pull/98 ?
TheFrost

13
Viết và khởi chạy một mã như vậy là một sự điên rồ với tác động hiệu suất cực cao.
Thủy thủ Danubian

@ UkaszLech Xin vui lòng, cho tôi biết về nó. Nhưng nếu bạn nhấn các sự kiện lấy nét / mờ như tôi cũng đã đề cập, khoảng thời gian sẽ chỉ chạy tạm thời. Chắc chắn, ngay cả một intel 386 từ năm 1988 có thể xử lý một khoảng thời gian duy nhất?
David Hellsing

5
<input id="item123" class="firstName" type="text" value="Hello there" data-someattr="CoolExample" />

$(".firstName").on('change keyup paste', function () {
   var element = $(this);
   console.log(element);
   var dataAttribute = $(element).attr("data-someattr");
   console.log("someattr: " + dataAttribute );
});

Tôi khuyên bạn nên sử dụng thistừ khóa để có quyền truy cập vào toàn bộ phần tử để bạn có thể làm mọi thứ bạn cần với phần tử này.


4

Những điều sau đây sẽ hoạt động ngay cả khi đó là các cuộc gọi động / Ajax.

Kịch bản:

jQuery('body').on('keyup','input.addressCls',function(){
  console.log('working');
});

Html

<input class="addressCls" type="text" name="address" value="" required/>

Tôi hy vọng mã làm việc này sẽ giúp được ai đó đang cố gắng truy cập động / các cuộc gọi Ajax ...


3
$("input").keyup(function () {
    alert("Changed!");
});

2

Bạn chỉ có thể làm việc với id

$("#your_id").on("change",function() {
    alert(this.value);
});

Điều này không thêm nhiều vào các câu trả lời hiện có.
Pang

2

Bạn có thể làm điều này theo những cách khác nhau, keyup là một trong số đó. Nhưng tôi đang đưa ra ví dụ dưới đây với sự thay đổi.

$('input[name="vat_id"]').on('change', function() {
    if($(this).val().length == 0) {
        alert('Input field is empty');
    }
});

NB: input [name = "vat_id"] thay thế bằng ID hoặc tên đầu vào của bạn .


2

Nếu bạn muốn kích hoạt sự kiện khi bạn nhập , hãy sử dụng như sau:

$('input[name=myInput]').on('keyup', function() { ... });

Nếu bạn muốn kích hoạt sự kiện khi rời khỏi trường nhập , hãy sử dụng như sau:

$('input[name=myInput]').on('change', function() { ... });

Vì một số lý do, điều này không hiệu quả với tôi, nhưng điều này đã làm:$(document).on('change', 'input[name=myInput]', function() { ... });
Stefan

1
@Stefan, mã trong ví dụ của bạn được gọi là ủy nhiệm sự kiện. Các trường đầu vào của bạn phải được thêm vào sau khi khởi tạo trang, đó là lý do tại sao mã của tôi không phù hợp với bạn.
Usman Ahmed

1
$("input").change(function () {
    alert("Changed!");
});

4
Vấn đề của tùy chọn này là chỉ hoạt động khi bạn mất tiêu điểm đầu vào
Yise

Điều đó vẫn sẽ phù hợp với một số trường hợp.
James Drinkard

1

Điều này làm việc cho tôi. Nếu trường có tên trườngA được nhấp hoặc bất kỳ khóa nào được nhập, trường sẽ cập nhật trường với id trườngB .

jQuery("input[name='fieldA']").on("input", function() {
    jQuery('#fieldB').val(jQuery(this).val());
});

0

Bạn có thể sử dụng .keypress().

Ví dụ: hãy xem xét HTML:

<form>
  <fieldset>
    <input id="target" type="text" value="Hello there" />
  </fieldset>
</form>
<div id="other">
  Trigger the handler
</div>

Trình xử lý sự kiện có thể được liên kết với trường đầu vào:

$("#target").keypress(function() {
  alert("Handler for .keypress() called.");
});

Tôi hoàn toàn đồng ý với Andy; tất cả phụ thuộc vào cách bạn muốn nó hoạt động.


1
Điều này không làm việc cho các hoạt động sao chép / dán. Không có sự kiện nào được kích hoạt nếu văn bản được dán bằng một cú click chuột.
DaveN59
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.