下面的代碼是醜陋,但它正是你想要的(我認爲)。基本上,我攔截所有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