【问题标题】:Onchange in Firefox is triggered without changingFirefox中的onchange被触发而不改变
【发布时间】:2012-04-30 08:21:32
【问题描述】:

我有一个选择,为此设置了 onchange 事件。
问题是,仅在 Firefox(FF v. 12)中,即使用户没有单击任何选项,也会触发 onchange 事件; 只需悬停该选项即可触发它。

即:如果用户单击选择,悬停选项之一,然后在选择之外单击,则选择的值会更改(即使显示的值没有)因此触发事件。

如果选择的元素之一已被选中,则不会发生这种情况。 该行为与此 Mozilla 错误中的行为或多或少相同: https://bugzilla.mozilla.org/show_bug.cgi?id=265047

【问题讨论】:

  • 转载:jsfiddle.net/BRLT9 打开下拉菜单,将其中一项悬停并聚焦文本框。 (这里是 Firefox 11,所以它不是一个新错误顺便说一句)

标签: javascript firefox select dom-events onchange


【解决方案1】:

这肯定是 Firefox 中的一个错误,当没有定义选定的索引时,它会在悬停项目时分配选定的值和选定的索引。

虽然我无法修复该错误,但一种非常简单且有效的解决方法是将空和隐藏项添加到列表中作为第一项并将其分配为选定项。

例如:

<select id="mySelect">
    <option value="" style="display: none;"></option>
    <option value="1">first</option>
    <option value="2">second</option>
</select>

用户不会看到任何变化,当您“清除”选择时,将选定的索引指定为 0 而不是 -1,例如

var oDDL = document.getElementById("mySelect");
oDDL.selectedIndex = 0;

Live test case - 现在即使在 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");
    };
};

识别浏览器的函数取自this answer

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

【讨论】:

  • 效果很好,谢谢!无论如何,我想知道如何成为“Firefox 设计选择”,正如有人认为的那样:我看不到任何好处......
  • @Pierpaolo 很高兴我能帮上忙!也看不到好处,我猜这只是设计布上覆盖的旧虫子。 :)
  • 嗯,这是一个常见的笑话,我想:当有人发现一个错误时,第一条评论是“这不是一个错误,它是一个功能!” :D
  • 如何隐藏 Internet Explorer 8 中的第一项?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多