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

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

Я расширяю метод Autocompleter.Base onBlur, чтобы не скрывать результаты поиска, когда поле поиска теряет фокус на заданные элементы. По умолчанию метод 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 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'] });

Спасибо.

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

if( !selectTag.explicitOriginalTarget )
    selectTag.explicitOriginalTarget = selectTag.srcElement;