下面的代码是丑陋,但它正是你想要的(我认为)。基本上,我拦截所有onChange事件,并且只有在对应的onClick事件导致更改的值时才处理它们。还注意到更改事件在点击事件之前处理。编辑:只是介绍了这不适用于铬,所以我添加了一些浏览器检测代码,以便它只在Firefox执行。
注意:如果用户已将选项框标签并使用错误键进行了更改,则当前代码将不起作用,但下面的方法也可轻松适用于处理该情况。您只需按照向上箭头或向下箭头或TAB或ENTER键的方式处理关键事件,方法与下面的处理点击方式相同,但仅在选择框具有焦点时进行。
注2:玩这个更多,这种行为是非常奇怪的。如果您退出选择,onChange事件不会被触发,但会被保存起来。如果在以后任何时候点击屏幕上的onChange事件将被触发,以查找您在转义时悬停的值,即使该值在您转义后实际上已更改。所以这变得棘手。我想你可能需要分开处理这两个案件。一个处理点击的案例,一个处理逃跑出局(帕特里克回答)。
它变得毛茸茸的,我看不到优雅的方式来编码。如何在文本框旁边的用户提示“您当前选择的选项1不再可用”。然后你可以有一个只有可用选项的选择框。
<select name="select" size="1" onChange="handleChange()" onClick="handleClick()" >
<option>0</option>
<option selected disabled>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
<br />
<script>
var initialValue = document.getElementsByName('select')[0].selectedIndex;
var potentialChange;
var processClick;
function handleClick() {
//ignore this code if not firefox
if (navigator.userAgent.indexOf("Firefox") === -1)
return;
var curVal = document.getElementsByName('select')[0].selectedIndex;
if (!processClick)
return;
// a value change click occured, now we actually process it.
document.getElementsByName('select')[0].value = potentialChange;
}
function handleChange() {
// save the potential change, which will be used if a real click was detected
potentialChange = document.getElementsByName('select')[0].selectedIndex;
processClick = (potentialChange !== initialValue);
// undo the attempted change, in case of an escape or page click
// but only on firefox
if (navigator.userAgent.indexOf("Firefox")!=-1)
document.getElementsByName('select')[0].value = initialValue;
document.getElementsByName('select')[0].value = initialValue;
}
</script>
<a href="javaScript:alert(document.getElementsByName('select')[0].selectedIndex);">getSelected</a>
这是什么意图?对我来说,至少禁用和选择声音,因为它们应该是相互排斥的,虽然我无法在规范中找到明确说明这一点的任何地方,但我不确定为什么选择和禁用某些内容是有道理的。你想用这个做什么? – Chris
用户从框中选择一些东西。管理员可以启用或取消箱子中的物品。当用户选择并保存了一些值后,管理员禁用此项目,则用户应该将其设置看作禁用的选定项目。用户打开盒子,但没有找到他喜欢的任何其他选项,因此按下了ESC。但下一次保存会改变选定的值。 – oliholz
啊。我明白你来自哪里。对我而言,感觉就像解决方案不让用户继续拥有一个已被管理员明确禁用的值,并给他们一个“不适用”的选择或者强制他们选择一个新的。尽管我已经有了一些戏,并没有比亚历山大更进一步。当你失去焦点时,Firefox会明确地启动它的更改事件,这意味着浏览器认为它已被更改。也许如果保留这个选项实际上是有效的,那么如果它也被“选择”,你不想“禁用”。这似乎可以解决你的问题 – Chris