Sự kiện được kích hoạt khi xóa dữ liệu nhập văn bản trên IE10 với biểu tượng rõ ràng


82

Trên chrome, sự kiện "tìm kiếm" được kích hoạt trên đầu vào tìm kiếm khi người dùng nhấp vào nút xóa.

Có cách nào để nắm bắt cùng một sự kiện trong javascript trên Internet Explorer 10 không?

nhập mô tả hình ảnh ở đây



Không, đây là tất cả về IE10. Trên webkit, tôi biết cách xử lý điều này.
ghusse

Không có sự kiện nào được kích hoạt trong IE10 khi xóa trường.
wakooka

1
Hmm, vẫn có thể là một thử giá trị nhưng có vẻ như IE cũng có một lỗi 'đầu vào' sự kiện: help.dottoro.com/ljhxklln.php (bị sa thải chỉ khi văn bản được thêm vào, không phải khi loại bỏ!)
natevw

3
@ghusse sự kiện 'đầu vào' bị kích hoạt.
kzh

Câu trả lời:


72

Giải pháp duy nhất cuối cùng tôi đã tìm thấy:

// There are 2 events fired on input element when clicking on the clear button:
// mousedown and mouseup.
$("input").bind("mouseup", function(e){
  var $input = $(this),
      oldValue = $input.val();

  if (oldValue == "") return;

  // When this event is fired after clicking on the clear button
  // the value is not cleared yet. We have to wait for it.
  setTimeout(function(){
    var newValue = $input.val();

    if (newValue == ""){
      // Gotcha
      $input.trigger("cleared");
    }
  }, 1);
});

1
Cảm ơn Ghusse! Nếu ai đó nghĩ ra bất kỳ giải pháp nào khác (không có setTimeout), hãy cho tôi biết.
He Nrik

