2015-08-25 82 views
0

在我的應用程序中,我有一個<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中運行?或者,如果你們中的任何一個人對於確認問題有更好的解決方案,我很樂意聽到它。請記住,有一組動態的選擇控件,而不僅僅是一個。它必須爲所有人工作。另外,它們可以動態添加或刪除,因此在單個頁面請求中,它們的編號可能會有所不同。用戶使用單個選擇控件加載頁面,按下「+」按鈕並添加另一個選擇控件等,但解決方案必須與所有控件一起工作。

回答

2

是否存在使用onmousedown偵聽器保存當前選定選項的特定原因?您可以初始化您的全局變量以保存默認選項,並在進行新選擇時更新它。

事情是這樣的:

HTML

<select id="mySelect" onchange="changeSelect(this)"> 
    <option value="1" >A</option> 
    <option value="2" >B</option> 
</select> 

JS

var globalScope = {previouslySelected: $("#mySelect").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; 
    } 

    globalScope.previouslySelected = $(select).val(); 
} 

編輯

我注意到,在Firefox,第二鼠標按下事件的目標是選項,所以你可以使用下面的代碼來忽略該事件在這種情況下:

$("select").mousedown(function(e) { 
    if ($(e.target).is('option')) 
     return; 

    globalScope.previouslySelected = $(this).val(); 
}); 

有了這個代碼,你可以從你的DOM刪除onmousedown註冊。

+0

聽起來很對我。您可以通過onChange事件完成所有操作。 – wwwmarty

+0

不是。所有選擇控件都沒有單個默認選項。第一個控件可以從值1開始,第二個控件可以從值2開始,等等。每個選擇控件都有一個變量會導致更復雜的代碼。要編輯問題以使其更清晰。 –

+0

我可以想象它可以用你的方式完成。但是,如果可以確定代碼是否在FF上運行,我認爲我需要對代碼執行的操作只需添加幾行代碼即可。不是一個非常強大的解決方案,但工作。 –

相關問題