【问题标题】:Select selected option again再次选择所选选项
【发布时间】:2014-06-10 06:38:25
【问题描述】:

我有一个表格,我在每一行中使用选择菜单来针对该特定行执行不同的操作。

例如:

$(document).on('change', '.lead-action', function() {
    // Do stuff
}

此方法获取所选选项的值。根据选择的值,我显示不同的弹出窗口。当用户离开页面时,选择菜单保留先前选择的选项。

有时用户会点击选择菜单中的相同选项。当他们这样做时,上面的代码就不起作用了。

如果选择菜单中的相同选项被选中,有没有办法调用上面的代码块?

【问题讨论】:

  • 为什么不以编程方式选择相关选项后触发更改事件?
  • 你能解释一下吗?当您单击选择菜单时,该选项已被选中,因为之前该操作已分配给该行。
  • @A.Wolff,想象一下国家菜单和美国被选中。当您从选择菜单中再次选择美国时,不会触发任何内容,因为没有任何更改。我想要的是,如果你再次选择美国,我想触发一个事件。

标签: javascript html jquery html-select jquery-events


【解决方案1】:

我收集到您只是希望在进行选择时触发下拉菜单。如果是这样,请查看Fire event each time a DropDownList item is selected with jQuery的答案。

在下面查看我的更新答案
您可以使用这个小扩展:

$.fn.selected = function(fn) {
    return this.each(function() {
        var clicknum = 0;
        $(this).click(function() {
            clicknum++;
            if (clicknum == 2) {
                clicknum = 0;
                fn(this);
            }
        });
    });
}

然后这样调用:

$(".lead-action").selected(function(e) {
    alert('You selected ' + $(e).val());
});

更新:

我实际上对原始脚本相当不满意。它会在很多情况下中断,任何依赖于两次检查点击计数的解决方案都将是非常善变的。

需要考虑的一些场景:

  • 如果您点击,然后关闭,然后再打开,它将同时计算点击次数和触发次数。
  • 在 Firefox 中,您只需单击鼠标即可打开菜单并拖动到所选选项,而无需抬起鼠标。
  • 如果您使用任意组合的键盘敲击,您可能会导致点击计数器不同步或完全错过更改事件。
    • 您可以使用 Alt+(或 Chrome 和 Opera 中的 空格键)打开下拉菜单。
    • 当下拉菜单有焦点时,任何箭头键都会改变选择
    • 当下拉菜单打开时,单击 TabEnter 将进行选择

这是我刚刚想出的更全面的扩展:

查看是否选择了选项的最可靠方法是使用change 事件,您可以使用jQuery 的.change() 处理程序来处理该事件。

唯一剩下要做的就是确定是否再次选择了原始元素。
在任何情况下都没有很好的答案。

最简单的方法是检查option:selected元素上是否有clickkeyup事件Chrome, IE, and Safari don't seem to support events on option elements ,即使它们在 w3c recommendation

中被引用

Select 元素内部是一个黑盒子。如果您在其上收听事件,您甚至无法判断事件发生在哪个元素上或列表是否打开。

接下来最好的事情是处理blur 事件。这将表明用户已将注意力集中在下拉列表上(也许看到了列表,也许没有)并做出了他们想要坚持原始值的决定。要立即继续处理更改,我们仍将订阅 change 事件。并且为了确保我们不会重复计算,如果更改事件被引发,我们将设置一个标志,这样我们就不会回击两次:

Updated example in jsFiddle

(function ($) {
    $.fn.selected = function (fn) {
        return this.each(function () {
            var changed = false;
            $(this).focus(function () {
                changed = false;
            }).change(function () {
                changed = true;
                fn(this);
            }).blur(function (e) {
                if (!changed) {
                    fn(this);
                }
            });
        });
    };
})(jQuery);

【讨论】:

  • 代码有点错误。当您右键单击选择菜单时它会触发。当您单击选择菜单然后单击页面上的空白区域时会触发它。
  • @u54r,根据设计,只要select 元素获得焦点并失去焦点,就会调用它。因此,通过右键单击它然后单击远离它,您正在触发它。它与 change 事件的同步并不完美,但如果您只是想知道用户是否曾经靠近此元素,它似乎可以很好地排列。由于我的回答中的原因,似乎很难解决除此之外的任何问题。您仍然可以使用原始答案,但我相信它甚至更麻烦。
【解决方案2】:

使用 mouseup() 而不是依赖 change() -

$(document).on('mouseup', '.lead-action', function() {
    // Do stuff
}

这样,如果他们重新选择,您将获得一个可以处理的事件。

http://jsfiddle.net/jayblanchard/Hgd5z/

【讨论】:

  • 我认为这不是正确的做法。当我点击选择菜单时它就会启动
  • 为什么?每次您在下拉菜单中选择某些内容时,您都会收到一个 mouseup 事件,即使您选择了之前选择的内容。
  • 欣赏 jsfiddle 但它不正确。如您所见,它会在您单击选择菜单时立即触发。
  • 不,当你释放鼠标时它会触发,有很大的不同。如果选择了一个选项,它会保持选中状态,并且 mouseup 会记录相同的信息。如果未释放鼠标,则用户可以移动到不同的答案,释放鼠标并获得不同的结果。也许您的 UI 需要重新考虑?
  • 此方法适用于 Safari,但不适用于 Chrome。在 Chrome 中,当按下选择按钮时它会立即触发,这也是我提出的答案的问题。
猜你喜欢
  • 2019-12-23
  • 2021-06-14
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2023-03-23
  • 2017-07-01
相关资源
最近更新 更多