28

什么是 jQuery 之类的和/或在 jQuery(或一般的浏览器 javascript 中)获取事件的原始目标的最佳实践方式。

我一直在使用这样的东西

$('body').bind('click', function(e){
        //depending on the browser, either srcElement or 
        //originalTarget will be populated with the first
        //element that intercepted the click before it bubbled up
        var originalElement = e.srcElement;
        if(!originalElement){originalElement=e.originalTarget;}                         
});

这有效,但我对两行特征嗅探不满意。有没有更好的办法?

4

5 回答 5

36

您可以在一行中完成它,var originalElement = e.srcElement || e.originalTarget;但它不像 JQuery ;-)

[编辑:但根据http://docs.jquery.com/Events/jQuery.Event#event.target event.target可能会...]

于 2009-01-27T21:56:19.060 回答
24

我相信 e.target 是您所需要的

$('body').bind('click', function(e){
                e.target // the original target
                e.target.id // the id of the original target                                               
});

如果您访问jQuery in Action 网站并下载源代码,请查看

  • 第 4 章 - dom.2.propagation.html

它使用气泡和捕获处理程序处理事件传播

于 2009-01-27T22:07:52.063 回答
22

使用event.originalTarget会导致“Permission denied to access property 'XYZ' from a non-chrome context”-错误,所以我建议使用以下内容:

var target = event.target || event.srcElement || event.originalTarget;

event.target适用于 Firefox、Opera、Google Chrome 和 Safari。

于 2011-01-27T13:35:07.020 回答
2

结合如何检测元素外的点击?以下是您可以如何捕获具有类似的“点击时隐藏”功能的子小部件,以防止您自己的弹出窗口与其一起隐藏;在这种情况下,我们将捕获 JQuery UI Datepicker 弹出窗口小部件:

// not using jquery .one handler for this, so we can persist outside click later
$('html').click(function(evt) {
    // just return if element has the datepicker as a parent
    if ($(evt.target).parents('#ui-datepicker-div').length>0) return;

    //toggle shut our widget pop-over
    $('#mywidget').toggle();

    // now, unbind this event since our widget is closed:
    $(this).unbind(evt);
});
于 2012-07-02T18:08:55.327 回答
0

在普通的 Javascript 中,var t = (e.originalTarget)?e.originalTarget:e.srcElement; 应该足以在所有浏览器中阅读它。

于 2011-06-27T11:20:21.063 回答