Jak mogę wykryć kliknięcie poza moim elementem? Używam Vue.js, więc będzie poza moim elementem szablonów. Wiem, jak to zrobić w Vanilla JS, ale nie jestem pewien, czy istnieje lepszy sposób na zrobienie tego, gdy używam Vue.js?
To jest rozwiązanie dla zdarzenia Vanilla JS: wykrywanie kliknięć JavaScript poza div
Myślę, że mogę użyć lepszego sposobu na dostęp do elementu?
javascript
vue.js
Społeczność
źródło
źródło
Odpowiedzi:
Można to ładnie rozwiązać, konfigurując raz dyrektywę niestandardową:
Stosowanie:
W komponencie:
Działające demo na JSFiddle z dodatkowymi informacjami o zastrzeżeniach:
https://jsfiddle.net/Linusborg/yzm8t8jq/
źródło
Jest rozwiązanie, którego użyłem, które jest oparte na odpowiedzi Linusa Borga i działa dobrze z vue.js 2.0.
Łączysz się z nim za pomocą
v-click-outside
:Oto małe demo
Więcej informacji o dyrektywach niestandardowych i znaczeniu el, bind, vnode można znaleźć w https://vuejs.org/v2/guide/custom-directive.html#Directive-Hook-Arguments
źródło
Dodaj
tabindex
atrybut do komponentu, aby można było na nim skupić się i wykonaj następujące czynności:źródło
outline: none;
fokus dla elementu.W społeczności dostępne są dwa pakiety do tego zadania (oba są obsługiwane):
źródło
vue-clickaway
Pakiet doskonale rozwiązał mój problem. DziękiTo zadziałało dla mnie z Vue.js 2.5.2:
źródło
źródło
Połączyłem wszystkie odpowiedzi (w tym wiersz z vue-clickaway) i wymyśliłem to rozwiązanie, które działa dla mnie:
Użyj w komponencie:
źródło
Zaktualizowałem odpowiedź MadisonTrash, aby obsługiwała Mobile Safari (która nie ma
click
zdarzenia,touchend
musi być używana zamiast tego). Obejmuje to również sprawdzenie, aby zdarzenie nie było wyzwalane przez przeciąganie na urządzeniach mobilnych.źródło
Używam tego kodu:
przycisk pokaż-ukryj
element pokaż-ukryj
scenariusz
Aktualizacja: usuń zegarek; dodać stop propagację
źródło
Nienawidzę dodatkowych funkcji, więc ... oto niesamowite rozwiązanie vue bez dodatkowych metod vue, tylko var
źródło
Jeśli szukasz kliknięcia poza elementem, ale nadal w obrębie elementu nadrzędnego, możesz użyć
Używam tego do modali.
źródło
Możesz zarejestrować dwa detektory zdarzeń dla takiego zdarzenia kliknięcia
źródło
źródło
Krótka odpowiedź: należy to zrobić za pomocą dyrektyw niestandardowych .
Jest tu wiele świetnych odpowiedzi, które również to mówią, ale większość odpowiedzi, które widziałem, załamuje się, gdy zaczniesz intensywnie korzystać z zewnętrznego kliknięcia (szczególnie warstwowego lub z wieloma wykluczeniami). Napisałem na medium artykuł, w którym mówiłem o niuansach dyrektyw niestandardowych, a konkretnie o implementacji tej. Może nie obejmuje wszystkich skrajnych przypadków, ale obejmuje wszystko, co wymyśliłem.
Uwzględni to wiele powiązań, wiele poziomów wykluczeń innych elementów i pozwoli programowi obsługi tylko zarządzać „logiką biznesową”.
Oto kod przynajmniej części definicji, zapoznaj się z artykułem, aby uzyskać pełne wyjaśnienie.
źródło
Zrobiłem to w nieco inny sposób, używając funkcji w obrębie created ().
W ten sposób, jeśli ktoś kliknie poza elementem, to w moim przypadku nawigacja mobilna jest ukryta.
Mam nadzieję że to pomoże!
źródło
Istnieje już wiele odpowiedzi na to pytanie, a większość z nich opiera się na podobnej idei dyrektywy celnej. Problem z tym podejściem polega na tym, że trzeba przekazać funkcję metody do dyrektywy i nie można bezpośrednio pisać kodu, jak w innych zdarzeniach.
Utworzyłem nowy pakiet,
vue-on-clickout
który jest inny. Sprawdź to na:Pozwala pisać
v-on:clickout
jak każde inne wydarzenie. Na przykład możesz pisaći to działa.
Aktualizacja
vue-on-clickout
obsługuje teraz Vue 3!źródło
Tylko jeśli ktoś szuka sposobu na ukrycie modalu po kliknięciu poza modalem. Ponieważ modal zwykle ma opakowanie z klasą
modal-wrap
lub jakąkolwiek inną nazwą, możesz ją założyć@click="closeModal"
. Używając obsługi zdarzeń opisanej w dokumentacji vuejs, możesz sprawdzić, czy kliknięty cel znajduje się w opakowaniu, czy w module.źródło
Rozwiązania @Denis Danilenko działają dla mnie, oto co zrobiłem: Przy okazji używam VueJS CLI3 i NuxtJS tutaj oraz z Bootstrap4, ale będzie działać również na VueJS bez NuxtJS:
źródło
Możesz emitować niestandardowe natywne zdarzenie javascript z dyrektywy. Utwórz dyrektywę, która wywołuje zdarzenie z węzła, używając node.dispatchEvent
Które można wykorzystać w ten sposób
źródło
Tworzę element div na końcu ciała w ten sposób:
Gdzie .outside jest:
A away () to metoda w instancji Vue:
Spokojnie, działa dobrze.
źródło
Jeśli masz komponent z wieloma elementami wewnątrz elementu głównego, możesz użyć tego rozwiązania It just works ™ z wartością logiczną.
źródło
Użyj tego pakietu vue-click-outside
Jest prosty i niezawodny, obecnie używany przez wiele innych pakietów. Możesz również zmniejszyć rozmiar pakietu javascript, wywołując pakiet tylko w wymaganych komponentach (patrz przykład poniżej).
npm install vue-click-outside
Stosowanie :
źródło
Nie odkrywaj na nowo koła, użyj tego pakietu v-click-outside
źródło
Możesz stworzyć nowy komponent, który będzie obsługiwał zewnętrzne kliknięcie
I użyj tego komponentu:
źródło
często ludzie chcą wiedzieć, czy użytkownik opuścił komponent root (działa z dowolnymi komponentami poziomu)
źródło
Mam rozwiązanie do obsługi menu przełączania rozwijanego:
źródło
Używam tego pakietu: https://www.npmjs.com/package/vue-click-outside
U mnie działa dobrze
HTML:
Moje kody skryptów:
źródło