Saya memiliki timer di JavaScript saya yang perlu meniru mengklik tautan untuk pergi ke halaman lain begitu waktu berlalu. Untuk melakukan ini saya menggunakan click()
fungsi jQuery . Saya telah menggunakan $().trigger()
dan window.location
juga, dan saya bisa membuatnya berfungsi sebagaimana dimaksud dengan ketiganya.
Saya telah mengamati beberapa perilaku aneh click()
dan saya mencoba memahami apa yang terjadi dan mengapa.
Saya menggunakan Firefox untuk semua yang saya jelaskan dalam pertanyaan ini, tetapi saya juga tertarik pada apa yang akan dilakukan browser lain dengan ini.
Jika saya belum pernah menggunakan $('a').bind('click',fn)
atau $('a').click(fn)
mengatur pengendali acara, maka menelepon $('a').click()
sepertinya tidak melakukan apa-apa sama sekali. Itu tidak memanggil penangan default browser untuk acara ini, karena browser tidak memuat halaman baru.
Namun, jika saya menetapkan event handler terlebih dahulu, maka itu berfungsi seperti yang diharapkan, bahkan jika event handler tidak melakukan apa-apa.
$('a').click(function(){return true;}).click();
Ini memuat halaman baru seolah-olah saya telah mengklik a sendiri.
Jadi pertanyaan saya ada dua: Apakah ini perilaku aneh karena saya melakukan sesuatu yang salah di suatu tempat? dan mengapa menelepon tidak click()
melakukan apa-apa dengan perilaku default jika saya belum membuat handler sendiri?
EDIT:
Seperti yang ditentukan Hoffman ketika dia mencoba menduplikasi hasil saya, hasil yang saya jelaskan di atas tidak benar-benar terjadi. Saya tidak yakin apa yang menyebabkan peristiwa yang saya amati kemarin, tetapi saya yakin hari ini bukan itu yang saya jelaskan dalam pertanyaan.
Jadi jawabannya adalah Anda tidak bisa "memalsukan" klik di peramban dan yang dilakukan semua jQuery adalah memanggil pengendali acara Anda. Anda masih dapat menggunakan window.location
untuk mengubah halaman, dan itu berfungsi dengan baik untuk saya.
Jawaban:
Menarik, ini mungkin "permintaan fitur" (yaitu bug) untuk jQuery. Acara klik jQuery hanya memicu tindakan klik (disebut peristiwa onClick pada DOM) pada elemen jika Anda mengikat acara jQuery ke elemen. Anda harus pergi ke milis jQuery ( http://forum.jquery.com/ ) dan melaporkan ini. Ini mungkin perilaku yang diinginkan, tapi saya rasa tidak.
EDIT:
Saya melakukan beberapa pengujian dan apa yang Anda katakan salah, bahkan jika Anda mengikat fungsi ke tag 'a' itu masih tidak membawa Anda ke situs web yang ditentukan oleh atribut href. Coba kode berikut:
Tidak pernah masuk ke google.com kecuali Anda mengklik langsung tautannya (dengan atau tanpa kode yang dikomentari). Perhatikan juga bahwa bahkan jika Anda mengikat acara klik ke tautan itu tetap tidak menjadi ungu setelah Anda mengklik tombol. Hanya ungu jika Anda mengklik tautan secara langsung.
Saya melakukan penelitian dan tampaknya .click tidak seharusnya bekerja dengan tag 'a' karena browser tidak mendukung "mengklik palsu" dengan javascript. Maksud saya, Anda tidak bisa "mengklik" elemen dengan javascript. Dengan tag 'a' Anda dapat memicu event onClick-nya tetapi tautannya tidak akan berubah warna (ke warna tautan yang dikunjungi, defaultnya adalah ungu di sebagian besar browser). Jadi tidak masuk akal untuk membuat $ () .klik acara bekerja dengan tag 'a' karena tindakan pergi ke atribut href bukan bagian dari acara onClick, tetapi hardcoded di browser.
sumber
Pilihan lain tentu saja hanya menggunakan vanilla javascript:
sumber
Jika Anda melihat kode untuk
$.click
fungsi saya akan bertaruh ada pernyataan kondisional yang memeriksa untuk melihat apakah elemen memiliki pendengar terdaftar untukclick
acara tersebut sebelum mulai. Mengapa tidak mendapatkanhref
atribut dari tautan dan secara manual mengubah lokasi halaman?EDIT: Inilah mengapa ia tidak mengklik, dari
trigger
fungsi, sumber jQuery untuk versi 1.3.2:Setelah itu memanggil penangan (jika ada) jQuery memicu suatu peristiwa pada objek. Namun itu hanya memanggil penangan asli untuk acara klik jika elemen tersebut bukan tautan. Saya kira ini dilakukan dengan sengaja untuk beberapa alasan. Ini harus benar meskipun apakah event handler didefinisikan atau tidak, jadi saya tidak yakin mengapa dalam kasus Anda melampirkan event handler menyebabkan
onClick
penangan asli dipanggil. Anda harus melakukan apa yang saya lakukan dan melangkah melalui eksekusi untuk melihat di mana ia dipanggil.sumber
Penangan klik pada tag jangkar adalah kasus khusus di jQuery.
Saya pikir Anda mungkin menjadi bingung antara peristiwa onclick jangkar (dikenal oleh browser) dan acara klik objek jQuery yang membungkus gagasan DOM tentang tag jangkar.
Anda dapat mengunduh sumber jQuery 1.3.2 di sini .
Bagian yang relevan dari sumber adalah baris 2643-2645 (Saya telah membagi ini menjadi beberapa baris untuk membuatnya lebih mudah dipahami):
sumber
JS / jQuery tidak mendukung perilaku tautan yang "diklik" secara terprogram.
Yang dapat Anda lakukan adalah membuat formulir dan mengirimkannya. Dengan cara ini Anda tidak perlu menggunakan
window.location
atauwindow.open
, yang sering diblokir sebagai munculan yang tidak diinginkan oleh browser.Skrip ini memiliki 2 metode berbeda: satu yang mencoba membuka 3 tab / jendela baru (hanya membuka 1 di IE dan Chrome, info lebih lanjut di bawah ini) dan satu yang menjalankan acara khusus pada klik tautan.
Begini caranya:
HTML
jQuery (script.js)
Apa yang dilakukannya adalah untuk setiap elemen tautan:
Sekarang Anda memiliki pemuatan tab / jendela baru
"https://google.nl"
(atau URL apa pun yang Anda inginkan, ganti saja). Sayangnya ketika Anda mencoba untuk membuka lebih dari satu jendela dengan cara ini, Anda mendapatkan kotakPopup blocked
pesan ketika mencoba untuk membuka yang kedua (yang pertama masih dibuka).Info lebih lanjut tentang cara saya menggunakan metode ini dapat ditemukan di sini:
Membuka jendela / tab baru tanpa menggunakan
window.open
atauwindow.location.href
sumber
Memicu elemen Hyperlink yang ada di dalam elemen yang ingin Anda kaitkan dengan jquery .klik ()
Dalam skrip Anda, Anda terhubung ke wadah utama Anda ingin acara klik aktif. Kemudian Anda menggunakan metodologi jquery standar untuk menemukan elemen (tipe, kelas, id) dan jalankan klik. Apa yang terjadi adalah jquery memasuki fungsi rekursif untuk menyalakan klik dan Anda merusak fungsi rekursif dengan mengambil fungsi 'e' dan stopPropagation () berfungsi dan mengembalikan false karena Anda tidak ingin jquery melakukan hal lain selain menyalakan tautan.
Solusi alternatif adalah dengan membungkus wadah di dalam elemen dan menempatkannya sebagai wadah di dalamnya. Atur bentang untuk menampilkan blok agar sesuai dengan standar w3c.
sumber
Anda bisa menggunakan jQuery untuk memilih objek jQuery untuk elemen itu. Kemudian, dapatkan elemen DOM yang mendasarinya dan panggil
click()
metodenya.oleh id
atau gunakan jQuery untuk mengklik banyak tautan oleh kelas CSS
sumber
Itu tidak melakukan apa-apa karena tidak ada peristiwa yang terikat pada peristiwa itu. Jika saya ingat dengan benar, jQuery menyimpan daftar event handler yang terikat dengan NodeLists untuk kinerja dan keperluan lainnya.
sumber
Jika Anda memerlukan fitur ini untuk satu kasing atau sangat sedikit kaset. (Anda seluruh aplikasi tidak memerlukan fitur ini) Saya lebih suka meninggalkan jQuery apa adanya (karena berbagai alasan, termasuk dapat memperbarui ke versi yang lebih baru, CDN dll.) dan memiliki solusi berikut:
sumber
Untuk membuka hyperlink di tab yang sama, gunakan:
sumber