Saya telah melihat metode berikut untuk menempatkan kode JavaScript di <a>
tag:
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>
Saya memahami gagasan untuk mencoba menempatkan URL yang valid alih-alih hanya kode JavaScript, untuk berjaga-jaga jika pengguna tidak mengaktifkan JavaScript. Tetapi untuk tujuan diskusi ini, saya perlu berasumsi JavaScript diaktifkan (mereka tidak dapat masuk tanpanya).
Saya pribadi menyukai opsi 2 karena memungkinkan Anda untuk melihat apa yang akan dijalankan - terutama berguna saat men-debug di mana ada parameter yang diteruskan ke fungsi. Saya telah menggunakannya cukup lama dan tidak menemukan masalah browser.
Saya telah membaca bahwa orang merekomendasikan 4, karena memberi pengguna tautan nyata untuk diikuti, tetapi sebenarnya, # tidak "nyata". Ini sama sekali tidak akan pergi kemana-mana.
Apakah ada yang tidak mendukung atau benar-benar buruk, ketika Anda mengetahui pengguna telah mengaktifkan JavaScript?
Pertanyaan terkait: Href untuk tautan JavaScript: “#” atau “javascript: void (0)”? .
sumber
Jawaban:
Saya cukup menikmati artikel Praktik Terbaik Javascript Matt Kruse . Di dalamnya, dia menyatakan bahwa menggunakan
href
bagian untuk mengeksekusi kode JavaScript adalah ide yang buruk. Meskipun Anda telah menyatakan bahwa pengguna Anda harus mengaktifkan JavaScript, tidak ada alasan Anda tidak dapat memiliki halaman HTML sederhana yang dapat ditunjukkan oleh semua tautan JavaScript Anda untukhref
bagian mereka jika seseorang mematikan JavaScript setelah masuk. Saya akan sangat menganjurkan Anda untuk tetap mengizinkan mekanisme fallback ini. Sesuatu seperti ini akan mematuhi "praktik terbaik" dan mencapai tujuan Anda:<a href="javascript_required.html" onclick="doSomething(); return false;">go</a>
sumber
Mengapa Anda melakukan ini saat Anda bisa menggunakan
addEventListener
/attachEvent
? Jika tidak adahref
-equivalent, jangan gunakan<a>
, gunakan a<button>
dan beri gaya yang sesuai.sumber
Anda lupa metode lain:
5: <a href="#" id="myLink">Link</a>
Dengan kode JavaScript:
document.getElementById('myLink').onclick = function() { // Do stuff. };
Saya tidak dapat berkomentar tentang opsi mana yang memiliki dukungan terbaik atau mana yang secara semantik terbaik, tetapi saya hanya akan mengatakan bahwa saya lebih suka gaya ini karena memisahkan konten Anda dari kode JavaScript Anda. Itu membuat semua kode JavaScript bersama-sama, yang jauh lebih mudah untuk dipertahankan (terutama jika Anda menerapkan ini ke banyak tautan), dan Anda bahkan dapat meletakkannya di file eksternal yang kemudian dapat dikemas untuk mengurangi ukuran file dan di-cache oleh browser klien.
sumber
<a href="#" onClick="DoSomething(); return false;">link</a>
Saya akan melakukan ini, atau:
<a href="#" id = "Link">link</a> (document.getElementById("Link")).onclick = function() { DoSomething(); return false; };
Tergantung situasinya. Untuk aplikasi yang lebih besar, yang kedua adalah yang terbaik karena ini menggabungkan kode acara Anda.
sumber
Metode # 2 memiliki kesalahan sintaks di FF3 dan IE7. Saya lebih suka metode # 1 dan # 3, karena # 4 mengotori URI dengan '#' meskipun menyebabkan lebih sedikit pengetikan ... Jelas, seperti dicatat oleh tanggapan lain, solusi terbaik adalah memisahkan html dari penanganan acara.
sumber
return false
. Untuk alasan itu metode # 4 mungkin yang terbaik (dari yang terdaftar).Satu perbedaan yang saya perhatikan antara ini:
<a class="actor" href="javascript:act1()">Click me</a>
dan ini:
<a class="actor" onclick="act1();">Click me</a>
adalah jika dalam kedua kasus Anda memiliki:
<script>$('.actor').click(act2);</script>
lalu untuk contoh pertama
act2
akan berjalan sebelumact1
dan pada contoh kedua akan berjalan sebaliknya.sumber
Hanya browser modern
<!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>
Lintas browser
<!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>
Anda dapat menjalankan ini sebelum dokumen siap, mengklik tombol akan berfungsi karena kami melampirkan acara ke dokumen.
Sumber:
sumber