如何在IE中找到导致选择框的onChange事件的原因 - 键盘或鼠标?

时间:2012-02-07 14:27:24

标签: javascript jquery internet-explorer select onchange

有没有办法找出导致Internet Explorer(> = IE8)中选择框上的onChange事件的原因 - 键盘还是鼠标?

我有一个代码可以在用户选择一个值时执行某些操作,而且此代码在Firefox和Chrome中运行良好,但在IE中则不行(不出意外,呵呵)。在IE中它只有在用户使用鼠标但不使用键盘时才能正常工作,因为它会在每个按键上触发onchange事件(而不是像普通浏览器那样输入)。

因此,要解决此问题,我需要知道是否使用键盘触发了事件,然后我将对其进行过滤。

更新

好的,玩了一下之后我找到了一个很好的解决方案。将它发布在这里以防有人发现它有用。下面的解决方案使用jQuery,但它也可以在纯Javascript中完成。

这是导致问题的代码:

$("#mySelectBox").change(function () {
    // Do something
});

这是我的解决方案。它可能并不完美,但它适用于我的情况。当然,事件处理程序可以在jQuery中链接。下面的代码存储了select的初始值,并使用它来避免在初始鼠标单击时执行某些操作 - 当用户展开选择框时。此外,它还会过滤除Enter之外的所有按键。

function doSomething(el) {
    if (el.data["valueOnFocused"] !== el.val()) {
        // Do something
    }
}

$("#mySelectBox").focusin(function () {
    $(this).data["valueOnFocused"] = $(this).val();
});

$("#mySelectBox").keyup(function (e) {
    if (e.which === 13)
    {
        doSomething($(this));
    }
});

$("#mySelectBox").click(function () {
    doSomething($(this));
});

1 个答案:

答案 0 :(得分:1)

当用户做出选择然后离开输入(无论是选择,文本框,单选按钮等)时,onchange事件基本上是假定被触发。由于这在IE中不起作用,您可以尝试使用onblur来检测用户何时实际离开该框。此时,您可以阅读选择了哪个项目并采取相应措施。这更像是一种解决方法,但可能会满足您的需求。

编辑:另一个选项是检测按Enter键,如下所示:

if(e && e.which){ // NN4 specific code
e = e
characterCode = e.which
}
else {
e = event
characterCode = e.keyCode // IE specific code
}

characterCode变量现在具有按下按钮的“代码”。如果是输入键,则该代码为13.您可以听取此信息。