2008-10-07 9 views
16

Kennt jemand Crossbrowser-Äquivalent des explicitOriginalTarget-Ereignisparameters? Dieser Parameter ist Mozilla-spezifisch und gibt mir das Element, das die Unschärfe verursacht hat. Nehmen wir an, ich habe eine Texteingabe und einen Link auf meiner Seite. Texteingabe hat den Fokus. Wenn ich auf den Link klicke, gibt das Blur-Ereignis der Texteingabe mir das Link-Element in Firefox über den Parameter explicitOriginalTarget.Crossbrowser-Entsprechung des explicitOriginalTarget-Ereignisparameters

Ich erweitere die onBlur-Methode von Autocompleter.Base, um die Suchergebnisse nicht zu verbergen, wenn das Suchfeld den Fokus auf bestimmte Elemente verliert. Standardmäßig blendet die onBlur-Methode aus, wenn das Suchfeld den Fokus auf ein beliebiges Element verliert.

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

Danke.

Antwort

9

Es gibt keine Entsprechung zu ExplicitOriginalTarget in einem anderen als Gecko-basierten Browsern. In Gecko ist dies eine interne Eigenschaft und es sollte nicht von einem Anwendungsentwickler verwendet werden (möglicherweise von XBL-Bindungsschreibern).

+0

Danke Sergey. Vielleicht sollte ich meine eigene Methode mit Ereignisdelegierung schreiben anstatt zu versuchen, die onLur-Methode von AutoCompleter zu erweitern. Mit Ereignisdelegierung und einigen globalen Variablen kann ich das beheben. – matte

1

Sieht aus wie es entworfen für Programmierer als für Web-Design ...

ich auf beiden Ziele, die Unschärfe/Fokus-Ereignisse würden beobachten ist (oder potentielle Ziele) und ihre Informationen teilen.
Die genaue Implementierung kann tatsächlich vom Zweck abhängen.

+0

Ich dachte auch, Blur/Fokus-Ereignisse auf beiden Zielen zu beobachten, aber wenn Firefox einen bestimmten Parameter (ExplicitOriginalTarget) dafür hat, vielleicht haben die anderen Browser auch. Vielleicht kein Parameter, sondern ein Hack. – matte

3

Das grobe Äquivalent für Mozillas .explicitOriginalTarget in IE ist document.activeElement. Ich sage grob äquivalent, da es abhängig von Ihren Umständen manchmal eine etwas andere Ebene in der DOM-Knotenstruktur zurückgibt, aber es ist immer noch ein nützliches Werkzeug. Leider bin ich immer noch auf der Suche nach Google Chrome.

0

Für IE können Sie srcElement verwenden und erzwungen.

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

IE srcElement enthält nicht das gleiche Element wie FF explicitOriginalTarget. Es ist leicht zu sehen: Wenn Sie ein Tastenfeld mit onClick Aktion und ein Textfeld mit onChange Aktion haben, ändern Sie das Textfeld und bewegen Sie den Cursor direkt auf die Schaltfläche und klicken Sie darauf. An diesem Punkt wird der IE srcElement das Textfeld sein, aber das explicitOriginalTarget wird das Tastenfeld sein. Für IE können Sie die x, y-Koordinaten des Mausklicks von den Eigenschaften event.x und event.y abrufen.

Leider bietet der Chrome-Browser weder die explicitOriginalTarget noch die Mauskoordinaten für den Klick. Sie sind auf Ihre eigenen Geräte verlassen, um herauszufinden, wo das onChange Ereignis ausgelöst wurde. Um dies zu tun, kann eine vernünftige Verwendung der Ereignisse mousemove und mouseout eine Mausverfolgung bereitstellen, die dann in dem Handler onChange inspiziert werden kann.

3

Update 2015 ... Sie können event.relatedTarget in Chrome verwenden. So eine grundlegende Sache, hoffentlich folgen die anderen Browser ...

+1

Leider sieht es so aus, als ob Firefox .explicitOriginalTarget nicht mehr besitzt oder aussetzt, noch haben sie .relatedTarget noch implementiert, Stand Juli 2015. https://bugzilla.mozilla.org/show_bug.cgi?id = 962251 –

+0

@JudahHimango Firefox 55 unterstützt noch 'ExplicitOriginalTarget'. In Bezug auf 'relatedTarget' ist es nicht das gleiche. – icl7126

Verwandte Themen