很不幸,没有标准事件可以知道一个选择框是打开还是关闭,因此您的代码将需要适应不同浏览器,可能会比较复杂。话虽如此,我认为这是可以做到的,并且我已经在Firefox中使用mouseup
事件为您实现了一些功能:
http://jsfiddle.net/FpfnM/50/
在Firefox(我假设Chrome也是如此),您需要仔细跟踪选择状态。当按下
escape
键或发生
blur
事件时,您需要更新状态以将其标识为关闭。我在演示中尚未实现此功能,如果您按下escape键而不是取消选择,则可以看到会发生什么。
在Safari中,情况更容易,因为对选择的
mousedown
事件表示打开选择,而选择的任何关闭都由
click
事件表示。
如果您找到一个浏览器,其中没有这些事件被触发,您可以尝试一种额外的技巧。因为表单小部件(例如选择和文本区域)通常由操作系统呈现而不是在浏览器内部呈现,所以可能会与它们交互,并且某些消息可能无法传递到浏览器的事件处理程序中。如果您在选择框打开时定位一个覆盖屏幕的透明文本区域,并将其放置在较低的z-index上,则可以使用它来跟踪关闭单击。它可能能够捕获浏览器DOM元素可能错过的事件。
更新:Chrome在打开选择时在选择上看到mousedown,在页面用选择打开时在文档上看到mouseup。以下是适用于Chrome的版本:
http://jsfiddle.net/FpfnM/51/
再次强调,您需要进行一些浏览器检测以处理每个浏览器的正确行为。特别是在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
这里有很多其他事件的边缘情况,会表示关闭(例如按下escape键、失去焦点等),但这些是最小限度的处理方式,以应对用户点击选择框,然后点击到文档区域的情况。
希望这有所帮助!
<select>
一样运作。 - Pointy