JavaScript(JQuery):在FireFox中取消选择控件中的选择

JavaScript(JQuery):在FireFox中取消选择控件中的选择,javascript,jquery,firefox,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&

在我的应用程序中,我有一个控件列表。只有在用户确认后,才能更改每个控件中的选择。因此,我将其处理如下:

<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
现在,如果用户真的试图更改选择,我会要求用户确认,如果她不确认,我会使用保存的值恢复以前的状态:

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和Opera上,它工作得很好。但是,当我使用Firefox时,它不起作用。原因是FF在选择过程中调用onmousedown处理程序两次—第一次是在用户单击以向下滚动选择控件时,第二次是在用户选择新选择时。因此,globalScope.previouslySelected的最后一个记忆值将成为新的选定值,而不是像在其他浏览器中那样的旧值

我知道使用全局变量被认为是不好的做法。这不是这里的问题。使用任何其他存储都无法使其工作

我现在唯一的想法是在clickSelectselect处理程序中编写一段特定于Firefox的代码,并忽略第二个通知。但是,由于某些原因,我在堆栈溢出上发现的以下代码不起作用:

if($.browser.mozilla) {
     console.log("Olalala");
}
例如,在Chrome中,它会引发以下异常:

Uncaught TypeError: Cannot read property 'mozilla' of undefined

那么,我如何使它工作,使ti只运行在FF?或者,如果你们中有谁对确认问题有更好的解决方案,我会很高兴听到。请记住,这里有一组动态的选择控件,而不仅仅是一个。它必须对他们所有人都有效。此外,它们可以动态添加或删除,因此在单个页面请求中,它们的数量可能会有所不同。用户使用单个选择控件加载页面,按下“+”按钮并添加另一个选择控件等,但解决方案必须与所有控件一致工作。

使用onmousedown侦听器保存当前选择的选项是否有特定原因?您只需初始化全局变量以保留默认选项,并在进行新选择时更新它

大概是这样的:

HTML

编辑

我注意到在Firefox上,第二个mousedown事件的目标是选项,因此在这种情况下,您可以使用以下代码忽略该事件:

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

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

使用此代码,您可以从DOM中删除onmousedown注册。

听起来不错。您可以通过onChange事件完成所有操作。否。对于所有选择控件,没有单一的默认选项。第一个控件可以从值1开始,第二个控件可以从值2开始,等等。为每个select控件设置一个变量将导致更复杂的代码。我会修改这个问题让它更清楚。我可以想象它可以按照你的方式完成。但是,如果可以确定代码是否在FF上运行,我想我需要做的就是添加几行代码。这不是一个非常健壮的解决方案,但很有效。我真的认为编写代码来识别和处理FF是一个坏主意。我编辑了我的答案,加入了另一个解决方案,该解决方案应该适用于所有浏览器,并且不涉及为每个选择保存变量。谢谢,这正是我所需要的。
<select id="mySelect" onchange="changeSelect(this)">
    <option value="1" >A</option>
    <option value="2" >B</option>
</select>
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();
}
$("select").mousedown(function(e) {
    if ($(e.target).is('option'))
        return;

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