Sự kiện thay đổi Javascript trên phần tử đầu vào kích hoạt khi chỉ mất tiêu điểm


84

Tôi có một phần tử đầu vào và tôi muốn tiếp tục kiểm tra độ dài của nội dung và bất cứ khi nào độ dài trở nên bằng một kích thước cụ thể, tôi muốn bật nút gửi, nhưng tôi đang gặp sự cố với sự kiện thay đổi của Javascript là sự kiện chỉ kích hoạt khi phần tử đầu vào nằm ngoài phạm vi chứ không phải khi nội dung thay đổi.

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange không kích hoạt khi thay đổi nội dung của tên, nhưng chỉ kích hoạt khi tên mất tiêu điểm.

Tôi có thể làm gì để sự kiện này hoạt động trên cơ sở thay đổi nội dung không? hoặc một số sự kiện khác mà tôi có thể sử dụng cho việc này? Tôi đã tìm thấy một giải pháp khác bằng cách sử dụng chức năng onkeyup, nhưng điều đó không kích hoạt khi chúng tôi chọn một số nội dung từ trình hoàn thành tự động của trình duyệt.

Tôi muốn thứ gì đó có thể hoạt động khi nội dung của trường thay đổi dù bằng bàn phím hay bằng chuột ... có ý kiến ​​gì không?


Bạn có thể sử dụng onkeyuponchange?
James Allardice

1
Vấn đề duy nhất tôi gặp phải là lựa chọn tự động hoàn thành của trình duyệt sẽ không gây ra bất kỳ sự kiện nào trong số này.
Sachin Midha

Đây là loại trường đầu vào nào?
powtac

oh ... Tôi quên thêm nó vào mã mẫu, nó là một trường văn bản.
Sachin Midha

1
Tôi nghĩ đây sẽ là một vấn đề rất phổ biến & nhiều người sẽ phải đối mặt với nó, nhưng bây giờ có vẻ như vòng cách khác ... :)
Sachin Midha

Câu trả lời:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

Điều này sẽ bắt change, tổ hợp phím, paste, textInput, input(nếu có). Và không bắn nhiều hơn mức cần thiết.

http://jsfiddle.net/katspaugh/xqeDj/


Người giới thiệu:

textInput- loại sự kiện W3C DOM Level 3. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

Tác nhân người dùng phải gửi sự kiện này khi một hoặc nhiều ký tự đã được nhập. Các ký tự này có thể bắt nguồn từ nhiều nguồn khác nhau, ví dụ, các ký tự do một phím được nhấn hoặc nhả trên thiết bị bàn phím, từ quá trình xử lý của trình soạn thảo phương thức nhập hoặc do lệnh thoại. Trong trường hợp thao tác “dán” tạo ra một chuỗi ký tự đơn giản, tức là một đoạn văn bản không có bất kỳ thông tin cấu trúc hoặc kiểu nào, thì kiểu sự kiện này cũng phải được tạo.

input- một loại sự kiện HTML5 .

Kích hoạt các điều khiển khi người dùng thay đổi giá trị

Firefox, Chrome, IE9 và các trình duyệt hiện đại khác hỗ trợ nó.

Sự kiện này xảy ra ngay sau khi sửa đổi, không giống như sự kiện thay đổi, xảy ra khi phần tử mất tiêu điểm.


1
nó không hoạt động ... bạn đã kiểm tra mã của bạn ở cuối của bạn ?? nó đang hoạt động dựa trên lựa chọn từ trình tự động hoàn thành ...?
Sachin Midha

Tôi đã đăng ký textInputChrome 15 và nó hoạt động. Tôi đã kiểm tra inputsự kiện trong IE9 và nó cũng hoạt động. Firefox sẽ hỗ trợ DOMAttrModified, nhưng tôi chưa cài đặt nó. Hai sự kiện này là tốt nhất bạn có thể hy vọng, vì chúng kích hoạt trên bất kỳ loại đầu vào văn bản nào.
katspaugh

