【问题标题】:What event fires after you click on <select> but select no option?单击 <select> 但未选择选项后会触发什么事件?
【发布时间】:2020-07-02 23:24:11
【问题描述】:

我试图在&lt;select&gt; 打开后触发清理功能,但没有选择任何选项,用户点击离开。

我尝试了changeblur,但都没有触发。

样品和视觉效果

const select = document.querySelector('select');

select.addEventListener('blur', () => {
    console.log('blur');
});
<select>
  <option>one</option>
  <option>two</option>
  <option>three</option>
</select>

我单击&lt;select&gt;,然后在没有选择选项的情况下单击它之外。 blur 事件直到我在第一次外部点击后执行 第二次 点击后才会触发。

【问题讨论】:

  • 据我所知,这是不可能的。stackoverflow.com/questions/249192/…
  • blur 似乎在 Chrome 中工作..
  • 你试过click事件吗?
  • 你能更准确地描述你想要做什么吗?
  • @Dom 感谢您的评论,我希望通过添加代码示例和屏幕截图来减少星云。

标签: javascript html


【解决方案1】:

关于打开选择菜单时发生的事件有很多。很可能有一种方法可以创建您自己的 CustomEvent 并通过跟踪其他事件来触发它。如果您可以看到正在发生的事件,您可能会弄清楚一些事情。这是我用来查找 EventTarget 上发生的所有事件的脚本:

EventTarget.prototype.__original_addEventListener = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(listener, callback) {
    if (listener === 'event') {
        for (let key in this) {
            if (key.startsWith('on')) {
                let eventName = key.substr(2, key.length);
                this.__original_addEventListener(eventName,
                function(e) {
                    callback(e);
                });
            }
        }
    } else {
        this.__original_addEventListener(listener, callback);
    }
};

window.onload = function() {
    document.querySelector('#id-of-my-select-tag').addEventListener('event', (e) => {
        console.log(e.type);
    });
};

这仅允许您添加一个名为“事件”的侦听器,该侦听器捕获所有事件。这将输出所有发生的事件,也许您会看到一个模式,它可以帮助您编写一些代码,以根据发生的事件及其发生的顺序检测它何时打开。 (在 Firefox、Chrome 和 Edge 中测试)

【讨论】:

  • 感谢您提供了如何调查此事的好主意,但似乎没有立即触发的事件。
  • 请注意,并非所有事件侦听器都映射到 on... IDL,例如 DOMContentLoaded 不会。
  • @MorganWilde 您可以链接事件侦听器以查看以什么顺序发生的事件。例如,当 mousedown 事件发生时,然后为 mouseleave 添加一个事件侦听器,该事件侦听器似乎在选择标记上的 mousedown 后自动触发。选择标签事件有点令人困惑,因为有许多不同的可能性。例如,一旦用户选择了不同的选项,用户可以先按下鼠标然后再按下鼠标,因此点击事件对于检测来说是不可靠的。或者他们可以单击,然后使用键盘。您必须考虑多种情​​况。
【解决方案2】:

没有这样的事件表明 &lt;select&gt; 已打开,但没有选择任何选项并且用户点击离开。

但是,对于&lt;select&gt; 元素,您可以绑定到click 事件,这并不保证选择触发和编写自定义逻辑的选项。我刚刚注意到它需要在 &lt;select&gt; 元素上 2 次点击 才能选择一个选项,而打开它只需要 1 次点击通过 click 计数,我们可以确定是否满足先决条件并相应地运行清理代码:

var clicks = 0,
    $select = document.getElementById('select');
$select.onclick = function() {
  clicks++;

  if (clicks === 2) {
    clicks = 0;
  }
};
$select.onblur = function(e) {
  if (clicks === 1) {
    clicks = 0;

    // SELECT WAS OPENED BUT NO OPTION SELECTED
    // CLEANUP CODE GOES HERE

    console.log('CLEAN UP');
  }
};
<select id="select">
  <option>A</option>
  <option>B</option>
</select>

就像@leisheng 和@Kaiido 建议的那样,这不是通用解决方案,仅适用于台式机和鼠标。

【讨论】:

  • 在未提及 jQuery 的问题中使用 jQuery 投反对票。
  • 选择菜单也可以用键盘打开,使用tab聚焦,空格键打开。
  • @AdrianBrand 感谢您的反馈。检查编辑。现在是纯 JS。
  • @AdrianBrand Kudos,为了给出反对票的理由,希望更多反对票的人也这样做,因为我相信这会变得有帮助。
  • @leisheng 确实也用键盘打开了&lt;select&gt;,但是我无法让它工作,因为&lt;select&gt;成为焦点时只注册了tab键,后续诸如space 之类的按键不会在键盘处理程序中触发。如果您有需要改进此答案的内容,请随时进行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多