Điều này cũng hoạt động cho ASP.NET / jQuery / IE11. Thay vì $ ("input"). Bind ("mouseup", function (e) {bạn cần sử dụng $ ('# <% = MyTextBox.ClientID%>'). Mouseup (function () {
Joe Schmoe

3
Giải pháp của Lucent dưới đây phù hợp với tôi trong IE11. Giải pháp của anh ấy là sử dụng oninputsự kiện thay thế. Khi bạn nhấn biểu tượng X, inputsự kiện sẽ kích hoạt.
iheartcsharp

không nên câu lệnh if if (oldValue === "")?
Dylan Czenski

Trong khi giải pháp của Lucent với input-event hoạt động, giải pháp này vượt trội hơn ở chỗ nó chỉ kích hoạt khi phần tử bị xóa, trong khi Lucent's cũng kích hoạt khi con trỏ đi vào phần tử, rời khỏi phần tử và cả khi dữ liệu đã được nhập.
Sphereenik

40

Sự oninputkiện kích hoạt khi this.valueđược đặt thành một chuỗi trống. Điều này đã giải quyết được vấn đề cho tôi, vì tôi muốn thực hiện cùng một hành động cho dù họ xóa hộp tìm kiếm bằng X hay bằng khoảng cách lùi. Điều này chỉ hoạt động trong IE 10.


1
công trình này cho tôi quá trong IE10, không nghĩ rằng các phiên bản trước đây về trình duyệt IE có một nút lĩnh vực rõ ràng, vì vậy chỉ nên cần phải làm việc cho IE10
andyface

3
Hoạt động tốt trên IE11!
AfroMogli

1
Điều này cũng hoạt động trong Chrome và Firefox và cũng kích hoạt khi người dùng nhấp chuột phải và cắt giá trị. Để treo lên sử dụng này: inputEl.addEventListener('input', function(){ /* DoSomething */ }).
Derek

31

Sử dụng inputthay thế. Nó hoạt động với cùng một hành vi trong tất cả các trình duyệt.

$(some-input).on("input", function() { 
    // update panel
});

1
Không hoạt động trong IE 11 ở Chế độ Tài liệu 5, Thiếu dấu ngoặc nhọn, btw.
Bernhard Döbler

10

Tại sao không

$("input").bind('input propertychange', function() {
    if (this.value == ""){
      $input.trigger("cleared");
    }
});

1
Điều gì sẽ xảy ra nếu người dùng chỉ cần xóa một số văn bản bằng bàn phím của mình?
ghusse

@ghusse Bạn cũng có thể xóa trường văn bản bằng cách nhấp và kéo mà không cần sử dụng nút đó. Vì vậy, anwer được chấp nhận cũng sẽ thất bại. Tôi đoán OP đã đặt câu hỏi vì khi người dùng nhấn vào nút trường xóa, anh ta muốn được thông báo về một sự kiện.
Ertug

Với một lần nhấp và một lần kéo, tôi không thể thấy cách xóa trường văn bản ngoại trừ bằng cách nhấn nút del trên bàn phím của bạn.
ghusse

@ghusse Vui lòng chọn tất cả văn bản và thử kéo sang hộp văn bản khác. Nếu cách đó không hiệu quả, bạn hãy thử nhấn phím Alt.
Ertug,

Có vẻ như đây là câu trả lời tốt hơn vào cuối ngày, mặc dù có thể không cụ thể 100% cho câu hỏi. Có vẻ như bao gồm tất cả các loại trường hợp, ngay cả tự động hoàn thành từ chrome.
AR

8

Tôi nhận thấy câu hỏi này đã được trả lời, nhưng câu trả lời được chấp nhận không hoạt động trong tình huống của chúng tôi. IE10 không nhận dạng / kích hoạt $input.trigger("cleared");câu lệnh.

Giải pháp cuối cùng của chúng tôi đã thay thế câu lệnh đó bằng sự kiện keydown trên phím ENTER (mã 13). Đối với hậu thế, đây là những gì đã hoạt động trong trường hợp của chúng tôi:

$('input[type="text"]').bind("mouseup", function(event) {
    var $input = $(this);
    var oldValue = $input.val();
    if (oldValue == "") {
        return;
    }
    setTimeout(function() {
        var newValue = $input.val();
        if (newValue == "") {
            var enterEvent = $.Event("keydown");
            enterEvent.which = 13;
            $input.trigger(enterEvent);
        }
    }, 1);
});

Ngoài ra, chúng tôi chỉ muốn áp dụng ràng buộc này cho các đầu vào "tìm kiếm", không phải mọi đầu vào trên trang. Đương nhiên, IE cũng làm điều này khó khăn ... mặc dù chúng tôi đã viết mã <input type="search"...>, IE đã hiển thị chúng như vậy type="text". Đó là lý do tại sao bộ chọn jQuery tham chiếu đến type="text".

Chúc mừng!


rực rỡ, làm việc cho tôi, mặc dù tôi kích hoạt KeyUp thay vì (ngoại hình của tôi mã cho 2 ký tự và tìm kiếm tự động trên KeyUp)
punkologist

6

Chúng ta chỉ có thể lắng nghe inputsự kiện. Vui lòng xem tham khảo để biết chi tiết. Đây là cách tôi khắc phục sự cố với nút xóa trong Sencha ExtJS trên IE:

Ext.define('Override.Ext.form.field.ComboBox', {
    override: 'Ext.form.field.ComboBox',

    onRender: function () {
        this.callParent();

        var me = this;
        this.inputEl.dom.addEventListener('input', function () {
            // do things here
        });
    }
});

1
Câu trả lời này hoạt động cho MS Edge, sự kiện "đầu vào" được kích hoạt khi nhấp vào "x" để xóa trường tìm kiếm.
Mottie

Tôi đang sử dụng vani js và MS Edge không kích hoạt sự kiện đầu vào khi nhấp vào X. Tôi đoán dù sao cũng là một ý tưởng tồi khi cố gắng xem sự kiện như vậy. Tốt hơn hãy sử dụng một nút như các biểu mẫu bình thường.
Rivenfall

2

Một giải pháp hữu ích là chỉ cần loại bỏ hoàn toàn X bằng CSS:

::-ms-clear { display: none; } /* see /programming/14007655 */

Điều này có những lợi ích sau:

  1. Giải pháp đơn giản hơn nhiều - vừa vặn trên một dòng
  2. Áp dụng cho tất cả các đầu vào, do đó bạn không cần phải có trình xử lý cho mỗi đầu vào
  3. Không có nguy cơ phá vỡ javascript với lỗi logic (ít QA cần thiết hơn)
  4. Chuẩn hóa hành vi trên các trình duyệt - làm cho IE hoạt động giống như chrome ở chỗ chrome không có X

1

để kiểm soát máy chủ asp.net của tôi

<asp:TextBox ID="tbSearchName" runat="server" oninput="jsfun_tbSearchName_onchange();"></asp:TextBox>

js

function jsfun_tbSearchName_onchange() {
    if (objTbNameSearch.value.trim() == '')
            objBTSubmitSearch.setAttribute('disabled', true);
        else
            objBTSubmitSearch.removeAttribute('disabled');
        return false;
}

ref

Sự kiện trao đổi MSDN - được thử nghiệm trong IE10.

... hoặc ẩn bằng CSS:

input[type=text]::-ms-clear { display: none; }

0

Đoạn mã trên không hoạt động trong trường hợp của tôi và tôi đã thay đổi một dòng và giới thiệu dòng $input.typeahead('val', '');nào hoạt động trong trường hợp của tôi ..

// There are 2 events fired on input element when clicking on the clear button:// mousedown and mouseup.
$("input").on('mouseup', function(e){
    var $input = $(this),
    oldValue = $input.val();
    if (oldValue === ''){
        return;
    }
    // When this event is fired after clicking on the clear button // the value is not cleared yet. We have to wait for it.
    setTimeout(function(){
        var newValue = $input.val();
        if (newValue === ''){
            $input.typeahead('val', '');
            e.preventDefault();
        }
    }, 1);
});
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.