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"
})