1
Giải pháp tuyệt vời .... đầu vào hoạt động đối với tôi như một sự may mắn ... không có gì khác ngoại trừ đầu vào là cần thiết, bản thân nó hoạt động đủ. nó hoạt động trên ff4, nhưng không trên 3.x, & I có 3.6 trên máy tính để bàn của tôi và nó không bao giờ làm việc ...
Sachin Midha

5
Vì lợi ích của việc giữ mọi thứ được cập nhật, hiện giải pháp này bị sa thải nhiều lần trên một sự thay đổi đầu vào duy nhất trong FF22, bạn không cần phải sử dụng các phím nhấn hoặc textinput sự kiện, đầu vào và propertychange nên đủ
cyber-bảo vệ

1
Tôi thấy rằng change, keyupinputlà sự kết hợp tốt nhất để bao gồm IE9 và Firefox (36.0.4). Sự keypresskiện này dường như không hoạt động trong IE9 vì nó không nắm bắt được những thứ như Delete và Backspace, và inputsự kiện bao gồm việc dán bằng bàn phím và với menu ngữ cảnh.
TLS

9

Như một phần mở rộng cho câu trả lời của katspaugh, đây là một cách để thực hiện điều đó cho nhiều phần tử bằng cách sử dụng một lớp css.

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

Tôi mất 30 phút để tìm thấy nó, nhưng tính năng này sẽ hoạt động vào tháng 6 năm 2019.

<input type="text" id="myInput" oninput="myFunction()">

và nếu bạn muốn thêm trình xử lý sự kiện theo chương trình trong js

inputElement.addEventListener("input", event => {})

3

Làm theo cách jQuery:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
Điều này cũng sẽ chỉ được kích hoạt khi trường mất focues.
Felix Kling

@Felix Kling, đúng, thay đổi nó để KeyUp ();)
powtac

một lần nữa vấn đề tương tự với keyup ... Tôi đã sử dụng nó và tôi đã gặp vấn đề với điều đó. đọc câu hỏi hoàn chỉnh của tôi.
Sachin Midha

0

Bạn có thể sử dụng onkeyup

<input id="name" onkeyup="checkLength(this.value)" />

Tôi đã sử dụng onkeyup ... nhưng vấn đề của tôi là khi người dùng chọn từ trình tự động hoàn thành của trình duyệt, thì sự kiện này không được kích hoạt ... Tôi đã viết điều này trong câu hỏi của mình trong cách giải quyết mà tôi đã sử dụng ...
Sachin Midha

0

Bạn sẽ phải sử dụng kết hợp onkeyuponclick(hoặc onmouseup) nếu bạn muốn nắm bắt mọi khả năng.

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

Rất vui, nhưng vấn đề ở đây là tôi không nhấn chuột vào phần tử đầu vào mà trên trình tự động hoàn thành, điều này sẽ không kích hoạt sự kiện này ...
Sachin Midha

Điều khác duy nhất mà tôi có thể nghĩ đến, và điều đó thật khó chịu là setTimeoutkiểm tra và định kỳ giá trị của trường ... Chính xác thì bạn đang muốn làm gì?
DaveRandom

Nó rất khó chịu ...: D nó tương tự như những gì một chỉ báo độ mạnh của mật khẩu, nó cho bạn biết độ mạnh của mật khẩu khi bạn tiếp tục nhập vào nó. Tôi chỉ muốn bật một nút khi chuỗi đã nhập có độ dài 10, nếu không, hãy tắt nó đi. Tôi hy vọng bạn hiểu được nó ...
Sachin Midha

0

Đây là một giải pháp khác mà tôi phát triển cho cùng một vấn đề. Tuy nhiên, tôi sử dụng nhiều hộp nhập nên tôi giữ giá trị cũ làm thuộc tính do người dùng xác định của chính các phần tử: "data-value". Sử dụng jQuery rất dễ quản lý.

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

ở đây là, tôi đã sử dụng 5-6 hộp đầu vào có lớp 'filterBox', tôi chỉ chạy phương thức filterBy nếu data-value khác với giá trị của chính nó.

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.