Лучший способ получить исходную цель
Какой способ 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;}
});
который работает, но я не доволен тем, что вы обнимаете две линии. Есть ли лучший способ?
Ответы
Ответ 1
Вы можете сделать это в одной строке с var originalElement = e.srcElement || e.originalTarget;
, но это не очень похоже на JQuery; -)
[Изменить: Но согласно http://docs.jquery.com/Events/jQuery.Event#event.target event.target
может сделать...]
Ответ 2
Я считаю, что 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
который посвящен распространению событий с обработчиками пузырьков и захватов
Ответ 3
Использование event.originalTarget
может привести к тому, что "Permission denied" получит доступ к свойству "XYZ" из нехромового контекста "-error", поэтому я бы рекомендовал использовать следующее:
var target = event.target || event.srcElement || event.originalTarget;
event.target
работает в Firefox, Opera, Google Chrome и Safari.
Ответ 4
В сочетании с Как обнаружить клик за пределами элемента? вот как вы можете захватить субподрядку -widget с аналогичной функцией "скрывать-когда-щелкнул-наружу", чтобы не допустить, чтобы ваш собственный pop-over скрывался вместе с ним; в этом случае мы захватываем виджет всплывающих окон 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);
});
Ответ 5
в нормальном Javascript, var t = (e.originalTarget)? e.originalTarget: e.srcElement; должно быть достаточно, чтобы прочитать его во всех браузерах.