Powiedzmy, że mam tag zakotwiczenia, taki jak
<a href="#" ng-click="do()">Click</a>
Jak mogę uniemożliwić przeglądarce przejście do # w AngularJS ?
Powiedzmy, że mam tag zakotwiczenia, taki jak
<a href="#" ng-click="do()">Click</a>
Jak mogę uniemożliwić przeglądarce przejście do # w AngularJS ?
href
.href=''
aby zachować zachowanie wskaźnika myszy.Odpowiedzi:
AKTUALIZACJA : Od tego czasu zmieniłem zdanie na temat tego rozwiązania. Po dalszym rozwoju i czasie poświęconym na pracę nad tym rozwiązaniem, uważam, że lepszym rozwiązaniem tego problemu jest wykonanie następujących czynności:
A następnie zaktualizuj,
css
aby mieć dodatkową regułę:Jest o wiele prostszy i zapewnia dokładnie taką samą funkcjonalność oraz jest znacznie bardziej wydajny. Mam nadzieję, że może to być pomocne dla każdego, kto szuka tego rozwiązania w przyszłości.
Oto moje poprzednie rozwiązanie, które zostawiam tutaj tylko w celach starszych:
Jeśli często masz ten problem, prosta dyrektywa, która rozwiązałaby ten problem, jest następująca:
Sprawdza wszystkie tagi anchor (
<a></a>
), aby sprawdzić, czy ichhref
atrybut jest pustym ciągiem (""
) lub hashem ('#'
), czy istniejeng-click
przypisanie. Jeśli znajdzie którykolwiek z tych warunków, łapie zdarzenie i zapobiega domyślnemu zachowaniu.Jedynym minusem jest to, że uruchamia tę dyrektywę dla wszystkich tagów zakotwiczenia. Jeśli więc masz na stronie wiele tagów zakotwiczenia i chcesz zapobiec domyślnemu zachowaniu tylko niewielkiej ich liczby, to ta dyrektywa nie jest zbyt wydajna. Jednak prawie zawsze chcę
preventDefault
, więc używam tej dyrektywy w moich aplikacjach AngularJS.źródło
href
atrybutu ma różne zachowanie w różnych przeglądarkach. Chociaż zgadzam się, że jest to zdecydowanie najczystsze i najbardziej wydajne rozwiązanie, ma pewne problemy z przeglądarkami. Użycie metody dyrektywy pozwala przeglądarce na obsługę<a>
tagu w normalny sposób, ale nadal uzyskuje OP żądaną odpowiedź.Według dokumentacji dla ngHref powinieneś być w stanie zrezygnować z href lub zrobić href = "".
źródło
Możesz przekazać obiekt zdarzenia $ do swojej metody i wywołać
$event.preventDefault()
go, aby domyślne przetwarzanie nie nastąpiło:źródło
$event.preventDefault()
... podatku IE.ng-click="do(); $event.preventDefault()
na przykład ... chociaż nie jest to konieczne, ponieważ odpowiedź @ Chrisa poniżej jest poprawna. Może to pomóc ludziom w sytuacjach, w których zagnieżdżono ngClicks i chcą jednak zadzwonić$event.stopPropagation()
.Wolę używać do tego celu dyrektyw . Oto przykład
Kod dyrektywy dla
eat-click
:Teraz możesz dodać
eat-click
atrybut do dowolnego elementu, a zostanie onpreventDefault()
zautomatyzowany.Korzyści:
$event
obiektu do swojejdo()
funkcji.$event
obiektuźródło
Error: $ is not defined
. czego mi brakuje?angular.element(element).bind('click', function(event){...});
. Zadziałało. Ref: jQLiteChociaż Renaud dał świetne rozwiązanie
Osobiście odkryłem, że potrzebujesz również $ event.stopPropagation () w niektórych przypadkach, aby uniknąć niektórych skutków ubocznych
będzie moim rozwiązaniem
źródło
źródło
Najłatwiejsze rozwiązanie, jakie znalazłem, to:
źródło
Więc czytając te odpowiedzi, @Chris nadal ma najbardziej „poprawną” odpowiedź, jak sądzę, ale ma jeden problem, nie pokazuje „wskaźnika” ....
Oto dwa sposoby rozwiązania tego problemu bez konieczności dodawania kursora: styl wskaźnika:
Użyj
javascript:void(0)
zamiast#
:Użyj
$event.preventDefault()
wng-click
dyrektywie (aby nie blokować kontrolera referencjami związanymi z DOM):Osobiście wolę ten pierwszy od drugiego.
javascript:void(0)
ma inne zalety omówione tutaj . Dyskusja o „dyskretnym JavaScript” w tym linku, który jest przerażająco nowy i niekoniecznie dotyczy bezpośrednio aplikacji kątowej.źródło
javascript:;
Możesz wykonać następujące czynności
1. Usuń
href
atrybut zea
znacznika anchor ( )2.Ustaw kursor kursora w css, aby kliknąć elementy
źródło
HTML
tutaj pure angularjs: w pobliżu funkcji ng-click możesz napisać funkcję preventDefault () oddzielając średnik
JS
(lub)
możesz postępować w ten sposób, ktoś już o tym tutaj dyskutuje.
HTML
JS
źródło
Wypróbuj tę opcję, która nie jest jeszcze wymieniona powyżej:
źródło
Skoro tworzysz aplikację internetową, dlaczego potrzebujesz linków?
Zamień kotwice na guziki!
źródło
jeśli nadal dotyczy:
źródło
Najbezpieczniejszym sposobem uniknięcia zdarzeń na hrefie byłoby zdefiniowanie go jako
źródło
Poszedłbym z:
Całe to zapobieganie domyślnej rzeczy było dla mnie mylące, więc stworzyłem JSFiddle tam, aby zilustrować, kiedy i gdzie Angular uniemożliwia domyślne .
JSFiddle używa dyrektywy Angulara - więc powinno być DOKŁADNIE takie samo. Możesz zobaczyć kod źródłowy tutaj: kod źródłowy tagu
Mam nadzieję, że pomoże to niektórym wyjaśnić.
Chciałbym opublikować dokument w ngHref, ale nie mogę z powodu mojej reputacji.
źródło
Tak zawsze robię. Działa jak marzenie!
źródło
Lub jeśli potrzebujesz inline, możesz to zrobić:
źródło
Wiele odpowiedzi wydaje się przesadnych. DLA MNIE działa to
źródło
Potrzebuję obecności wartości atrybutu href do degradacji (gdy js jest wyłączony), więc nie mogę użyć pustego atrybutu href (lub „#”), ale powyższy kod nie działał dla mnie, ponieważ potrzebuję zdarzenia ( e) zmienna. Stworzyłem własną dyrektywę:
W HTML:
źródło
Pożyczanie od odpowiedzi Tennisgent. Podoba mi się, że nie musisz tworzyć niestandardowej dyrektywy, aby dodać wszystkie linki. Nie mogłem jednak zmusić go do pracy w IE8. Oto, co w końcu dla mnie zadziałało (używając angular 1.0.6).
Zauważ, że 'bind' pozwala ci używać jqLite dostarczanego przez angular, więc nie musisz owijać pełnego jQuery. Wymagana również metoda stopPropogation.
źródło
dropdown
, chcę propagacji, ale nie domyślnego zachowania. Ten fragment kodu NIE jest zalecany.Zetknąłem się z tym samym problemem podczas używania kotwic do rozwijania kątowego paska startowego. Jedynym rozwiązaniem, które zauważyłem, że uniknęło niepożądanych efektów ubocznych (tj. Rozwijanie się nie zamyka z powodu użycia funkcji preventDefault ()), było zastosowanie następujących czynności:
źródło
jeśli nigdy nie chcesz iść do href ... powinieneś zmienić swój znacznik i użyć przycisku, a nie tagu kotwicy, ponieważ semantycznie nie jest to kotwica ani link. Odwrotnie, jeśli masz przycisk, który wykonuje pewne kontrole, a następnie przekierowuje, powinien to być link / tag zakotwiczenia, a nie przycisk ... do celów SEO, a także do testowania [wstaw tutaj pakiet testowy].
dla linków, które chcesz tylko warunkowo przekierować, takich jak monit o zapisanie zmian lub potwierdzenie stanu nieczystości ... powinieneś użyć ng-click = "someFunction ($ event)", a w someFunction w swojej walidacjiError zapobiegaj domyślnej i stopPropagacji.
również dlatego, że możesz, nie znaczy, że powinieneś . javascript: void (0) działał dobrze w ciągu dnia ... ale z powodu nikczemnych hakerów / crackerów przeglądarki oznaczają aplikacje / witryny, które używają javascript w href ... nie widzę powodu, aby unikać tego typu ..
jest rok 2016, ponieważ 2010 nie powinien być nigdzie powodem do używania linków, które działają jak przyciski ... jeśli nadal musisz obsługiwać IE8, a poniżej musisz ponownie ocenić swoje miejsce prowadzenia działalności.
źródło
źródło
To, co powinieneś zrobić, to
href
całkowicie pominąć atrybut.Jeśli spojrzeć na kod źródłowy do
a
dyrektywy element (który jest częścią kątowego rdzenia), stwierdza się na linii 29 - 31:Co oznacza, że Angular już rozwiązuje problem linków bez href. Jedyny problem, który nadal masz, to problem z css. Nadal możesz zastosować styl wskaźnika do kotwic, które mają kliknięcia ng, np .:
Możesz nawet zwiększyć dostępność witryny, zaznaczając prawdziwe linki subtelną, inną stylizacją niż linki wykonujące funkcje.
Miłego kodowania!
źródło
Możesz wyłączyć przekierowanie adresu URL wewnątrz Html5Mode $ location, aby osiągnąć cel. Możesz go zdefiniować w określonym kontrolerze używanym dla strony. Coś takiego:
źródło
Jeśli używasz Angulara 8 lub więcej, możesz utworzyć dyrektywę:
Na tagu zakotwiczonym w komponencie możesz go połączyć w następujący sposób:
Moduł aplikacji powinien mieć deklarację:
źródło
Alternatywą może być:
źródło
span
do celów klikania. Po prostu skorzystaj z odpowiedzi @ tennisgent - kotwicehref
niezdefiniowane.