2009-01-27 40 views
24

什么是获取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;}       
}); 

它的工作原理,但我并不高兴,二本上线功能嗅探。有没有更好的办法?

+1

无意中发现这个老问题,想知道为什么** [这个答案](http://stackoverflow.com/a/4816990/2407212) **只有接受答案的三分之一票数对我来说似乎非常非常好。 – Jonathan 2014-04-29 22:36:25

回答

34

你可以用var originalElement = e.srcElement || e.originalTarget;做一条线,但它是不漂亮的JQuery样;-)

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

+8

这不是jQuery应该抽象的东西吗?我对此非常惊讶。 – cletus 2009-01-27 21:58:50

+0

我记得在尝试使用e.target时遇到问题。看起来他们已经被修复了(否则我已经修复了一段时间)。另外,花哨的终止技巧读起来像两条线给我;) – 2009-01-27 22:17:19

+0

你是一个惊人的救星!感谢上帝的这个一等奖...... – 2013-07-18 14:22:38

22

我相信Ë .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

其与事件传播处理与气泡和捕获处理程序

19

使用event.originalTarget可引起“权限被拒绝从访问属性‘XYZ’无铬语境”误差,所以我建议使用下列内容:

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

event.target作品在Firefox,歌剧,谷歌Chrome和Safari。

0

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

2

结合How to detect a click outside an element?这里介绍了如何使用类似hide-when-clicked-outside功能来捕获子窗口小部件,以防止自己的弹出窗口与其一起隐藏;在这种情况下,我们要捕获的JQuery的UI日期选择器弹出了窗口小部件:

// 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); 
});