在我的應用程序中,我有一個<select>
控件的列表。在用戶確認之後,在這些控件中的每一箇中的選擇的改變可以僅被做出。所以,我對付它,如下所示:JavaScript(jQuery):取消選擇控件中的選擇在FireFox中
<select onchange="changeSelect(this)" onmousedown="clickSelect(this)">
<option value="1" selected="true">A</option> // here is 'default' value 1
<option value="2" >B</option>
</select>
<select onchange="changeSelect(this)" onmousedown="clickSelect(this)">
<option value="1" >A</option>
<option value="2" selected="true">B</option> // here is 'default' value 2
</select>
// more select controls with arbitrary 'default' values, they can be added and removed dynamically
當用戶點擊選擇選擇其他選項,clickSelect(this)
方法保存當前選擇的(舊)選擇:
function clickSelect(select) {
globalScope.previouslySelected = $(select).val();
}
而現在,如果用戶確實想改變選擇,我請求用戶確認,如果她沒有確認,我使用保存的值恢復到以前的狀態:
function changeSelect(select) {
var response = confirm("Current changes to the threat log will be lost. Continue anyway?");
if (response == false) {
// change it back
$(select).val(globalScope.previouslySelected);
return;
}
}
}
現在,IE,Chrome瀏覽器nd Opera它工作得很好。但是,當我使用Firefox時,它不起作用。原因在於FF在選擇期間調用onmousedown
處理程序兩次 - 第一次用戶單擊以滾動選擇控件時,第二次選擇新選擇時。因此,globalScope.previouslySelected
的最後記憶值將成爲新的選定值,而不是其他瀏覽器中的舊值。
我知道使用全局變量被認爲是不好的做法。這不是問題。使用任何其他存儲將不會使其工作。
我現在唯一的想法是在clickSelect(select)
處理程序中編寫一段Firefox特定的代碼,並忽略第二個通知。然而,由於某些原因,下面的代碼我在堆棧溢出發現行不通:
if($.browser.mozilla) {
console.log("Olalala");
}
例如,在Chrome它拋出以下異常:
Uncaught TypeError: Cannot read property 'mozilla' of undefined
所以,我怎樣才能使它工作,使TI只會在FF中運行?或者,如果你們中的任何一個人對於確認問題有更好的解決方案,我很樂意聽到它。請記住,有一組動態的選擇控件,而不僅僅是一個。它必須爲所有人工作。另外,它們可以動態添加或刪除,因此在單個頁面請求中,它們的編號可能會有所不同。用戶使用單個選擇控件加載頁面,按下「+」按鈕並添加另一個選擇控件等,但解決方案必須與所有控件一起工作。
聽起來很對我。您可以通過onChange事件完成所有操作。 – wwwmarty
不是。所有選擇控件都沒有單個默認選項。第一個控件可以從值1開始,第二個控件可以從值2開始,等等。每個選擇控件都有一個變量會導致更復雜的代碼。要編輯問題以使其更清晰。 –
我可以想象它可以用你的方式完成。但是,如果可以確定代碼是否在FF上運行,我認爲我需要對代碼執行的操作只需添加幾行代碼即可。不是一個非常強大的解決方案,但工作。 –