Лучший способ получить оригинальную цель - PullRequest
27 голосов
/ 28 января 2009

Что такое 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;}                         
});

, который работает, но меня не устраивает нюхание двух линий. Есть ли лучший способ?

Ответы [ 5 ]

36 голосов
/ 28 января 2009

Вы можете сделать это в одну строку с var originalElement = e.srcElement || e.originalTarget;, но это не очень похоже на JQuery; -)

[Редактировать: Но согласно http://docs.jquery.com/Events/jQuery.Event#event.target event.target может сделать ...]

23 голосов
/ 28 января 2009

Я считаю, что 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

, который касается распространения событий с обработчиками пузырей и захвата

20 голосов
/ 27 января 2011

Использование event.originalTarget может привести к ошибке "Отказано в доступе к свойству 'XYZ' из контекста не-Chrome", поэтому я рекомендую использовать следующее:

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

event.target работает в Firefox, Opera, Google Chrome и Safari.

2 голосов
/ 02 июля 2012

В сочетании с Как обнаружить щелчок за пределами элемента? вот как можно перехватить вложенный виджет с аналогичной функцией скрытия при нажатии, чтобы предотвратить скрытие вашего собственного всплывающего окна наряду с этим; в данном случае мы перехватываем всплывающий виджет 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);
});
0 голосов
/ 27 июня 2011

в нормальном Javascript, var t = (e.originalTarget)? E.originalTarget: e.srcElement; должно быть достаточно, чтобы прочитать его во всех браузерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...