假设我将一个blur函数附加到一个 HTML 输入框,如下所示:
blur
<input id="myInput" onblur="function() { ... }"></input>
有没有办法blur在函数内部获取导致事件触发的元素的 ID(被点击的元素)?如何?
例如,假设我有这样的跨度:
<span id="mySpan">Hello World</span>
如果我在输入元素获得焦点后立即单击跨度,则输入元素将失去焦点。该函数如何知道它是mySpan被点击的?
mySpan
PS:如果 span 的 onclick 事件发生在 input 元素的 onblur 事件之前,我的问题将得到解决,因为我可以设置一些状态值来指示特定元素已被单击。
PPS:这个问题的背景是我想从外部(从可点击元素)触发一个 AJAX 自动完成器控件来显示它的建议,而建议不会因为blur输入元素上的事件而立即消失。因此,如果单击了某个特定元素,我想检查该blur函数,如果是,则忽略模糊事件。
嗯… 在 Firefox 中,您可以使用explicitOriginalTarget拉取被点击的元素。我希望toElement对 IE 做同样的事情,但它似乎不起作用......但是,您可以从文档中提取新关注的元素:
explicitOriginalTarget
toElement
function showBlur(ev) { var target = ev.explicitOriginalTarget||document.activeElement; document.getElementById("focused").value = target ? target.id||target.tagName||target : ''; } ... <button id="btn1" onblur="showBlur(event)">Button 1</button> <button id="btn2" onblur="showBlur(event)">Button 2</button> <button id="btn3" onblur="showBlur(event)">Button 3</button> <input id="focused" type="text" disabled="disabled" />
警告: 此技术不适 用于 使用键盘在字段中切换引起的焦点更改 , 并且在 Chrome 或 Safari 中根本不起作用。使用activeElement(IE除外)的一个大问题是它直到事件处理完毕后才会持续更新 , 并且blur在处理过程中可能根本没有有效值!这可以通过改变 Michiel 最终使用的技术来缓解:
activeElement
function showBlur(ev) { // Use timeout to delay examination of activeElement until after blur/focus // events have been processed. setTimeout(function() { var target = document.activeElement; document.getElementById("focused").value = target ? target.id||target.tagName||target : ''; }, 1); }
这应该适用于大多数现代浏览器(在 Chrome、IE 和 Firefox 中测试),但需要注意的是,Chrome 不会将焦点放在被 点击 的按钮上(与标签页相比)。