2013-05-06 28 views
31
// this e works 
document.getElementById("p").oncontextmenu = function(e) { 
    e = e || window.event; 
    var target = e.target || e.srcElement; 
    console.log(target); 
}; 

// this e is undefined 
function doSomething(e) { 
    e = e || window.event; 
    var target = e.target || e.srcElement; 
    console.log(target); 
} 
<p id="p" onclick="doSomething(e)"> 
    <a href="#">foo</a> 
    <span>bar</span> 
</p> 

还有一些类似的问题已被问到。如何将事件作为参数传递给JavaScript中的内联事件处理程序?

但在我的代码中,我试图找到被点击的子元素,如aspan

那么,什么是,或如何得到内部处理事件,而不传递一个参数传递event作为参数传递给事件处理程序的正确方法是什么?

编辑

我所知道的addEventListenerjQuery,请提供传递事件inline事件处理的解决方案。

+0

https://developer.mozilla.org/en/docs/DOM/EventTarget.addEventListener – 2013-05-06 17:54:54

+4

是否有充分的理由使用内联事件处理程序而不是切换到addEventListener? http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – Xotic750 2013-05-06 17:56:17

回答

58

传递event对象:

function doSomething(e) { 
    e = e || window.event; 
    var target = e.target || e.srcElement; 
    console.log(target); 
} 

通过元素本身(一个DOMElement):

<p id="p" onclick="doSomething(event);"> 

来获取点击的子元素(应event参数一起使用

<p id="p" onclick="doThing(this);"> 

看到活生生的例子

+5

(以及任何人都纳闷:是的,这的确在Chrome,Firefox等工作,即使有些[火狐,例如]没有一个全球性的'事件'对象。这是因为其中DOM0处理程序被调用的上下文有一个'event'对象,即使[在某些浏览器]它不是全局性的。) – 2013-05-06 18:04:51

+0

'this'指'p',但我试图让'了'或'span' – user1643156 2013-05-06 18:45:52

+0

@ user1643156我已经更新了答案 – 2013-05-06 18:57:21

3

由于内联事件是作为函数执行的,因此您可以简单地使用参数

<p id="p" onclick="doSomething.apply(this, arguments)"> 

function doSomething(e) { 
    if (!e) e = window.event; 
    // 'e' is the event. 
    // 'this' is the P element 
} 

是在接受的答案中提到的“事件”实际上是传递给函数的参数的名称。它与全球事件无关。

+0

好的提示。当人们开始采用web组件时,'call()'和'apply()'在仿真主流js框架中可用的数据绑定功能时证明是非常重要的。一个额外的窍门是做一些类似于Object.assign(this.querySelector('my-btn'),this)'在一个web组件内部并且数据绑定。您可以通过内联事件'onclick =“toggleBtnActive.call(this,true)”'访问父级Web组件类的任何方法。 – 2017-12-09 18:08:19

相关问题