2008-10-07 14 views
16

Czy ktoś wie o crossbrowserowym odpowiedniku parametru zdarzenia explicitOriginalTarget? Ten parametr jest specyficzny dla Mozilli i daje mi element, który spowodował rozmycie. Załóżmy, że mam wpis tekstowy i link na mojej stronie. Wprowadzanie tekstu jest aktywne. Jeśli kliknę link, zdarzenie blur wprowadzania tekstu daje mi element linku w Firefoksie poprzez parametr explicitOriginalTarget.Odpowiednik Crossbrowser parametru zdarzenia explicitOriginalTarget

Rozszerzam metodę Autocompleter.Base onBlur, aby nie ukrywać wyników wyszukiwania, gdy pole wyszukiwania utraci fokus na dane elementy. Domyślnie metoda onBlur ukrywa się, jeśli pole wyszukiwania utraci fokus na dowolny element.

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

Dzięki.

Odpowiedz

9

Nie ma odpowiednika jawnego Pierwotnego Celu w żadnej innej przeglądarce niż Gecko. W Gecko jest to właściwość wewnętrzna i nie powinna być używana przez programistę aplikacji (może przez pisarzy wiążących XBL).

+0

Dzięki Sergey. Może powinienem zacząć pisać własną metodę, używając delegacji zdarzeń, zamiast próbować rozszerzyć metodę AutocompleterBur. Dzięki delegowaniu zdarzeń i użyciu niektórych zmiennych globalnych mogę to naprawić. – matte

1

Wygląda na to, że jest bardziej przeznaczony dla twórców rozszerzeń niż do projektowania sieci ...

chciałbym oglądać wydarzenia rozmycie/skupić się na obu celów (lub potencjalnych celów) i dzielenia się informacjami.
Dokładna implementacja może w rzeczywistości zależeć od celu.

+0

Wydawało mi się również, że oglądam zdarzenie rozmycia/fokusu na obu obiektach, ale jeśli Firefox ma do tego specyficzny parametr (explicitOriginalTarget), być może inne przeglądarki też mają. Może nie parametr, ale hack. – matte

3

Szorstki odpowiednik dla Mozilla .explicitOriginalTarget w IE to document.activeElement. Mówię szorstki odpowiednik, ponieważ czasami zwróci nieco inny poziom w drzewie węzłów DOM, w zależności od okoliczności, ale nadal jest przydatnym narzędziem. Niestety wciąż szukam odpowiednika Google Chrome.

0

Dla IE można użyć srcElement i wymusić.

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

IE srcElement nie zawiera tego samego pierwiastka, jak FF explicitOriginalTarget. Łatwo to zauważyć: jeśli masz pole przycisku z działaniem onClick i pole tekstowe z akcją onChange, zmień pole tekstowe i przesuń kursor bezpośrednio na przycisk i kliknij go. W tym momencie IE srcElement będzie polem tekstowym, ale explicitOriginalTarget będzie polem przycisku. W przypadku IE można uzyskać współrzędne x, y kliknięcia myszą od właściwości event.x i event.y.

Niestety, przeglądarka Chrome nie udostępnia ani wartości explicitOriginalTarget, ani współrzędnych myszy dla kliknięcia. Zostawiłeś na własne urządzenia, aby dowiedzieć się, z którego zdarzenia wystartowało zdarzenie onChange. Aby to zrobić, rozważne użycie zdarzeń mousemove i mouseout może zapewnić śledzenie myszy, które można następnie sprawdzić w procedurze obsługi onChange.

3

Aktualizacja 2015 ... możesz użyć event.relatedTarget w przeglądarce Chrome. Taka podstawowa rzecz, mam nadzieję, że inne przeglądarki pójdą w ślady ...

+1

Niestety, wygląda na to, że Firefox nie ma już ani nie wystawiał .explicitOriginalTarget, ani też nie zaimplementował .relatedTarget jeszcze, od lipca 2015. https://bugzilla.mozilla.org/show_bug.cgi?id = 962251 –

+0

@JudahHimango Firefox 55 nadal obsługuje 'explicitOriginalTarget'. Jeśli chodzi o 'relatedTarget', to wcale nie jest to samo. – icl7126

Powiązane problemy