2008-10-07 12 views
16

¿Alguien sabe de crossbrowser equivalente del parámetro de evento explicitOriginalTarget? Este parámetro es específico de Mozilla y me da el elemento que causó el desenfoque. Digamos que tengo una entrada de texto y un enlace en mi página. La entrada de texto tiene el foco. Si hago clic en el enlace, el evento de desenfoque de la entrada de texto me da el elemento de enlace en Firefox a través del parámetro explicitOriginalTarget.Equivalente de crossbrowser del parámetro de evento explicitOriginalTarget

Extiendo el método de Autocompleter.Base en Blur para no ocultar los resultados de búsqueda cuando el campo de búsqueda pierde el foco a los elementos dados. Por defecto, el método onBlur se oculta si el campo de búsqueda pierde el foco en cualquier elemento.

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'] }); 

Gracias.

Respuesta

9

No hay equivalente a explicitOriginalTarget en ninguno de los navegadores basados ​​en Gecko. En Gecko, esta es una propiedad interna y no se supone que deba ser utilizada por un desarrollador de aplicaciones (tal vez por escritores vinculantes de XBL).

+0

Gracias Sergey. Tal vez debería comenzar a escribir mi propio método utilizando la delegación de eventos en lugar de intentar extender el método de Autocompletar de Blur. Con la delegación de eventos y el uso de algunas variables globales, puedo solucionar esto. – matte

1

parece que es más diseñado para los escritores de extensión que para el diseño web ...

Me gustaría ver los eventos desenfoque/centrarse en ambos objetivos (o blancos potenciales) y compartir su información.
La implementación exacta puede depender del propósito, en realidad.

+0

También pensé en ver desenfoques/eventos de enfoque en ambos objetivos, pero si Firefox tiene un parámetro específico (explicitOriginalTarget) para eso, tal vez los otros navegadores también. Tal vez no sea un parámetro, sino un truco. – matte

3

El equivalente aproximado para .explicitOriginalTarget de Mozilla en IE es document.activeElement. Digo el equivalente aproximado porque a veces devolverá un nivel ligeramente diferente en el árbol de nodos DOM dependiendo de su circunstancia, pero sigue siendo una herramienta útil. Lamentablemente, sigo buscando un equivalente de Google Chrome.

0

Para IE puede usar srcElement y forzarlo.

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

IE srcElement no contiene el mismo elemento que FF explicitOriginalTarget. Es fácil ver esto: si tiene un campo de botón con acción onClick y un campo de texto con acción onChange, cambie el campo de texto y mueva el cursor directamente al botón y haga clic en él. En ese punto, el IE srcElement será el campo de texto, pero el explicitOriginalTarget será el campo del botón. Para IE, puede obtener las coordenadas x, y del clic del mouse desde las propiedades event.x y event.y.

Desafortunadamente, el navegador Chrome no proporciona el explicitOriginalTarget ni las coordenadas del mouse para el clic. Se lo deja a sus propios dispositivos para averiguar dónde se desencadenó el evento onChange. Para ello, el uso juicioso de los eventos mousemove y mouseout puede proporcionar el seguimiento del mouse que luego se puede inspeccionar en el controlador onChange.

3

actualización de 2015 ... puede utilizar event.relatedTarget en Chrome. Tal cosa básica, con suerte los otros navegadores seguirán ...

+1

Desafortunadamente, parece que Firefox ya no tiene ni expone .explicitOriginalTarget, ni han implementado .relatedTarget aún, a partir de julio de 2015. https://bugzilla.mozilla.org/show_bug.cgi?id = 962251 –

+0

@JudahHimango Firefox 55 aún admite 'explicitOriginalTarget'. Con respecto a 'relatedTarget', no es lo mismo en absoluto. – icl7126

Cuestiones relacionadas