2008-10-07 20 views
16

Est-ce que quelqu'un connaît l'équivalent de type "crossbrowser" du paramètre d'événement explicitOriginalTarget? Ce paramètre est spécifique à Mozilla et il me donne l'élément qui a provoqué le flou. Disons que j'ai une entrée de texte et un lien sur ma page. La saisie de texte a le focus. Si je clique sur le lien, l'événement flou de l'entrée de texte me donne l'élément de lien dans Firefox via le paramètre explicitOriginalTarget.Equivalent de l'objet crossbrowser du paramètre d'événement explicitOriginalTarget

Je suis en train d'étendre la méthode onBlur de Autocompleter.Base pour ne pas masquer les résultats de la recherche lorsque le champ de recherche perd le focus sur des éléments donnés. Par défaut, la méthode onBlur se cache si le champ de recherche perd le focus sur un élément.

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

Merci.

Répondre

9

Il n'y a aucun équivalent à explicitOriginalTarget dans l'un des navigateurs autres que Gecko. Dans Gecko, il s'agit d'une propriété interne qui n'est pas supposée être utilisée par un développeur d'applications (peut-être par des rédacteurs de liaison XBL).

+0

Merci Sergey. Peut-être que je devrais commencer à écrire ma propre méthode en utilisant la délégation d'événements au lieu d'essayer d'étendre la méthode onBlur de Autocompleter. Avec la délégation d'événements et l'utilisation de certaines variables globales, je peux résoudre ce problème. – matte

1

On dirait qu'il est plus conçu pour les créateurs d'extensions que pour la conception Web ...

Je regardais les événements flou/mise au point sur les cibles (ou cibles potentielles) et partager leurs informations.
L'implémentation exacte peut dépendre du but, en fait.

+0

Je pensais aussi regarder les événements flou/focus sur les deux cibles, mais si Firefox a un paramètre spécifique (explicitOriginalTarget) pour cela, peut-être que les autres navigateurs ont aussi. Peut-être pas un paramètre mais un hack. – matte

3

L'équivalent approximatif de .explicitOriginalTarget de Mozilla dans IE est document.activeElement. Je dis un équivalent approximatif car il retournera parfois un niveau légèrement différent dans l'arborescence des nœuds DOM en fonction de votre situation, mais c'est toujours un outil utile. Malheureusement, je suis toujours à la recherche d'un équivalent Google Chrome.

0

Pour IE, vous pouvez utiliser srcElement et le forcer.

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

IE srcElement ne contient pas le même élément que FF explicitOriginalTarget. Il est facile de voir ceci: si vous avez un champ de bouton avec l'action onClick et un champ de texte avec l'action onChange, changez le champ de texte et déplacez le curseur directement sur le bouton et cliquez dessus. À ce stade, le IE srcElement sera le champ de texte, mais le explicitOriginalTarget sera le champ du bouton. Pour IE, vous pouvez obtenir les coordonnées x, y du clic de la souris à partir des propriétés event.x et event.y.

Malheureusement, le navigateur Chrome ne fournit ni le explicitOriginalTarget ni les coordonnées de la souris pour le clic. Vous êtes laissé à vos propres appareils pour savoir où l'événement onChange a été tiré. Pour ce faire, une utilisation judicieuse des événements mousemove et mouseout peut fournir un suivi de la souris qui peut ensuite être inspecté dans le gestionnaire onChange.

3

Mise à jour 2015 ... vous pouvez utiliser event.relatedTarget sur Chrome. Une telle chose basique, j'espère que les autres navigateurs suivront ...

+1

Malheureusement, il semble que Firefox n'a plus ou n'expose plus .explicitOriginalTarget, et n'a pas encore implémenté .relatedTarget, à partir de juillet 2015. https://bugzilla.mozilla.org/show_bug.cgi?id = 962251 –

+0

@JudahHimango Firefox 55 supporte toujours 'explicitOriginalTarget'. En ce qui concerne 'relatedTarget', ce n'est pas du tout la même chose. – icl7126