Javascript Firefox中的Onchange会在不进行更改的情况下触发

Javascript Firefox中的Onchange会在不进行更改的情况下触发,javascript,firefox,select,dom-events,onchange,Javascript,Firefox,Select,Dom Events,Onchange,我有一个select,为其设置了一个onchange事件。 问题是,仅在Firefox(FF第12版)中,即使用户没有点击任何选项,onchange事件也会被触发; 只要悬停该选项,就足以触发它 i、 e:如果用户单击select,将其中一个选项悬停,然后在select之外单击,则select的值会发生更改(即使显示的值没有更改),从而触发事件 如果已经选择了select的一个元素,则不会发生这种情况。 该行为与此Mozilla bug中的行为大致相同: 这肯定是Firefox中的一个bug,在

我有一个select,为其设置了一个
onchange
事件。
问题是,仅在Firefox(FF第12版)中,即使用户没有点击任何选项,
onchange
事件也会被触发; 只要悬停该选项,就足以触发它

i、 e:如果用户单击select,将其中一个选项悬停,然后在select之外单击,则select的值会发生更改(即使显示的值没有更改),从而触发事件

如果已经选择了select的一个元素,则不会发生这种情况。 该行为与此Mozilla bug中的行为大致相同:

这肯定是Firefox中的一个bug,在没有定义选定索引的情况下,在悬停项目时分配选定值和选定索引

虽然我无法修复这个bug,但一个非常简单有效的解决方法是将空的和隐藏的项添加到列表中作为第一项,并将其指定为选定项

例如:

<select id="mySelect">
    <option value="" style="display: none;"></option>
    <option value="1">first</option>
    <option value="2">second</option>
</select>
-即使现在在Firefox上也能正常工作

更新-上述代码在IE8中工作不正常,因为它仍然显示第一个空选项。为了解决这个问题,当浏览器不是Firefox时,可以在所有支持它的浏览器中删除该选项。更新代码为:

navigator.sayswho = (function(){
    var N = navigator.appName, ua= navigator.userAgent, tem;
    var M = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if (M && (tem = ua.match(/version\/([\.\d]+)/i)) != null) M[2] = tem[1];
    M = M? [M[1], M[2]]: [N, navigator.appVersion, '-?'];
    return M;
})();

window.onload = function() {
    var oDDL = document.getElementById("mySelect");
    oDDL.selectedIndex = 0;
    var blnFirefox = (navigator.sayswho[0].toLowerCase().indexOf("firefox") >= 0);
    if (!blnFirefox && oDDL.remove) {
        oDDL.remove(0);
        oDDL.selectedIndex = -1;
    }
    oDDL.onchange = function() {
        alert("hello");
    };
};
标识浏览器的函数取自


-在Firefox、Chrome、IE9和IE8中工作。

复制:打开下拉列表,悬停其中一个项目并聚焦文本框。(这里是Firefox11,所以它不是一个新的bug顺便说一句)它工作得很好,谢谢!不管怎么说,我一直在想,怎么可能是一个“Firefox设计选择”,因为有人认为:我看不到任何好处…@Pierpaolo为我能帮上忙而欢呼!我也看不到它的好处,我猜这只是一个覆盖在设计布上的老bug。:)嗯,这是一个常见的笑话,我想:当有人发现一个bug时,第一个评论是“它不是bug,它是一个功能!”:我如何在InternetExplorer8中隐藏第一项?
navigator.sayswho = (function(){
    var N = navigator.appName, ua= navigator.userAgent, tem;
    var M = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if (M && (tem = ua.match(/version\/([\.\d]+)/i)) != null) M[2] = tem[1];
    M = M? [M[1], M[2]]: [N, navigator.appVersion, '-?'];
    return M;
})();

window.onload = function() {
    var oDDL = document.getElementById("mySelect");
    oDDL.selectedIndex = 0;
    var blnFirefox = (navigator.sayswho[0].toLowerCase().indexOf("firefox") >= 0);
    if (!blnFirefox && oDDL.remove) {
        oDDL.remove(0);
        oDDL.selectedIndex = -1;
    }
    oDDL.onchange = function() {
        alert("hello");
    };
};