假设我在一个HTML输入框上附加了一个模糊函数,如下所示:

<input id="myInput" onblur="function() { ... }"></input>

是否有一种方法来获得导致模糊事件的元素的ID(被点击的元素)在函数内?如何?

例如,假设我有这样一个张成的空间:

<span id="mySpan">Hello World</span>

如果我在输入元素有焦点之后点击span,输入元素将失去它的焦点。该函数如何知道被单击的是mySpan ?

PS:如果跨度的onclick事件发生在输入元素的onblur事件之前,我的问题就解决了,因为我可以设置一些状态值,指示特定的元素已被单击。

PPS:这个问题的背景是,我想从外部触发一个AJAX自动补全控件(从一个可点击的元素)来显示它的建议,而不会因为输入元素上的模糊事件而立即消失建议。因此,我想检查是否有一个特定的元素被单击了模糊函数,如果是这样,忽略模糊事件。


当前回答

我认为这是不可能的 在IE中,你可以尝试使用window.event。toElement,但它不工作与firefox!

其他回答

我在答案中只看到了黑客,但实际上有一个非常容易使用的内置解决方案: 基本上你可以像这样捕捉焦点元素:

const focusedElement = document.activeElement

https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement

我一直在玩这个功能,发现FF、IE、Chrome和Opera都有能力提供事件的源元素。我还没有测试过Safari,但我猜它可能有类似的功能。

$('#Form').keyup(function (e) {
    var ctrl = null;
    if (e.originalEvent.explicitOriginalTarget) { // FF
        ctrl = e.originalEvent.explicitOriginalTarget;
    }
    else if (e.originalEvent.srcElement) { // IE, Chrome and Opera
        ctrl = e.originalEvent.srcElement;
    }
    //...
});

2015答案:根据UI Events,你可以使用事件的relatedTarget属性:

用于标识与焦点相关的次要EventTarget 事件,这取决于事件的类型。

对于模糊事件,

relatedTarget:事件目标接收焦点。

例子:

函数blurListener(事件){ event.target.className = '模糊'; 如果(event.relatedTarget) event.relatedTarget.className = 'focused'; } [].forEach.call(document.querySelectorAll('input'), function(el) { 埃尔。addEventListener('blur', blurListener, false); }); .模糊{背景:橙色} .集中{背景:lime} <p>模糊的元素将变成橙色 <p>聚焦的元素应该变成石灰 <input /><input /><input />

注意Firefox直到48版才支持relatedTarget (bug 962251, MDN)。

FocusEvent类型的实例具有relatedTarget属性,但是,在FF版本47之前,该属性返回null,从48开始它已经工作了。

你可以在这里看到更多。

编辑: 一种简单的方法是创建一个变量来跟踪您关心的每个元素的焦点。如果你关心'myInput'失去焦点,为它设置一个变量。

<script type="text/javascript">
   var lastFocusedElement;
</script>
<input id="myInput" onFocus="lastFocusedElement=this;" />

最初的回答: 你可以将“this”传递给函数。

<input id="myInput" onblur="function(this){
   var theId = this.id; // will be 'myInput'
}" />