Załóżmy, że dołączam blur
funkcję do pola wprowadzania HTML, takiego jak to:
<input id="myInput" onblur="function() { ... }"></input>
Czy istnieje sposób na uzyskanie identyfikatora elementu, który spowodował blur
zdarzenia (elementu, który został kliknięty) wewnątrz funkcji? W jaki sposób?
Załóżmy na przykład, że mam taki zakres:
<span id="mySpan">Hello World</span>
Jeśli kliknę rozpiętość zaraz po skupieniu elementu wejściowego, element wejściowy straci swoje skupienie. Skąd funkcja wie, że tak byłomySpan
że została kliknięta?
PS: Gdyby zdarzenie onclick zakresu miało miejsce przed zdarzeniem onblur elementu wejściowego, mój problem zostałby rozwiązany, ponieważ mogłem ustawić pewną wartość statusu wskazującą, że kliknięto określony element.
PPS: Tło tego problemu polega na tym, że chcę uruchomić zewnętrzną kontrolę autouzupełniacza AJAX (z klikalnego elementu), aby pokazać jej sugestie, bez sugestii znikających natychmiast z powodu blur
zdarzenia na elemencie wejściowym. Chcę więc sprawdzić w blur
funkcji, czy kliknięto jeden konkretny element, a jeśli tak, zignoruj zdarzenie rozmycia.
źródło
Odpowiedzi:
Hmm ... W Firefoksie możesz użyć
explicitOriginalTarget
elementu, który został kliknięty. Oczekiwałem,toElement
że zrobię to samo dla IE, ale wydaje się, że to nie działa ... Możesz jednak pobrać nowo skoncentrowany element z dokumentu:Ostrzeżenie: ta technika nie działa w przypadku zmian fokusów spowodowanych tabulowaniem pól za pomocą klawiatury i nie działa w ogóle w Chrome ani Safari. Duży problem z użyciem
activeElement
(z wyjątkiem IE) jest to, że nie jest stale aktualizowana, aż poblur
zdarzenie zostało przetworzone, a może nie mieć prawidłową wartość w ogóle podczas przetwarzania! Można to złagodzić poprzez zmianę techniki, w której Michiel skończył stosując :Powinno to działać w większości nowoczesnych przeglądarek (testowanych w Chrome, IE i Firefox), z zastrzeżeniem, że Chrome nie ustawia ostrości na klikane przyciski (w porównaniu z kartami).
źródło
blur
zdarzenia. Zaktualizowałem odpowiedź ze szczegółami. Czy próbowałeś użyć activeElement do tego w Chrome lub Firefox? Daje zamazany element ...Odpowiedź 2015 : zgodnie z Zdarzeniami interfejsu użytkownika można użyć
relatedTarget
właściwości zdarzenia:Na
blur
imprezyPrzykład:
Uwaga Firefox nie będzie obsługiwany
relatedTarget
do wersji 48 ( błąd 962251 , MDN ).źródło
relatedTarget
powróci,null
jeśli docelowy fokus nie jest elementem wejściowym.tabIndex="0"
do niego atrybut, a zadziałaRozwiązałem go w końcu z limitem czasu na zdarzeniu onblur (dzięki radom znajomego, który nie jest StackOverflow):
Działa zarówno w FF, jak i IE.
źródło
Możliwe jest użycie zdarzenia mousedown dokumentu zamiast rozmycia:
źródło
FocusEvent
Instancje typu mająrelatedTarget
atrybut, jednak do wersji 47 FF, w szczególności ten atrybut zwraca null, z 48 już działa.Możesz zobaczyć więcej tutaj .
źródło
Staram się również, aby Autouzupełnianie ignorował rozmycie, jeśli kliknąłby określony element i miał działające rozwiązanie, ale tylko dla Firefoksa z powodu jawnegoOriginalTarget
Ten kod otacza domyślną metodę onBlur autouzupełniacza i sprawdza, czy ustawione są parametry ignoreBlurEventElement. jeśli jest ustawiony, sprawdza za każdym razem, czy kliknięty element jest ignoreBlurEventElement, czy nie. Jeśli tak jest, autouzupełnianie nie caluje na Blur, w przeciwnym razie wywołuje Blur. Jedynym problemem jest to, że działa tylko w przeglądarce Firefox, ponieważ właściwość wyraźneOriginalTarget jest specyficzna dla Mozilli. Teraz próbuję znaleźć inny sposób niż użycie jawnegoOriginalTarget. Rozwiązanie, o którym wspomniałeś, wymaga ręcznego dodania zachowania elementu do elementu. Jeśli nie uda mi się rozwiązać problemu z jawnymOriginalTarget, chyba postąpię zgodnie z twoim rozwiązaniem.
źródło
Czy możesz cofnąć to, co sprawdzasz i kiedy? To znaczy, jeśli pamiętasz, co zostało zamazane ostatnio:
a następnie w onClick dla swojego zakresu, wywołaj funkcję () dla obu obiektów:
Twoja funkcja może wtedy zdecydować, czy uruchomić kontrolę Ajax.AutoCompleter. Funkcja ma kliknięty obiekt i obiekt zamazany. OnBlur już się wydarzył, więc nie sprawi, że sugestie znikną.
źródło
Użyj czegoś takiego:
A potem w twojej funkcji:
I wtedy:
I wtedy:
Ostateczny kod:
źródło
myślę, że nie jest to możliwe, z IE możesz spróbować użyć
window.event.toElement
, ale nie działa z Firefoksem!źródło
Jak zauważono w tej odpowiedzi , możesz sprawdzić wartość
document.activeElement
.document
jest zmienną globalną, więc nie musisz robić żadnej magii, aby użyć jej w module obsługi onBlur:źródło
Najlepszym sposobem jest użycie zdarzenia kliknięcia na ciele do pośredniego zrozumienia twojego węzła (event.target) jest rozmazany
źródło
Działa w Google Chrome v66.x, Mozilla v59.x i Microsoft Edge ... Rozwiązanie z jQuery.
Skomentuj swój test w innych wersjach Internet Explorera.
źródło
Edycja: hacking sposób to zrobić, aby utworzyć zmienną, która śledzi fokus dla każdego elementu, na którym ci zależy. Tak więc, jeśli zależy ci na tym, aby „myInput” stracił fokus, ustaw dla niego zmienną fokus.
Oryginalna odpowiedź: Możesz przekazać „to” do funkcji.
źródło
Sugeruję użycie zmiennych globalnych blurfrom i blurto. Następnie skonfiguruj wszystkie elementy, które chcesz, aby przypisały swoją pozycję w DOM do zmiennej blurrom, gdy stracą fokus. Dodatkowo skonfiguruj je tak, aby uzyskanie fokusu ustawiło zmienną blurto na ich pozycję w DOM. Następnie możesz użyć innej funkcji do analizy rozmycia i danych rozmycia do danych.
źródło
należy pamiętać, że rozwiązanie z jawnymOriginalTarget nie działa w przypadku skoków wprowadzania tekstu na tekst.
spróbuj zastąpić przyciski następującymi danymi wejściowymi, a zobaczysz różnicę:
źródło
Grałem z tą samą funkcją i odkryłem, że FF, IE, Chrome i Opera mają możliwość zapewnienia elementu źródłowego wydarzenia. Nie testowałem Safari, ale przypuszczam, że może mieć coś podobnego.
źródło
Nie lubię używać limitu czasu podczas kodowania javascript, więc zrobiłbym to w odwrotny sposób niż Michiel Borkent. (Nie wypróbowałem kodu, ale powinieneś o tym pomyśleć).
W głowie coś takiego
źródło
Możesz naprawić IE za pomocą:
Wygląda to jak „wyraźneOriginalTarget” dla FF.
Antoine And J.
źródło
Napisałem alternatywne rozwiązanie jak uczynić dowolny element możliwym do zogniskowania i „rozmytym”.
Polega na utworzeniu elementu jako
contentEditable
wizualnym ukryciu go i wyłączeniu samego trybu edycji:PRÓBNY
Uwaga: Testowane w Chrome, Firefox i Safari (OS X). Nie jestem pewien co do IE.
Powiązane: Szukałem rozwiązania dla VueJ, więc dla tych, którzy są zainteresowani / ciekawi, jak wdrożyć taką funkcjonalność za pomocą dyrektywy Vue Focusable, spójrz .
źródło
Tą drogą:
Lub jeśli dołączasz nasłuchiwanie przez JavaScript (jQuery w tym przykładzie):
Edycja : przepraszam. Źle odczytałem pytanie.
źródło
Myślę, że łatwo jest to zrobić za pomocą jquery, przekazując odniesienie do pola powodującego zdarzenie onblur w „this”.
Na przykład
Dzięki
Monika
źródło
Możesz to zrobić tak:
źródło
Widzę tylko hacki w odpowiedziach, ale tak naprawdę istnieje bardzo łatwe w użyciu wbudowane rozwiązanie: Zasadniczo możesz przechwycić element skupienia w następujący sposób:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
źródło