清除IE10上带有清除图标的文本输入时触发事件

时间:2013-01-24 09:55:24

标签: javascript events internet-explorer-10 html-input

在Chrome上,当用户点击清除按钮时,会在搜索输入上触发“搜索”事件。

有没有办法在Internet Explorer 10上的javascript中捕获相同的事件?

enter image description here

9 个答案:

答案 0 :(得分:66)

我最终找到的唯一解决方案:

// 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 :(得分:40)

oninput事件触发,this.value设置为空字符串。这解决了我的问题,因为我想执行相同的操作,无论他们用X还是通过退格清除搜索框。这仅适用于IE 10。

答案 2 :(得分:28)

请改用input。它在所有浏览器下都具有相同的行为。

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

答案 3 :(得分:10)

为什么不

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

答案 4 :(得分:8)

我意识到这个问题已得到解答,但接受的答案在我们的情况下不起作用。 IE10无法识别/触发$input.trigger("cleared");声明。

我们的最终解决方案用ENTER键上的keydown事件替换了该语句(代码13)。对于后人来说,这就是我们的案例:

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

此外,我们希望仅将此绑定应用于“搜索”输入,而不是应用于页面上的每个输入。当然,IE也很困难......尽管我们编码<input type="search"...>,IE将它们渲染为type="text"。这就是jQuery选择器引用type="text"

的原因

干杯!

答案 5 :(得分:6)

我们可以只听取input事件。有关详细信息,请参阅the reference。这就是我在IE上使用Sencha ExtJS中的清除按钮解决问题的方法:

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
        });
    }
});

答案 6 :(得分:1)

用于我的asp.net服务器控件

<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;
}

参考

MSDN onchange event - 在IE10中测试。

...或用CSS隐藏:

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

答案 7 :(得分:1)

一种开箱即用的解决方案是仅使用CSS完全摆脱X:

::-ms-clear { display: none; } /* see https://stackoverflow.com/questions/14007655 */

这具有以下好处:

  1. 更简单的解决方案-只需一行即可
  2. 适用于所有输入,因此您不必为每个输入都配备处理程序
  3. 没有逻辑上的错误破坏javascript的风险(无需进行质量检查)
  4. 标准化跨浏览器的行为-使IE的行为与chrome相同,因为chrome没有X

答案 8 :(得分:0)

上面的代码在我的情况下不起作用,我更改了一行,并介绍了$input.typeahead('val', '');,这在我的案例中有用..

// 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);
});