如何获取onclick调用对象?

IT技术 javascript jquery html
2021-01-22 08:16:33

我需要在onclick事件的调用对象上有一个处理程序

<a href="123.com" onclick="click123(event);">link</a>

<script>
  function click123(event) {
    //i need <a> so i can manipulate it with Jquery
  }
</script>

我想在不使用$().click$().livejQuery 但使用上述方法的情况下做到这一点

5个回答

传入this内联点击处理程序

<a href="123.com" onclick="click123(this);">link</a>

或者event.target在函数中使用(根据W3C DOM Level 2 Event模型

function click123(event)
{
    var a = event.target;
}

但是当然,IE 是不同的,所以处理这个的 vanilla JavaScript 方式是

function doSomething(e) {
    var targ;
    if (!e) var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;
}

或不那么冗长

function doSomething(e) {

    e = e || window.event;
    var targ = e.target || e.srcElement || e;
    if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug
}

其中eevent object被传递到在比IE其他浏览器的功能。

不过,如果您使用的是 jQuery,我强烈建议您使用不引人注目的 JavaScript 并使用 jQuery 将事件处理程序绑定到元素。

@kangax - 我不会说这e= e || window.event是一个三元运算符,因为不是三个参数而是两个参数,它是一个logical-or/default运算符 - javascript.crockford.com/survey.html但我明白这一点,它看起来更整洁,我通常使用它。我只是粘贴了链接文章中的代码,但现在我的答案是:)
2021-03-15 08:16:33
@Russ Cam Sigh ......下次我会在发表评论之前确保早上喝咖啡:)
2021-03-17 08:16:33
@kangax - 没问题,你有一个简洁的观点:)
2021-03-22 08:16:33
if (!e) var e = window.event;有点多余——e已经声明了,为什么还要做?if也可以完全避免使用较短的三元 - e = e || window.event同上e.target- 这 3 行很容易替换为 - var target = e.target || e.srcElement;)
2021-04-07 08:16:33
有人可以提供有关“Safari 错误”的详细信息,尤其是这适用于哪个版本以及最终在何处/是否“修复”?
2021-04-13 08:16:33

最简单的方法是通过这个给click123功能,或者您也可以做这样的事情(跨浏览器):

function click123(e){
  e = e || window.event;
  var src = e.target || e.srcElement;
  //src element is the eventsource
}

我认为最好的方法是使用currentTarget属性而不是target属性。

事件遍历 DOM 时,Event 接口的 currentTarget 只读属性标识了 event的当前目标它始终指的是事件处理程序已附加到的元素,而不是 Event.target,后者标识发生事件的元素


例如:

<a href="#"><span class="icon"></span> blah blah</a>

Javascript:

a.addEventListener('click', e => {
    e.currentTarget; // always returns "a" element
    e.target; // may return "a" or "span"
})
不是。currentTarget 在 IE 和 Firefox 上不存在。对于这些浏览器,您需要回退到 srcElement。如果您的元素没有子元素,您可以始终安全地使用 target。使用 e.currentTarget || e.srcElement 仅用于 div 和下面有孩子的东西。
2021-03-16 08:16:33
这个答案确定了一个主要问题和接受的答案(你的目标可以是 onclick 父元素的任何子元素,不一定是父元素 iteslf)并且应该有更多的赞成。
2021-03-19 08:16:33
不,它得到了很好的支持!,currentTarget 仅在 (<= IE8)、developer.mozilla.org/ en-US/docs/Web/API/Event/...
2021-03-29 08:16:33
谢谢你的抬头!可能是 React 在其中一个版本中存在问题,因为这是我重现该问题的地方。
2021-04-07 08:16:33
对我来说,它在 chrome 上为 null
2021-04-07 08:16:33

http://docs.jquery.com/Events/jQuery.Event

试试 event.target

包含发出事件的 DOM 元素。这可以是为事件注册的元素或其子元素。

你的方法的问题是你用 javascript 弄乱了你的 HTML。如果你把你的 javascript 放在一个外部文件中,你可以不显眼地访问你的 HTML,这会更整洁。

稍后您可以使用 addEventListener/attackEvent(IE) 扩展您的代码以防止内存泄漏。

这是没有 jQuery

<a href="123.com" id="elementid">link</a>

window.onload = function () {
  var el = document.getElementById('elementid');
  el.onclick = function (e) {
    var ev = e || window.event;
    // here u can use this or el as the HTML node
  }
}

你说你想用 jQuery 操作它。所以你可以使用jQuery。比这样做更好:

// this is the window.onload startup of your JS as in my previous example. The difference is 
// that you can add multiple onload functions
$(function () {
  $('a#elementid').bind('click', function (e) {
    // "this" points to the <a> element
    // "e" points to the event object
  });
});