Misalkan saya melampirkan blur
fungsi ke kotak input HTML seperti ini:
<input id="myInput" onblur="function() { ... }"></input>
Apakah ada cara untuk mendapatkan ID elemen yang menyebabkan blur
peristiwa tersebut memunculkan (elemen yang diklik) di dalam fungsi? Bagaimana?
Sebagai contoh, misalkan saya memiliki rentang seperti ini:
<span id="mySpan">Hello World</span>
Jika saya mengklik rentang tepat setelah elemen input memiliki fokus, elemen input akan kehilangan fokusnya. Bagaimana fungsi tahu bahwa itu mySpan
yang diklik?
PS: Jika peristiwa onclick dari rentang akan terjadi sebelum peristiwa onblur dari elemen input masalah saya akan diselesaikan, karena saya dapat mengatur beberapa nilai status yang menunjukkan elemen tertentu telah diklik.
PPS: Latar belakang masalah ini adalah bahwa saya ingin memicu kontrol autocompleter AJAX secara eksternal (dari elemen yang dapat diklik) untuk menampilkan sarannya, tanpa saran menghilang segera karena blur
peristiwa pada elemen input. Jadi saya ingin memeriksa blur
fungsi jika satu elemen tertentu telah diklik, dan jika demikian, abaikan acara blur.
sumber
Jawaban:
Hmm ... Di Firefox, Anda bisa menggunakan
explicitOriginalTarget
untuk menarik elemen yang diklik. Saya berharaptoElement
untuk melakukan hal yang sama untuk IE, tetapi tampaknya tidak berfungsi ... Namun, Anda dapat menarik elemen yang baru difokuskan dari dokumen:Peringatan: Teknik ini tidak berfungsi untuk perubahan fokus yang disebabkan oleh tab melalui bidang dengan keyboard, dan tidak berfungsi sama sekali di Chrome atau Safari. Masalah besar dengan menggunakan
activeElement
(kecuali di IE) adalah bahwa hal itu tidak konsisten diperbarui sampai setelah itublur
acara telah diproses, dan mungkin tidak memiliki nilai yang valid sama sekali selama pengolahan! Ini dapat dikurangi dengan variasi pada teknik Michiel akhirnya menggunakan :Ini harus berfungsi di sebagian besar browser modern (diuji di Chrome, IE, dan Firefox), dengan peringatan bahwa Chrome tidak menetapkan fokus pada tombol yang diklik (vs. ditabrakkan ke).
sumber
blur
acara kebakaran. Saya telah memperbarui jawabannya dengan detail. Sudahkah Anda mencoba menggunakan activeElement untuk ini di Chrome atau Firefox? Ini memberi Anda elemen yang kabur ...Jawaban 2015 : menurut Acara UI , Anda dapat menggunakan
relatedTarget
properti acara:Untuk
blur
acara,Contoh:
Catatan Firefox tidak akan mendukung
relatedTarget
hingga versi 48 ( bug 962251 , MDN ).sumber
relatedTarget
akan kembalinull
jika target yang menerima fokus bukan elemen input.tabIndex="0"
atribut ke dalamnya dan itu akan berfungsiSaya menyelesaikannya pada akhirnya dengan batas waktu pada acara onblur (terima kasih atas saran dari teman yang bukan StackOverflow):
Bekerja baik di FF dan IE.
sumber
Dimungkinkan untuk menggunakan acara dokumen mousedown alih-alih blur:
sumber
FocusEvent
Instance type mempunyairelatedTarget
atribut, namun, hingga versi 47 dari FF, secara khusus, atribut ini mengembalikan null, dari 48 yang sudah berfungsi.Anda dapat melihat lebih banyak di sini .
sumber
Saya juga mencoba untuk membuat Autocompleter abaikan blur jika elemen tertentu diklik dan memiliki solusi yang berfungsi, tetapi hanya untuk Firefox karena secara eksplisitOriginalTarget
Kode ini membungkus metode onBlur otomatis pada Autocompleter dan memeriksa apakah parameter ignBlurEventElement disetel. jika disetel, ia memeriksa setiap kali untuk melihat apakah elemen yang diklik diabaikanBlurEventElement atau tidak. Jika ya, Autocompleter tidak dapat menggunakanBlur, selain itu ia memanggil onBlur. Satu-satunya masalah dengan ini adalah bahwa ia hanya berfungsi di Firefox karena properti eksplisitOriginalTarget adalah spesifik Mozilla. Sekarang saya mencoba menemukan cara yang berbeda daripada menggunakan eksplisitOriginalTarget. Solusi yang Anda sebutkan mengharuskan Anda untuk menambahkan perilaku onclick secara manual ke elemen. Jika saya tidak dapat mengelola untuk memecahkan masalah eksplisitOriginalTarget, saya kira saya akan mengikuti solusi Anda.
sumber
Bisakah Anda membalikkan apa yang Anda periksa dan kapan? Itu jika Anda mengingat apa yang kabur terakhir:
dan kemudian di onClick untuk rentang Anda, panggil fungsi () dengan kedua objek:
Fungsi Anda kemudian dapat memutuskan apakah akan memicu kontrol Ajax.AutoCompleter atau tidak. Fungsi memiliki objek yang diklik dan objek kabur. OnBlur telah terjadi sehingga tidak akan membuat saran menghilang.
sumber
Gunakan sesuatu seperti ini:
Dan kemudian di dalam fungsi Anda:
Lalu:
Lalu:
Kode terakhir:
sumber
saya pikir itu tidak mungkin, dengan IE Anda dapat mencoba menggunakan
window.event.toElement
, tetapi itu tidak berfungsi dengan firefox!sumber
Seperti disebutkan dalam jawaban ini , Anda dapat memeriksa nilainya
document.activeElement
.document
adalah variabel global, jadi Anda tidak perlu melakukan sihir apa pun untuk menggunakannya di penangan onBlur Anda:sumber
Jadi cara terbaik adalah menggunakan onclick on body event untuk memahami secara tidak langsung simpul Anda (event.target) tidak jelas
sumber
Bekerja di Google Chrome v66.x, Mozilla v59.x dan Microsoft Edge ... Solusi dengan jQuery.
Komentari tes Anda dalam versi penjelajah internet lainnya.
sumber
Sunting: Cara hacky untuk melakukannya adalah dengan membuat variabel yang melacak fokus untuk setiap elemen yang Anda pedulikan. Jadi, jika Anda peduli bahwa 'input saya' kehilangan fokus, atur variabel ke fokus.
Jawaban Asli: Anda dapat meneruskan 'ini' ke fungsi.
sumber
Saya sarankan menggunakan variabel global blurfrom dan blurto. Kemudian, konfigurasikan semua elemen yang Anda pedulikan untuk menetapkan posisinya di DOM ke blurfrom variabel ketika mereka kehilangan fokus. Selain itu, konfigurasikan agar mendapatkan fokus menetapkan blurto variabel ke posisi mereka di DOM. Kemudian, Anda bisa menggunakan fungsi lain sama sekali untuk menganalisis data blurf dan blurto.
sumber
perlu diingat, bahwa solusi dengan eksplisitOriginalTarget tidak berfungsi untuk lompatan input teks ke input teks.
coba ganti tombol dengan input teks berikut dan Anda akan melihat perbedaannya:
sumber
Saya telah bermain dengan fitur yang sama ini dan menemukan bahwa FF, IE, Chrome dan Opera memiliki kemampuan untuk menyediakan elemen sumber suatu acara. Saya belum menguji Safari, tetapi dugaan saya, mungkin ada yang serupa.
sumber
Saya tidak suka menggunakan batas waktu ketika coding javascript jadi saya akan melakukannya dengan cara yang berlawanan dari Michiel Borkent. (Tidak mencoba kode di belakang tetapi Anda harus mendapatkan ide).
Di kepala kira-kira seperti itu
sumber
Anda dapat memperbaiki IE dengan:
Sepertinya "eksplisitOriginalTarget" untuk FF.
Antoine And J
sumber
Saya menulis sebuah solusi alternatif bagaimana membuat elemen apa pun menjadi fokus dan "blurable".
Ini didasarkan pada pembuatan elemen sebagai
contentEditable
dan menyembunyikannya secara visual dan menonaktifkan mode edit itu sendiri:DEMO
Catatan: Diuji di Chrome, Firefox, dan Safari (OS X). Tidak yakin tentang IE.
Terkait: Saya sedang mencari solusi untuk VueJs, jadi bagi mereka yang tertarik / ingin tahu bagaimana menerapkan fungsionalitas tersebut menggunakan arahan Vue Focusable, silakan lihat .
sumber
Cara ini:
Atau jika Anda melampirkan pendengar melalui JavaScript (jQuery dalam contoh ini):
Edit : maaf. Saya salah membaca pertanyaan.
sumber
Saya pikir itu mudah dimungkinkan melalui jquery dengan melewati referensi lapangan yang menyebabkan peristiwa onblur di "ini".
Untuk misalnya
Terima kasih,
Monika
sumber
Anda bisa membuatnya seperti ini:
sumber
Saya hanya melihat retasan dalam jawaban, tetapi sebenarnya ada solusi bawaan yang sangat mudah digunakan: Pada dasarnya Anda dapat menangkap elemen fokus seperti ini:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
sumber