Saya telah menyiapkan dialog modal UI jQuery untuk ditampilkan ketika pengguna mengklik tautan. Ada dua kotak teks (saya hanya menunjukkan kode untuk 1 untuk singkatnya) dalam tag div dialog itu dan diubah menjadi kotak teks DatePicker jQuery UI yang bereaksi pada fokus.
Masalahnya adalah dialog UI jQuery ('terbuka') entah bagaimana memicu kotak teks pertama untuk memiliki fokus, yang kemudian memicu kalender datepicker untuk segera dibuka.
Jadi saya mencari cara untuk mencegah fokus terjadi secara otomatis.
<div><a id="lnkAddReservation" href="#">Add reservation</a></div>
<div id="divNewReservation" style="display:none" title="Add reservation">
<table>
<tr>
<th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
<td>
<asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
</td>
</tr>
</table>
<div>
<asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var dlg = $('#divNewReservation');
$('.datepicker').datepicker({ duration: '' });
dlg.dialog({ autoOpen:false, modal: true, width:400 });
$('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
dlg.parent().appendTo(jQuery("form:first"));
});
</script>
javascript
jquery
jquery-ui
Slolife
sumber
sumber
Jawaban:
jQuery UI 1.10.0 Changelog mendaftar tiket 4731 sebagai diperbaiki.
Sepertinya fokusSelektor tidak diimplementasikan, tetapi pencarian cascading untuk berbagai elemen digunakan sebagai gantinya. Dari tiket:
Jadi, tandai elemen dengan
autofocus
atribut dan itu adalah elemen yang harus mendapatkan fokus:Dalam dokumentasi , logika fokus dijelaskan (tepat di bawah daftar isi, dengan judul 'Fokus'):
sumber
Tambahkan rentang tersembunyi di atasnya, gunakan ui-helper-hidden-dapat diakses untuk membuatnya tersembunyi oleh penentuan posisi absolut. Saya tahu Anda memiliki kelas itu karena Anda menggunakan dialog dari jquery-ui dan itu di jquery-ui.
sumber
Di jQuery UI> = 1.10.2, Anda dapat mengganti
_focusTabbable
metode prototipe dengan fungsi plasebo:Biola
Ini akan mempengaruhi semua
dialog
yang ada di halaman tanpa harus mengedit masing-masing secara manual.Fungsi asli tidak melakukan apa pun selain mengatur fokus ke elemen pertama dengan
autofocus
atribut /tabbable
elemen / atau kembali ke dialog itu sendiri. Karena penggunaannya hanya mengatur fokus pada suatu elemen, seharusnya tidak ada masalah menggantinya dengan anoop
.sumber
$.noop
, ganti dengan fungsi yang mencatat dialog aktif, lalu daftarkan event handler kunci global yang memotongESC
dan menutup dialog 'aktif' jika ada.Mulai dari jQuery UI 1.10.0, Anda dapat memilih elemen input mana yang menjadi fokus dengan menggunakan autofocus atribut HTML5 .
Yang harus Anda lakukan adalah membuat elemen dummy sebagai input pertama Anda di kotak dialog. Ini akan menyerap fokus untuk Anda.
Ini telah diuji di Chrome, Firefox dan Internet Explorer (semua versi terbaru) pada 7 Februari 2013.
sumber
Saya menemukan kode berikut fungsi dialog jQuery UI untuk terbuka.
Anda bisa mengatasi perilaku jQuery atau mengubah perilaku.
tabindex -1 berfungsi sebagai solusi.
sumber
focusSelector
opsi) seharusnya berada di jQueryUI 1.8, dan kami sekarang di 1.8.13 dan saya tidak melihatnya di dokumen dialog jQueryUI docs . Apa yang terjadi dengan ini?Baru tahu ini sambil bermain-main.
Saya menemukan dengan solusi ini untuk menghapus fokus, menyebabkan ESCkunci berhenti bekerja (yaitu menutup dialog) ketika pertama kali masuk ke Dialog.
Jika dialog terbuka dan Anda segera menekan ESC, itu tidak akan menutup dialog (jika Anda telah mengaktifkannya), karena fokusnya adalah pada beberapa bidang tersembunyi atau sesuatu, dan itu tidak mendapatkan peristiwa penekanan tombol.
Cara saya memperbaikinya adalah menambahkan ini ke acara terbuka untuk menghapus fokus dari bidang pertama sebagai gantinya:
Ini menetapkan fokus ke kotak dialog, yang tidak terlihat, dan kemudian ESCkuncinya bekerja.
sumber
Atur tabindex dari input menjadi -1, dan kemudian atur dialog.open untuk mengembalikan tabindex jika Anda membutuhkannya nanti:
sumber
Solusi saya:
sumber
:first
pemilih atau.first()
di FF / Chrome / IE9. Melemparnya ke dalamdialogopen
karya yang mengikat juga.open: function(){ $('a').blur(); // no autofocus on links }
Saya punya konten yang lebih panjang dari dialog. Saat terbuka, dialog akan berubah menjadi yang pertama: tabbable yang berada di bagian bawah. Inilah perbaikan saya.
sumber
$('...').blur();
daripada menggulir.Solusi sederhana:
Cukup buat elemen tak terlihat dengan tabindex = 1 ... Ini tidak akan memfokuskan datepicker ...
misalnya.:
sumber
Inilah solusi yang saya terapkan setelah membaca tiket jQuery UI # 4731 , awalnya diposting oleh slolife sebagai jawaban atas jawaban lain (Tiket itu juga dibuat olehnya.)
Pertama, dalam metode apa pun yang Anda gunakan untuk menerapkan pelengkapan otomatis ke halaman, tambahkan baris kode berikut:
Itu menonaktifkan perilaku "fokus otomatis" jQuery. Untuk memastikan bahwa situs Anda terus dapat diakses secara luas, bungkus metode pembuatan dialog Anda sehingga kode tambahan dapat ditambahkan, dan tambahkan panggilan untuk memfokuskan elemen input pertama:
Untuk lebih lanjut mengatasi aksesibilitas ketika opsi pelengkapan otomatis dipilih melalui keyboard, kami menimpa panggilan balik "pilih" otomatis jQuery UI dan menambahkan beberapa kode tambahan untuk memastikan textElement tidak kehilangan fokus di IE 8 setelah membuat pilihan.
Berikut adalah kode yang kami gunakan untuk menerapkan pelengkapan otomatis ke elemen:
sumber
Anda dapat menyediakan opsi ini, untuk memfokuskan tombol tutup saja.
sumber
Ini bisa menjadi perilaku browser bukan masalah plugin jQuery. Sudahkah Anda mencoba menghapus fokus secara terprogram setelah Anda membuka sembulan.
Belum diuji tetapi harus bekerja ok.
sumber
Saya memiliki masalah yang sama dan menyelesaikannya dengan memasukkan input kosong sebelum datepicker, yang mencuri fokus setiap kali dialog dibuka. Input ini disembunyikan pada setiap pembukaan dialog dan ditampilkan lagi pada penutupan.
sumber
Yah, itu keren bahwa tidak ada yang menemukan solusi untuk saat ini, tetapi sepertinya saya punya sesuatu untuk Anda. Kabar buruknya adalah dialog ini tetap fokus dalam hal apa pun meskipun tidak ada input dan tautan di dalamnya. Saya menggunakan dialog sebagai tooltip dan pasti perlu fokus tetap pada elemen asli. Ini solusinya:
gunakan opsi [buka otomatis: salah]
Sementara dialog tidak terlihat, fokus tidak diatur di mana pun dan tetap di tempat asli. Ini berfungsi untuk tooltips hanya dengan teks biasa, tetapi tidak diuji untuk dialog yang lebih fungsional di mana mungkin penting untuk memiliki dialog yang terlihat pada saat pembukaan. Mungkin akan bekerja dengan baik dalam hal apa pun.
Saya mengerti bahwa posting asli hanya untuk menghindari fokus pada elemen pertama, tetapi Anda dapat dengan mudah memutuskan di mana fokus seharusnya setelah dialog dibuka (setelah kode saya).
Diuji dalam IE, FF dan Chrome.
Semoga ini bisa membantu seseorang.
sumber
Menurut saya solusi ini sangat bagus:
Ditemukan di sini: tidak dapat menghapus autofocus-in-ui-dialog
sumber
Saya punya masalah serupa. Saya membuka dialog kesalahan ketika validasi gagal dan itu mengambil fokus, seperti yang ditunjukkan Flugan dalam jawabannya . Masalahnya adalah bahwa bahkan jika tidak ada elemen di dalam dialog itu tabbable, dialog itu sendiri masih fokus. Berikut adalah kode asli yang tidak diubah dari jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:
Komentar adalah milik mereka!
Ini sangat buruk bagi saya karena beberapa alasan. Yang paling menyebalkan adalah reaksi pertama pengguna adalah menekan backspace untuk menghapus karakter terakhir, tetapi sebaliknya ia diminta untuk meninggalkan halaman, karena backspace dipukul di luar kontrol input.
Saya menemukan bahwa solusi berikut ini bekerja cukup baik untuk saya:
sumber
Saya mencari-cari masalah yang berbeda tetapi penyebab yang sama. Masalahnya adalah bahwa dialog mengatur fokus ke yang pertama kali
<a href="">.</a>
ditemukan. Jadi, jika Anda memiliki banyak teks dalam dialog Anda dan bilah gulir muncul Anda bisa memiliki situasi di mana bilah gulir akan digulir ke bawah. Saya percaya ini juga memperbaiki pertanyaan orang pertama. Meskipun yang lain juga melakukannya.Sederhana mudah dimengerti.
<a id="someid" href="#">.</a>
sebagai baris pertama di div dialog Anda.CONTOH:
Di mana dialog Anda dimulai
Di atas tidak akan fokus dan bilah gulir akan tetap di bagian atas tempatnya. The
<a>
mendapat fokus tapi kemudian disembunyikan. Jadi efek keseluruhan adalah efek yang diinginkan.Saya tahu ini adalah utas lama tetapi untuk sebagai UI UI tidak ada perbaikan untuk ini. Ini tidak membutuhkan blur atau fokus untuk bekerja. Tidak yakin apakah itu yang paling elegan. Tapi itu masuk akal dan mudah dijelaskan kepada siapa pun.
sumber
Jika Anda hanya memiliki satu bidang dalam bentuk dialog Jquery dan itu adalah bidang yang membutuhkan Datepicker, atau Anda dapat mengatur fokus pada tombol Tutup (silang) di bilah judul dialog:
Sebut dialog SETELAH ini diinisialisasi, misalnya:
Karena tombol tutup diberikan setelah
.dialog()
dipanggil.sumber
Jika Anda menggunakan tombol dialog, cukup atur
autofocus
atribut di salah satu tombol:sumber
Saya mendapat masalah yang sama.
Solusi yang saya lakukan adalah menambahkan kotak teks dummy di bagian atas wadah dialog.
sumber
Seperti disebutkan, ini adalah bug yang dikenal dengan jQuery UI dan harus segera diperbaiki. Sampai saat itu ...
Ini opsi lain, jadi Anda tidak perlu mengacaukan tabindex:
Nonaktifkan datepicker sementara hingga kotak dialog terbuka:
Bekerja untukku.
Duplikat pertanyaan: Bagaimana mengaburkan input formulir pertama pada pembukaan dialog
sumber
Untuk memperluas beberapa jawaban sebelumnya (dan mengabaikan aspek pendukung data tambahan), jika Anda ingin mencegah
focus()
acara memfokuskan bidang input pertama saat dialog Anda terbuka, coba ini:sumber
Saya memiliki masalah yang sama dan menyelesaikannya dengan berfokus pada dialog setelah dibuka:
Tetapi dalam kasus saya elemen pertama adalah jangkar, jadi saya tidak tahu apakah dalam kasus Anda itu akan membiarkan datepicker terbuka.
EDIT: hanya berfungsi di IE
sumber
temukan di jquery.ui.js
dan ganti dengan
sumber
jQuery 1.9 dirilis dan tampaknya tidak ada perbaikan. Mencoba mencegah fokus kotak teks pertama oleh beberapa metode yang disarankan tidak berfungsi di 1.9. Saya pikir karena metode yang mencoba mengaburkan fokus atau memindahkan fokus terjadi SETELAH kotak teks dalam dialog sudah mendapatkan fokus dan melakukan pekerjaan kotornya.
Saya tidak dapat melihat apa pun di dokumentasi API yang membuat saya berpikir bahwa ada sesuatu yang berubah dalam hal fungsi yang diharapkan. Mati untuk menambahkan tombol pembuka ...
sumber
Saya punya masalah serupa. Di halaman saya, input pertama adalah kotak teks dengan kalender jQuery UI. Elemen kedua adalah tombol. Karena tanggal sudah memiliki nilai, saya menetapkan tombol fokus, tetapi pertama-tama tambahkan pemicu untuk blur pada kotak teks. Ini mengatasi masalah di semua browser dan mungkin di semua versi jQuery. Diuji dalam versi 1.8.2.
sumber
Ini sangat penting untuk smartphone dan tablet karena keyboard muncul ketika input memiliki fokus. Inilah yang telah saya lakukan, tambahkan input ini di awal div:
Tidak berfungsi dengan ukuran
0px
. Saya kira itu lebih baik dengan gambar transparan nyata, baik.png
atau.gif
saya belum mencoba.Sejauh ini berfungsi dengan baik di iPad.
sumber
Anda dapat menambahkan ini:
...
...
sumber
sebagai input pertama:
<input type="text" style="position:absolute;top:-200px" />
sumber