Di halaman depan situs yang saya bangun, beberapa orang <div>
menggunakan CSS :hover
pseudo-class untuk menambahkan batas ketika mouse berada di atasnya. Salah satu dari <div>
s mengandung <form>
yang, menggunakan jQuery, akan menjaga perbatasan jika input di dalamnya memiliki fokus. Ini berfungsi dengan baik kecuali bahwa IE6 tidak mendukung :hover
elemen apa pun selain <a>
s. Jadi, untuk browser ini saja kami menggunakan jQuery untuk meniru CSS :hover
menggunakan $(#element).hover()
metode ini. Satu-satunya masalah adalah, sekarang jQuery menangani formulir focus()
dan hover()
, ketika input memiliki fokus maka pengguna menggerakkan mouse masuk dan keluar, perbatasan hilang.
Saya berpikir kita bisa menggunakan semacam persyaratan untuk menghentikan perilaku ini. Misalnya, jika kami menguji pada mouse out jika ada input yang memiliki fokus, kami dapat menghentikan perbatasan agar tidak hilang. AFAIK, tidak ada :focus
pemilih di jQuery, jadi saya tidak yakin bagaimana membuat ini terjadi. Ada ide?
sumber
Jawaban:
jQuery 1.6+
jQuery menambahkan
:focus
pemilih sehingga kami tidak perlu menambahkannya sendiri. Gunakan saja$("..").is(":focus")
jQuery 1.5 dan di bawah
Sunting: Seiring waktu berubah, kami menemukan metode yang lebih baik untuk menguji fokus, favorit baru adalah inti dari Ben Alman :
Dikutip dari Mathias Bynens di sini :
Anda menetapkan pemilih baru. Lihat Plugin / Penulisan . Maka Anda dapat melakukan:
atau:
JQuery apa saja
Jika Anda hanya ingin mengetahui elemen mana yang memiliki fokus, Anda dapat menggunakannya
Jika Anda tidak yakin apakah versinya akan 1.6 atau lebih rendah, Anda bisa menambahkan
:focus
pemilih jika tidak ada:sumber
if (!jQuery.expr[':'].focus) { /* gist from Ben Alman */ }
?CSS:
JQuery:
sumber
Inilah jawaban yang lebih kuat daripada jawaban yang saat ini diterima:
Perhatikan bahwa
(elem.type || elem.href)
tes ditambahkan untuk menyaring seperti positif palsubody
. Dengan cara ini, kami memastikan untuk memfilter semua elemen kecuali kontrol bentuk dan hyperlink.(Diambil dari intisari ini oleh Ben Alman .)
sumber
Pembaruan April 2015
Karena pertanyaan ini sudah ada sejak lama, dan beberapa konvensi baru telah ikut bermain, saya merasa bahwa saya harus menyebutkan
.live
metode ini telah didepresiasi.Sebagai gantinya,
.on
metode ini sekarang telah diperkenalkan.Dokumentasi mereka sangat berguna dalam menjelaskan cara kerjanya;
Jadi, agar Anda menargetkan acara 'fokus input', Anda dapat menggunakan ini dalam skrip. Sesuatu seperti:
Ini cukup kuat dan bahkan memungkinkan Anda untuk menggunakan kunci TAB juga.
sumber
Saya tidak sepenuhnya yakin apa yang Anda cari tetapi ini kedengarannya dapat dicapai dengan menyimpan status elemen input (atau div?) Sebagai variabel:
sumber
Alternatif untuk menggunakan kelas untuk menandai keadaan elemen adalah fungsionalitas penyimpanan data internal .
PS: Anda dapat menyimpan boolean dan apa pun yang Anda inginkan menggunakan
data()
fungsi. Ini bukan hanya tentang string :)Dan kemudian itu hanya masalah mengakses keadaan elemen.
sumber
jika ada yang peduli ada cara yang lebih baik untuk menangkap fokus sekarang,
$(foo).focus(...)
http://api.jquery.com/focus/
sumber
Pernahkah Anda berpikir tentang menggunakan mouseOver dan mouseOut untuk mensimulasikan ini. Lihat juga mouseEnter dan mouseLeave
sumber
Pantau kedua status (melayang, fokus) sebagai bendera benar / salah, dan setiap kali ada perubahan, jalankan fungsi yang menghilangkan batas jika keduanya salah, jika tidak, perlihatkan perbatasan.
Jadi: onfocus set terfokus = benar, set onblur terfokus = salah. set onmouseover hovered = true, set onmouseout hovered = false. Setelah masing-masing peristiwa ini menjalankan fungsi yang menambah / menghilangkan batas.
sumber
Sejauh yang saya tahu, Anda tidak dapat meminta browser jika ada input di layar yang memiliki fokus, Anda harus mengatur semacam pelacakan fokus.
Saya biasanya memiliki variabel yang disebut "noFocus" dan mengaturnya menjadi true. Lalu saya menambahkan acara fokus ke semua input yang membuat noFocus salah. Lalu saya menambahkan acara blur ke semua input yang mengatur noFocus kembali ke true.
Saya memiliki kelas MooTools yang menangani ini dengan cukup mudah, saya yakin Anda dapat membuat plugin jquery untuk melakukan hal yang sama.
Setelah itu dibuat, Anda bisa melakukan pengecekan noFocus sebelum melakukan pertukaran perbatasan apa pun.
sumber
Tidak ada: fokus, tetapi ada: dipilih http://docs.jquery.com/Selectors/selected
tetapi jika Anda ingin mengubah penampilan berdasarkan pada apa yang dipilih, Anda mungkin harus bekerja dengan acara blur.
http://docs.jquery.com/Events/blur
sumber
Ada plugin untuk memeriksa apakah suatu elemen terfokus: http://plugins.jquery.com/project/focused
sumber
Saya memiliki acara .live ("fokus") yang diatur untuk memilih () (sorot) isi input teks sehingga pengguna tidak harus memilihnya sebelum mengetik nilai baru.
$ (formObj) .select ();
Karena quirks antara browser yang berbeda, pilih kadang-kadang akan digantikan oleh klik yang menyebabkannya, dan itu akan membatalkan pilihan konten setelah mendukung menempatkan kursor di dalam bidang teks (sebagian besar berfungsi baik di FF tetapi gagal di IE)
Saya pikir saya bisa menyelesaikan ini dengan sedikit menunda pada pilihan ...
setTimeout (function () {$ (formObj) .select ();}, 200);
Ini berfungsi dengan baik dan pilih akan tetap ada, tetapi masalah lucu muncul .. Jika Anda menabrak dari satu bidang ke yang berikutnya, fokus akan beralih ke bidang berikutnya sebelum pemilihan berlangsung. Karena pilih mencuri fokus, fokus kemudian akan kembali dan memicu acara "fokus" baru. Ini berakhir di kaskade input memilih menari di seluruh layar.
Solusi yang bisa diterapkan adalah memeriksa bahwa bidang masih memiliki fokus sebelum mengeksekusi pilih (), tetapi seperti yang disebutkan, tidak ada cara sederhana untuk memeriksa ... Saya akhirnya hanya membuang seluruh sorotan otomatis, daripada membalik apa yang seharusnya pilih jQuery tunggal () panggilan ke fungsi besar yang sarat dengan subrutin ...
sumber
Apa yang akhirnya saya lakukan adalah menciptakan kelas arbitrer yang disebut .elementhasfocus yang ditambahkan dan dihapus dalam fungsi jQuery focus (). Ketika fungsi hover () berjalan saat mouse keluar, ia memeriksa .elementhasfocus:
Jadi jika tidak memiliki kelas itu (baca: tidak ada elemen dalam div yang memiliki fokus) perbatasan dihapus. Kalau tidak, tidak ada yang terjadi.
sumber
Sederhana
sumber