当前位置: 首页 > 面试题库 >

关闭HTML select元素时是否会触发DOM事件?

居英资
2023-03-14
问题内容

我正在寻找一个DOM事件,该事件可以通过JavaScript进行监听,以了解通过打开选择元素(但未更改任何选项)然后通过关闭选择元素(在页面上其他位置)来关闭该元素。

这不是blur选择事件,因为选择保留了焦点。同样,这不是focus一些其他元素或文档或事件mousedownclick窗口,文档或身体。

这不是change选择事件,因为选择中的任何选项都没有更改。

我不关心旧版Internet Explorer,而只是在符合标准的现代浏览器中可以使用的东西。专有的黑客可能值得一提。

  1. 在“结果”面板中单击选择框
  2. 只需单击一下标记为“ HERE”(或其他位置)的文本,然后查看是否将任何事件添加到日志中。最新的Chrome或Firefox中没有任何事件。

因此,问题是: 可以添加哪种JavaScript,以在单击选择框时记录事件?


问题答案:

不幸的是,没有标准事件可知道选择框是何时关闭或打开,因此您的代码将变得很笨拙,并且可以容纳不同的浏览器。就是说,我认为这是可以做到的,并且使用该mouseup事件,我已经在Firefox中为您工作了:

在Firefox(我假设使用Chrome)中,您需要非常仔细地跟踪选择状态。当escape按键或blur事件发生时,您需要更新状态以将其标识为已关闭。我尚未在演示中实现该功能,您可以看到如果单击逃逸而不是单击选择,会发生什么情况。

在Safari中,事情变得容易得多,其中mousedown选择项上的事件表示打开选择项,而选择项的任何关闭均由click事件表示。

如果找到没有触发这些事件的浏览器,则可以尝试另一种技巧。由于select和textarea之类的表单小部件通常是由操作系统而不是在浏览器内部呈现的,因此您有可能与它们进行交互,并且某些消息可能无法传递到浏览器的事件处理程序中。如果在选择框打开时将覆盖屏幕的透明文本区域置于较低的z索引位置,则可以使用它来跟踪关闭点击。它可能能够捕获浏览器DOM元素可能丢失的事件。

更新: 打开选择框后,Chrome会在选择框上显示鼠标下移,在选择框打开后单击页面时,会在文档上显示鼠标上移。这是适用于Chrome的版本:

同样,您需要进行一些浏览器检测以处理每个浏览器中的正确行为。尤其要注意的是,当您再次单击“选择”以将其关闭时,不会触发任何事件。但是,您可以检测到页面点击。

快速摘要:

Chrome/Safari: select.mousedown on open, document.mouseup on close
Firefox: select.click on open, document.mouseup on close
IE8/IE7: select.click on open, document.mouseup on close

对于其他事件,有很多边缘情况会表示关闭(退出键,模糊等),但这是处理用户单击选择框然后单击进入文档区域的最小情况。

希望这可以帮助!



 类似资料:
  • 问题内容: 总览 我具有以下HTML结构,并且将和事件附加到了元素上。 问题 当我将文件拖到时,事件将按预期触发。但是,当我将鼠标移到子元素(例如)上时,会为该元素触发该事件,然后为该元素触发该事件。 如果我再次将鼠标悬停在该元素上,则再次触发该事件,这很酷,但是随后为刚刚剩下的子元素触发了该事件,因此执行了该指令,这并不酷。 此行为有问题的原因有两个: 我只附加&,所以我不明白为什么子元素也要附

  • 问题内容: 将dom元素插入dom时,是否会触发jquery? 例如,可以说我通过ajax加载了一些内容并将其添加到DOM中,而在其他Java脚本中,我可以使用.live()添加事件,以便在将与特定选择器匹配的事件添加到DOM时触发该事件说元素。类似于$(document).ready(),但内容是动态添加到DOM的。 我梦of以求的: 如果jquery不支持这种功能,那么还有另一种方法可以实现此

  • 问题内容: 我想在Angularjs控制器中触发JS代码。 我有这个: 当我离开使用该控制器的页面时,此方法工作正常,但当我关闭标签/浏览器时,该方法不起作用。 标签/浏览器关闭时是否需要使用其他代码来触发JS代码? 问题答案: 从角度文档: $ destroy(); 从父范围中删除当前范围(及其所有子级)。删除意味着对$ digest()的调用将不再传播到当前作用域及其子级。删除还意味着当前范围

  • 我有一个视图寻呼机,我想拦截其父容器上的触摸事件。xml如下所示 由于视图寻呼机占据了整个屏幕,如果尝试将onTouchListener附加到id为“layoutContainer”的容器上,则不会触发任何操作。 我希望能够检测屏幕上的垂直滑动手势 我尝试做的另一件事是将触摸监听器连接到视图寻呼机,然后手动将运动事件传递给手势检测器,但这也不起作用。

  • 为什么我需要这个功能?我正在建立一个应用程序,在这个应用程序,有3下拉菜单,5下拉列表(喜欢选择)。所有这些都是角指令。让我们假设所有这些指令都是不同的。所以我们有8个指令。它们都需要一个相同的功能:当点击元素的侧面时,需要隐藏下拉菜单。 我有两个解决方案,但都有问题: 解决方案A: 解决方案B在我的应用程序中工作,我现在正在使用。但问题是它会导致性能问题。太多的点击事件处理每一个单一的点击在应用

  • JavaDoc for没有提到关闭底层的: https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html#close-- 从课堂上复制的描述:Reader 关闭流并释放与之关联的所有系统资源。流关闭后,进一步的read()、ready()、mark()、reset()或skip()调用将抛出IOException。