Açık simgeli IE10'da metin girişi temizlenirken olay tetiklendi


83

Chrome'da, kullanıcı temizle düğmesini tıkladığında arama girişlerinde "arama" olayı tetiklenir.

Internet Explorer 10'da javascript'te aynı olayı yakalamanın bir yolu var mı?

görüntü açıklamasını buraya girin



Hayır, bu tamamen IE10 ile ilgili. Webkit'te bununla nasıl başa çıkacağımı biliyorum.
gusse

Alanı temizlerken IE10'da ateşlenen bir olay yok.
wakooka

2
Hmm, yine de denemeye değer olabilir ancak görünüşe göre IE'de hatalı bir 'giriş' etkinliği var: help.dottoro.com/ljhxklln.php (yalnızca metin eklendiğinde, kaldırıldığında değil, tetiklendiğinde tetiklenir!)
natevw

3
@ghusse 'input' olayı ateşleniyor.
kzh

Yanıtlar:


72

Sonunda bulduğum tek çözüm:

// 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
Teşekkürler Ghusse! Birisi başka bir çözüm bulursa (setTimeout olmadan) bana bildirin.
O Nrik

Bu, ASP.NET / jQuery / IE11 için de çalışır. $ ("İnput") yerine. Bind ("mouseup", function (e) {$ ('# <% = MyTextBox.ClientID%>') kullanmanız gerekir. Mouseup (function () {
Joe Schmoe

3
Lucent'in aşağıdaki çözümü benim için IE11'de çalışıyor. Onun çözümü oninputbunun yerine olayı kullanmaktır. X simgesine bastığınızda inputolay tetiklenir.
iheartcsharp

if ifadesi olmamalı if (oldValue === "")mı?
Dylan Czenski

Lucent'in input-event ile çözümü işe yararken, bu çözüm yalnızca öğe temizlendiğinde tetiklenirken, Lucent'in de imleç öğeye girdiğinde, öğeden ayrıldığında ve ayrıca veri girildiğinde ateşlenir.
spheenik

40

oninputOlay ile ateşler this.valueboş bir dizeye seti. Bu, benim için sorunu çözdü, çünkü arama kutusunu X ile veya geriye doğru boşluk bırakarak temizlesinler aynı eylemi yürütmek istiyorum. Bu yalnızca IE 10'da çalışır.


1
bu benim için IE10'da da işe yarıyor, IE'deki önceki sürümlerde açık alan düğmesi olduğunu düşünmeyin, bu nedenle yalnızca IE10 için çalışmanız gerekir
andyface

3
IE11'de de çalışıyor!
AfroMogli

1
Bu, Chrome ve Firefox'ta da çalışır ve ayrıca kullanıcı fareyi sağ tıkladığında ve değeri kestiğinde tetiklenir. Kullanımını bu kanca için: inputEl.addEventListener('input', function(){ /* DoSomething */ }).
Derek

32

inputBunun yerine kullanın . Tüm tarayıcılarda aynı davranışla çalışır.

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

1
Belge Modu 5'te IE 11'de çalışmaz, Kapanış ayracı eksik, btw.
Bernhard Döbler

10

Neden olmasın

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

1
Ya kullanıcı klavyesiyle bazı metinleri kaldırdıysa?
gusse

@ghusse Bir metin alanını, o düğmeyi kullanmadan, bir tıklama ve sürükleme ile de temizleyebilirsiniz. Bu yüzden kabul edilen cevap da başarısız olacaktır. Sanırım OP soruyu sordu çünkü bir kullanıcı alanı temizle düğmesine bastığında, bir olay ile bilgilendirilmek istiyor.
Ertuğ

Bir tıklama ve sürükleme ile, klavyenizin del düğmesine basmak dışında bir metin alanını nasıl temizleyeceğimi göremiyorum.
gusse

@ghusse Lütfen tüm metni seçin ve başka bir metin kutusuna sürüklemeyi deneyin. Bu sizin için çalışmıyorsa Alt tuşuna basılı tutarak deneyin.
Ertuğ

Günün sonunda bu daha iyi cevap gibi görünüyor, ancak soruya% 100 özel olmayabilir. Her türlü durumu kapsıyor gibi görünüyor, hatta kromdan otomatik tamamlamalar bile.
AR

8

Bu sorunun yanıtlandığını biliyorum, ancak kabul edilen yanıt bizim durumumuzda işe yaramadı. IE10 ifadeyi tanımadı / ateşlemedi $input.trigger("cleared");.

Nihai çözümümüz, bu ifadeyi ENTER tuşundaki bir keydown olayıyla değiştirdi (kod 13). Gelecek nesil için, bizim durumumuzda işe yarayan buydu:

$('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);
});

Ayrıca, bu bağlamayı sayfadaki her girişe değil, yalnızca "arama" girişlerine uygulamak istedik. Doğal olarak, IE de bunu zorlaştırdı ... kodlamamıza rağmen <input type="search"...>, IE onları olarak yaptı type="text". Bu nedenle jQuery seçicisi type="text".

Şerefe!


i yerine (kodum 2 karakter için görünüyor ve otomatik arama keyUp üzerine) keyUp tetiklenen rağmen, benim için çalıştı, parlak
punkologist

6

Sadece inputolayı dinleyebiliriz . Bakınız başvuru detayları için. IE'de Sencha ExtJS'de temizle düğmesiyle ilgili bir sorunu şu şekilde düzelttim:

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
Bu cevap MS Edge için işe yarar, arama alanını temizlemek için "x" e tıklandığında "giriş" olayı tetiklenir.
Mottie

Vanilla js kullanıyorum ve MS Edge, X'e tıklandığında giriş olayını tetiklemiyor. Zaten böyle bir olayı izlemeye çalışmak kötü bir fikirdi sanırım. Normal formlar gibi bir düğme kullansanız iyi olur.
Rivenfall

2

Kutudan çıkan bir çözüm, X'ten tamamen CSS ile kurtulmaktır:

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

Bunun aşağıdaki faydaları vardır:

  1. Çok daha basit çözüm - tek hatta sığar
  2. Tüm girişler için geçerlidir, böylece her giriş için bir işleyicinizin olması gerekmez
  3. Mantıkta hata olan javascript'i kırma riski yok (daha az QA gerekli)
  4. Tarayıcılar genelinde davranışı standartlaştırır - IE'nin Chrome'un X'e sahip olmadığı kromla aynı davranmasını sağlar

1

asp.net sunucu kontrolüm için

<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

MSDN onchange olayı - IE10'da test edildi.

... veya CSS ile gizlemek için:

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

0

Yukarıdaki kod benim durumumda çalışmıyordu ve bir satırı değiştirdim ve $input.typeahead('val', '');benim durumumda hangisinin çalıştığını tanıttım ..

// 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);
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.