Javascript 如何获取onclick调用对象?

Javascript 如何获取onclick调用对象?,javascript,jquery,html,Javascript,Jquery,Html,我需要在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> 函数click123(事

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

函数click123(事件){
//我需要,这样我就可以用Jquery操作它了
}

我想在不使用
$()的情况下执行此操作。单击jQuery的
$()。使用上面描述的方法进行live

在内联单击处理程序中传入

<a href="123.com" onclick="click123(this);">link</a>
但是当然,处理这个问题的普通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
}
其中
e
是在IE以外的浏览器中传递给函数的
事件对象

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

尝试使用
事件。目标

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


最简单的方法是将此传递给click123函数或 您还可以执行以下操作(跨浏览器):


你的方法的问题是你用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
  }
}

window.onload=函数(){
var el=document.getElementById('elementid');
el.onclick=函数(e){
var ev=e | | window.event;
//在这里,您可以使用this或el作为HTML节点
}
}
你说你想用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
  });
});
//这是JS的window.onload启动,如我前面的示例所示。区别在于
//您可以添加多个onload函数
$(函数(){
$('a#elementid').bind('click',函数(e){
//“this”指向元素
//“e”指向事件对象
});
});

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

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


例如:

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

如果(!e)var e=window.event
有些冗余-
e
已经声明,为什么还要再次声明<代码>如果
也可以完全避免,而选择较短的三元-
e=e | |窗口。事件
。同样适用于
e.target
-这三行很容易用-
var target=e.target | e.src元素替换@kangax-我不会说
e=e | | | window.event
是一个三元运算符,因为它不是三个参数而是两个,它是一个
逻辑或/默认的
运算符-。但我明白这一点,它看起来确实更整洁,我通常使用它。我只是简单地粘贴了链接文章中的代码,但现在我会更新我的答案:)@Russ-Cam-Sigh。。。下次我会在早上留下评论之前确保喝咖啡:)@kangax-没问题,你有一个简洁的观点:)有人能提供关于“Safari bug”的详细信息吗,特别是它适用于哪个版本,在哪里/如果它最终被“修复”了吗?没有。IE和Firefox上不存在currentTarget。对于这些浏览器,您需要回退到src元素。如果您的元素没有子元素,您可以始终安全地使用target。e.currentTarget | | e.src元素仅用于下面有子级的div和内容。不,它得到了很好的支持!,currentTarget不受支持(感谢大家的支持!可能是React在其中一个版本中出现了问题,因为这是我复制问题的地方。此答案用接受的答案确定了一个主要问题(您的目标可能是onclick父元素的任何子元素,而不一定是父元素iteslf)而且应该有更多的投票权。对我来说,chrome上是空的
// 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
  });
});
<a href="#"><span class="icon"></span> blah blah</a>
a.addEventListener('click', e => {
    e.currentTarget; // always returns "a" element
    e.target; // may return "a" or "span"
})