如何获得onclick调用对象?


71

我需要在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>

我想在不使用jQuery$().click$().livejQuery的情况下执行上述操作。

Answers:


142

传入this内联点击处理程序

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

event.target在函数中使用(根据W3C DOM 2级事件模型

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

但是,当然,IE是不同的,因此处理此问题的原始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将事件处理程序绑定到元素。


3
if (!e) var e = window.event;有点多余-e已经声明,为什么要再次声明?if也可以完全避免使用较短的三元数e = e || window.event。同上e.target-这3条线很容易替换为- var target = e.target || e.srcElement;)
kangax

@kangax-我不会说这e= e || window.event是一个三元运算符,因为这里没有三个参数,而是两个,它是一个logical-or/default运算符-javascript.crockford.com/survey.html。但我要指出的是,它看上去确实更整洁,我通常会使用它。我只是粘贴了链接文章中的代码,但现在将回答我的问题:)
Russ Cam 2009年

@Russ Cam Sigh ...下次,我将确保在早上喝咖啡,然后再发表评论:)
kangax

1
@kangax-没问题,您的意思很简洁:)
Russ Cam

有人可以提供有关“ Safari错误”的详细信息,尤其是适用于哪个版本以及最终在何处“固定”吗?
Axel Heider

10

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

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


5

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

当事件遍历DOM时,Event接口的currentTarget只读属性标识该事件的当前目标。它始终引用事件处理程序已附加到的元素,而不是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"
})

不是。IE和Firefox不存在currentTarget。您需要针对这些浏览器回退到srcElement。如果您的元素没有孩子,则可以始终安全地使用target。使用e.currentTarget || e.srcElement仅适用于下面有子级的div和东西。
Vlatko Vlahek

否,它得到了很好的支持!,currentTarget仅在(<= IE8),developer.mozilla.org
en

谢谢你的抬头!可能是React在其中一个版本中存在问题,因为这是我重现该问题的地方。
Vlatko Vlahek,

2
此答案标识了一个可以接受的答案的主要陷阱(您的目标可以是onclick父级的任何子级,而不必是父级元素iteslf),并且应该具有更多投票权。
kpup

对于我来说,它在chrome上为空
目录

3

方法的问题是,您会使用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
  });
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.