Widziałem następujące metody umieszczania kodu JavaScript w <a>
tagu:
function DoSomething() { ... return false; }
<a href="javascript:;" onClick="return DoSomething();">link</a>
<a href="javascript:DoSomething();">link</a>
<a href="javascript:void(0);" onClick="return DoSomething();">link</a>
<a href="#" onClick="return DoSomething();">link</a>
Rozumiem ideę próby umieszczenia prawidłowego adresu URL zamiast samego kodu JavaScript, na wypadek gdyby użytkownik nie miał włączonej obsługi JavaScript. Ale na potrzeby tej dyskusji muszę założyć, że JavaScript jest włączony (nie mogą się bez niego zalogować).
Osobiście podoba mi się opcja 2, ponieważ pozwala zobaczyć, co zostanie uruchomione - szczególnie przydatne podczas debugowania, w którym parametry są przekazywane do funkcji. Używałem go dość często i nie znalazłem problemów z przeglądarką.
Czytałem, że ludzie polecają 4, ponieważ daje użytkownikowi prawdziwy link do naśladowania, ale tak naprawdę # nie jest „prawdziwy”. Nigdzie nie pójdzie.
Czy jest taki, który nie obsługuje lub jest naprawdę zły, kiedy wiesz, że użytkownik ma włączoną obsługę JavaScript?
Pytanie pokrewne: Href dla linków JavaScript: „#” czy „javascript: void (0)”? .
źródło
Odpowiedzi:
Bardzo podoba mi się artykuł Matta Kruse poświęcony najlepszym praktykom w Javascript . Stwierdza w nim, że używanie
href
sekcji do wykonywania kodu JavaScript to zły pomysł. Mimo że powiedziałeś, że Twoi użytkownicy muszą mieć włączoną obsługę JavaScript, nie ma powodu, dla którego nie możesz mieć prostej strony HTML, do której wszystkie linki JavaScript mogą wskazywać w ichhref
sekcji w przypadku, gdy ktoś wyłączy JavaScript po zalogowaniu. Gorąco zachęcam do nadal zezwalania na ten mechanizm awaryjny. Coś takiego będzie zgodne z „sprawdzonymi metodami” i osiągnie Twój cel:<a href="javascript_required.html" onclick="doSomething(); return false;">go</a>
źródło
Dlaczego miałbyś to robić, skoro możesz użyć
addEventListener
/attachEvent
? Jeśli nie ma żadnegohref
równoważnika, nie używaj znaku<a>
, użyj a<button>
i odpowiednio go nadaj styl.źródło
Zapomniałeś innej metody:
5: <a href="#" id="myLink">Link</a>
Z kodem JavaScript:
document.getElementById('myLink').onclick = function() { // Do stuff. };
Nie mogę komentować, która z opcji ma najlepszą obsługę lub która jest semantycznie najlepsza, ale powiem tylko, że zdecydowanie wolę ten styl, ponieważ oddziela on treść od kodu JavaScript. Utrzymuje cały kod JavaScript razem, co jest znacznie łatwiejsze w utrzymaniu (szczególnie jeśli stosujesz to do wielu linków), a nawet możesz umieścić go w zewnętrznym pliku, który można następnie spakować w celu zmniejszenia rozmiaru pliku i buforować przez przeglądarki klienta.
źródło
<a href="#" onClick="DoSomething(); return false;">link</a>
Zrobię to lub:
<a href="#" id = "Link">link</a> (document.getElementById("Link")).onclick = function() { DoSomething(); return false; };
Zależne od sytuacji. W przypadku większych aplikacji druga jest najlepsza, ponieważ konsoliduje wtedy kod zdarzenia.
źródło
Metoda nr 2 zawiera błąd składni w FF3 i IE7. Preferuję metody # 1 i # 3, ponieważ # 4 zabrudza identyfikator URI znakiem „#”, chociaż powoduje mniej wpisywania ... Oczywiście, jak zauważają inne odpowiedzi, najlepszym rozwiązaniem jest oddzielenie HTML od obsługi zdarzeń.
źródło
return false
. Z tego powodu metoda nr 4 jest prawdopodobnie najlepsza (spośród wymienionych).Zauważyłem jedną różnicę między tym:
<a class="actor" href="javascript:act1()">Click me</a>
i to:
<a class="actor" onclick="act1();">Click me</a>
jest tak, że w każdym przypadku masz:
<script>$('.actor').click(act2);</script>
wtedy w pierwszym przykładzie
act2
będzie działać przed,act1
aw drugim przykładzie będzie odwrotnie.źródło
Tylko nowoczesne przeglądarki
<!DOCTYPE html> <html> <head> <script type="text/javascript"> (function(doc){ var hasClass = function(el,className) { return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1; } doc.addEventListener('click', function(e){ if(hasClass(e.target, 'click-me')){ e.preventDefault(); doSomething.call(e.target, e); } }); })(document); function doSomething(event){ console.log(this); // this will be the clicked element } </script> <!--... other head stuff ...--> </head> <body> <!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 --> <button class="click-me">Button 1</button> <input class="click-me" type="button" value="Button 2"> </body> </html>
Wiele przeglądarek
<!DOCTYPE html> <html> <head> <script type="text/javascript"> (function(doc){ var cb_addEventListener = function(obj, evt, fnc) { // W3C model if (obj.addEventListener) { obj.addEventListener(evt, fnc, false); return true; } // Microsoft model else if (obj.attachEvent) { return obj.attachEvent('on' + evt, fnc); } // Browser don't support W3C or MSFT model, go on with traditional else { evt = 'on'+evt; if(typeof obj[evt] === 'function'){ // Object already has a function on traditional // Let's wrap it with our own function inside another function fnc = (function(f1,f2){ return function(){ f1.apply(this,arguments); f2.apply(this,arguments); } })(obj[evt], fnc); } obj[evt] = fnc; return true; } return false; }; var hasClass = function(el,className) { return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1; } cb_addEventListener(doc, 'click', function(e){ if(hasClass(e.target, 'click-me')){ e.preventDefault ? e.preventDefault() : e.returnValue = false; doSomething.call(e.target, e); } }); })(document); function doSomething(event){ console.log(this); // this will be the clicked element } </script> <!--... other head stuff ...--> </head> <body> <!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 --> <button class="click-me">Button 1</button> <input class="click-me" type="button" value="Button 2"> </body> </html>
Możesz to uruchomić zanim dokument będzie gotowy, klikanie przycisków zadziała, ponieważ dołączamy zdarzenie do dokumentu.
Źródła:
źródło