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

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

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

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

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

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

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

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


当前回答

我写了一个替代方案如何使任何元素可聚焦和“模糊”。

它基于将一个元素设置为contentteditable,并在视觉上隐藏它,并禁用编辑模式本身:

el.addEventListener("keydown", function(e) {
  e.preventDefault();
  e.stopPropagation();
});

el.addEventListener("blur", cbBlur);
el.contentEditable = true;

DEMO

注:在Chrome, Firefox和Safari (OS X)中测试,对IE不确定。


相关:我正在寻找Vue的解决方案,所以对于那些感兴趣/好奇如何使用Vue Focusable指令实现这样的功能的人,请看看。

其他回答

你可以这样做:

<script type="text/javascript">
function myFunction(thisElement) 
{
    document.getElementByName(thisElement)[0];
}
</script>
<input type="text" name="txtInput1" onBlur="myFunction(this.name)"/>

文档。activeElement可以是父节点(例如体节点,因为它处于从一个目标切换到另一个目标的临时阶段),因此它不适用于您的作用域 电动汽车。explicitOriginalTarget并不总是有值

所以最好的方法是使用onclick对body事件间接理解你的节点(event.target)是模糊

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

const focusedElement = document.activeElement

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

我认为这很容易通过jquery通过传递字段的引用导致onblur事件在“this”。 如。

<input type="text" id="text1" onblur="showMessageOnOnblur(this)">

function showMessageOnOnblur(field){
    alert($(field).attr("id"));
}

谢谢 莫妮卡

我一直在玩这个功能,发现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;
    }
    //...
});