这肯定是 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;
实时测试用例- 现在即使在 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。
更新小提琴- 在 Firefox、Chrome、IE9 和 IE8 中工作。