获得原始目标的最佳方式

时间:2009-01-27 21:50:01

标签: javascript jquery events dom delegates

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

我一直在使用这样的东西

$('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;}                         
});

哪个有效,但我对两线功能嗅探感到不满意。还有更好的方法吗?

5 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:23)

我相信e.target就是你所需要的

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

如果您转到jQuery in Action website并下载源代码,请查看

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

处理使用冒泡和捕获处理程序的事件传播

答案 2 :(得分:20)

使用event.originalTarget会导致“权限被拒绝从非Chrome上下文访问属性'XYZ'” - 错误,所以我建议使用以下内容:

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

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

答案 3 :(得分:2)

How to detect a click outside an element?结合使用,您可以在此处捕获具有类似隐藏点击外部功能的子窗口小部件,以防止您自己的弹出窗口随之隐藏;在这种情况下,我们正在捕获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);
});

答案 4 :(得分:0)

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