Internet Explorer 10 "input" 数据列表选项选择事件未触发

Internet explorer 10 "input" event on datalist option selection not firing

在下面的示例中,我有一个输入字段和随附的数据列表元素。我正在尝试编写 javascript 来监听用户从列表中选择项目的时间。我已经看到它建议为此使用 "input" 事件,并且在 Chrome、Firefox 等中它都有效。问题是 Internet Explorer。

在 IE10 中我得到以下行为:

查看测试:

$('input').on('input', function(){
    console.log($('input').val());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input list="ice-cream-flavors" id="ice-cream-choice" name="ice-cream-choice" />

<datalist id="ice-cream-flavors">
    <option value="Chocolate">
    <option value="Coconut">
    <option value="Mint">
    <option value="Strawberry">
    <option value="Vanilla">
</datalist>

有没有人对我如何强制 Internet Explorer 触发该(或任何)事件有任何建议,以便我可以 运行 用户做出选择时的功能?

我 运行 在 IE11 上遇到了同样的问题,基于此制作了自定义自动完成列表:https://www.w3schools.com/howto/howto_js_autocomplete.asp

一些测试表明,当点击离开输入框时(即失去焦点时),IE11 会触发 input 事件。与其他浏览器一样,预期的行为是仅在输入字段中输入文本(包括退格键)时触发此事件。

解决办法是在IE中检查输入值是否发生了变化,像这样:

function inputEventGeneral(input, fn) { //input event for any browser
    if (checkBrowserIE()) {
        inputEventIE(input, fn);
    } else {
        input.addEventListener('input', function (e) { //normal input event for Chrome, FF, etc.
            fn(this); //run this function on input
        });
    };
};

function inputEventIE(input, fn) { //input event for IE
    let curr = '';
    let prev = '';

    input.addEventListener('input', function (e) {
        curr = this.value;

        if (prev === curr) { //check if value changed
            return;
        };

        prev = curr; //update value of prev

        fn(this); //run this function only if the value has been changed
    });
};


function checkBrowserIE() {
    return (/Trident/.test(navigator.userAgent)); //
};

在IE中,也存在文本输入框'x'清除按钮的问题,使用上述代码时不会触发输入事件。为此,您可以 a) 简单地使用 CSS 隐藏清除按钮,如下所示:

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

或 b) 您可以修改上面的代码以将 prev 的值存储在 data-prev 属性或全局变量中,然后使用输入表单值的任何更改更新它 (例如,当从自动完成 list/datalist 中选择时)。这将导致事件在单击清除按钮时触发,因为 prev 值 (val) 将不同于 curr 值 ('')清除时。

希望对您有所帮助!