Кроссбраузерный эквивалент параметра события explicitOriginalTarget

Кто-нибудь знает кроссбраузерный эквивалент параметра события explicitOriginalTarget? Этот параметр специфичен для Mozilla и дает мне элемент, вызвавший размытие. Скажем, у меня есть ввод текста и ссылка на моей странице. Ввод текста имеет фокус. Если я нажимаю на ссылку, событие размытия ввода текста дает мне элемент ссылки в Firefox через параметр explicitOriginalTarget.

Я расширяю метод onBlur Autocompleter.Base, чтобы не скрывать результаты поиска, когда поле поиска теряет фокус для заданных элементов. По умолчанию метод onBlur скрывается, если поле поиска теряет фокус на каком-либо элементе.

Autocompleter.Base.prototype.onBlur = Autocompleter.Base.prototype.onBlur.wrap(
function(origfunc, ev) {
    var newTargetElement = (ev.explicitOriginalTarget.nodeType == 3 ? ev.explicitOriginalTarget.parentNode: ev.explicitOriginalTarget); // FIX: This works only in firefox because of event's explicitOriginalTarget property
    var callOriginalFunction = true;
    for (i = 0; i < obj.options.validEventElements.length; i++) {
        if ($(obj.options.validEventElements[i])) {
            if (newTargetElement.descendantOf($(obj.options.validEventElements[i])) == true || newTargetElement == $(obj.options.validEventElements[i])) {
                callOriginalFunction = false;
                break;
            }
        }
    }
    if (callOriginalFunction) {
        return origFunc(ev);
    }
}
);


new Ajax.Autocompleter("search-field", "search-results", 'getresults.php', { validEventElements: ['search-field','result-count'] });

Спасибо.


person matte    schedule 07.10.2008    source источник


Ответы (6)


Нет эквивалента явномуOriginalTarget ни в одном из других браузеров, кроме Gecko. В Gecko это внутреннее свойство, и оно не должно использоваться разработчиком приложения (возможно, разработчиками привязки XBL).

person Sergey Ilinsky    schedule 07.10.2008
comment
Спасибо, Сергей. Возможно, мне стоит начать писать свой собственный метод с использованием делегирования событий вместо того, чтобы пытаться расширить метод onBlur для Autocompleter. С делегированием событий и использованием некоторых глобальных переменных я могу это исправить. - person matte; 08.10.2008

Обновление 2015 ... вы можете использовать event.relatedTarget в Chrome. Такая простая вещь, надеюсь, другие браузеры последуют за ней ...

person ss ulrey    schedule 22.02.2015
comment
К сожалению, похоже, что Firefox больше не имеет и не предоставляет .explicitOriginalTarget, и по состоянию на июль 2015 года они еще не реализовали .relatedTarget. bugzilla.mozilla.org/show_bug.cgi?id=962251 - person Judah Gabriel Himango; 15.07.2015
comment
@JudahHimango Firefox 55 по-прежнему поддерживает explicitOriginalTarget. Что касается relatedTarget, это совсем не то. - person icl7126; 09.07.2017

Примерным эквивалентом Mozilla .explicitOriginalTarget в IE является document.activeElement. Я говорю приблизительный эквивалент, потому что он иногда возвращает немного другой уровень в дереве узлов DOM в зависимости от ваших обстоятельств, но это все же полезный инструмент. К сожалению, я все еще ищу аналог в Google Chrome.

person WMSigEp    schedule 11.02.2010

IE srcElement не содержит того же элемента, что и FF explicitOriginalTarget. Это легко увидеть: если у вас есть поле кнопки с действием onClick и текстовое поле с действием onChange, измените текстовое поле, переместите курсор непосредственно на кнопку и щелкните по ней. В этот момент IE srcElement будет текстовым полем, а explicitOriginalTarget будет полем кнопки. Для IE вы можете получить координаты x, y щелчка мыши из свойств event.x и event.y.

К сожалению, браузер Chrome не предоставляет ни explicitOriginalTarget, ни координаты мыши для щелчка. Вы сами решаете, откуда было запущено событие onChange. Для этого разумное использование событий mousemove и mouseout может обеспечить отслеживание мыши, которое затем можно будет проверить в обработчике onChange.

person Allan Rofer    schedule 05.05.2012

Похоже, он больше предназначен для разработчиков расширений, чем для веб-дизайна ...

Я бы наблюдал за событиями размытия / фокусировки для обеих целей (или потенциальных целей) и делился бы их информацией.
Фактически, точная реализация может зависеть от цели.

person PhiLho    schedule 07.10.2008
comment
Я также думал о просмотре событий размытия / фокуса для обеих целей, но если Firefox имеет для этого определенный параметр (explicitOriginalTarget), возможно, другие браузеры тоже. Может не параметр а хак. - person matte; 07.10.2008

Для IE можно использовать srcElement и принудительно.

if( !selectTag.explicitOriginalTarget )
    selectTag.explicitOriginalTarget = selectTag.srcElement;
person Kotei    schedule 07.03.2012