Saya tahu ini adalah praktik buruk. Jangan menulis kode seperti ini jika memungkinkan.
Tentu saja, kita akan selalu menemukan diri kita dalam situasi di mana potongan pintar Javascript inline dapat mengatasi masalah dengan cepat.
Saya mengejar pertanyaan ini untuk memahami sepenuhnya apa yang terjadi (dan potensi jebakan) ketika sesuatu seperti ini ditulis:
<a href="#" onclick="alert('Hi')">Click Me</a>
Sejauh yang saya tahu ini secara fungsional sama dengan
<script type="text/javascript">
$(function(){ // I use jQuery in this example
document.getElementById('click_me').onclick =
function () { alert('Hi'); };
});
</script>
<a href="#" id="click_me">Click Me</a>
Ekstrapolasi dari ini nampaknya bahwa string yang ditugaskan untuk atribut onclick
dimasukkan dalam fungsi anonim yang ditugaskan untuk penangan klik elemen. Apakah ini yang sebenarnya terjadi?
Karena saya mulai melakukan hal-hal seperti ini:
<a href="#" onclick="$(this).next().fadeIn(); return false;">Display my next sibling</a> <!-- Return false in handler so as not to scroll to top of page! -->
Yang bekerja Tapi saya tidak tahu seberapa banyak retasan ini. Ini terlihat mencurigakan karena tidak ada fungsi jelas yang sedang dikembalikan!
Anda mungkin bertanya, mengapa Anda melakukan ini, Steve? Inline JS adalah praktik buruk!
Ya jujur saja, saya bosan mengedit tiga bagian kode yang berbeda hanya untuk memodifikasi satu bagian halaman, terutama ketika saya hanya membuat prototipe sesuatu untuk melihat apakah itu akan bekerja sama sekali. Ini jauh lebih mudah dan kadang-kadang bahkan masuk akal untuk kode yang secara khusus terkait dengan elemen HTML ini untuk didefinisikan tepat di dalam elemen: Ketika saya memutuskan 2 menit kemudian bahwa ini adalah ide yang mengerikan, mengerikan saya bisa memuntahkan seluruh div (atau apa pun ) dan saya tidak memiliki banyak JS misterius dan cruft berkeliaran di sisa halaman, memperlambat rendering sedikit. Ini mirip dengan konsep lokalitas referensi tetapi alih-alih meleset dari cache, kami melihat bug dan mengasapi kode.
sumber
#click_me
acara DOMready, atau menempatkan skrip setelah node.document.getElementById("click_me").onclick;
. Atau beri tahu. Anda akan melihat bahwa itu ada dalam suatu fungsi.Jawaban:
Anda sudah hampir benar, tetapi Anda belum memperhitungkan
this
nilai yang diberikan ke kode sebaris.sebenarnya lebih dekat ke:
Penangan acara sebaris yang disetel
this
sama dengan target acara. Anda juga dapat menggunakan fungsi anonim dalam skrip inlinesumber
event
dengan inlineonclick='myFunction(event)'
??Apa yang dilakukan browser saat Anda memilikinya
adalah mengatur nilai aktual "onclick" menjadi sesuatu yang efektif seperti:
Yaitu, ia menciptakan fungsi yang mengharapkan parameter "event". (Ya, IE tidak; itu lebih seperti fungsi anonim sederhana sederhana.)
sumber
event
untuk mengambil acara (dan elemen yang berasal dari viaevent.target
), dari potongan JS inline saya! Keren.event
parameter, tetapi jika Anda menggunakanevent
di dalam fungsi anonim ini IE akan memahaminya sebagai Objek Acara yang sebenarnya. Karena fungsi anonim ditetapkan sebagai propertiwindow
objek di IE, ia akan melihat ini sebagaiwindow.event
.Tampaknya ada banyak praktik buruk yang dilemparkan ke Atribut Event Handler. Praktik buruk adalah tidak mengetahui dan menggunakan fitur yang tersedia di tempat yang paling tepat. Atribut Acara sepenuhnya standar W3C yang didokumentasikan dan tidak ada praktik buruk tentang mereka. Ini tidak berbeda dengan menempatkan gaya inline, yang juga didokumentasikan W3C dan dapat berguna pada saatnya. Apakah Anda menempatkannya dalam tag skrip atau tidak, itu akan ditafsirkan dengan cara yang sama.
https://www.w3.org/TR/html5/webappapis.html#event-handler-idl-attributes
sumber
bad practice/spaghettification
bagi sebagian orang,good practice/structure
bagi orang lain.Cara terbaik untuk menjawab pertanyaan Anda adalah melihatnya dalam tindakan.
Di js
Seperti yang Anda lihat di
console
, jika Anda menggunakan chrome, ia mencetak fungsi anonim dengan objek acara dilewatkan, meskipun sedikit berbeda di IE.Saya setuju dengan beberapa poin Anda tentang penangan event inline. Ya mereka mudah untuk ditulis, tetapi saya tidak setuju dengan poin Anda tentang harus mengubah kode di banyak tempat, jika Anda menyusun kode dengan baik, Anda tidak perlu melakukan ini.
sumber
<button onclick="login()"> test login </button>
itu baik-baik saja untuk membuat prototipe. Anda ingin menguji sesuatu yang memerlukan interaksi pengguna sekarang, dan Anda hanya akan menghapusnya nanti. Mengapa menulis kode tambahan di semua tempat?Ini adalah fungsi anonim yang telah dilampirkan ke acara klik objek.
Mengapa kamu melakukan ... Ah tidak pernah, seperti yang telah Anda sebutkan, itu benar-benar praktik buruk yang diadopsi secara luas :)
sumber
Coba ini di konsol:
Di Chrome, ini menunjukkan ini:
... dan non-standar
name
milikdiv.onclick
yaitu"onclick"
.Jadi, apakah ini anonim atau tidak tergantung definisi Anda tentang "anonim." Bandingkan dengan sesuatu seperti
var foo = new Function()
, di manafoo.name
string kosong, danfoo.toString()
akan menghasilkan sesuatu sepertisumber