Bagaimana saya bisa mensimulasikan klik jangkar melalui jquery?

144

Saya memiliki masalah dengan memalsukan klik jangkar melalui jQuery: Mengapa kotak tebal saya muncul pertama kali saya mengklik tombol input, tetapi bukan yang kedua atau ketiga kalinya?

Ini kode saya:

<input onclick="$('#thickboxId').click();" type="button" value="Click me" />

<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

Itu selalu berfungsi ketika saya mengklik langsung pada tautan, tetapi tidak jika saya mencoba mengaktifkan kotak tebal melalui tombol input. Ini dalam FF. Untuk Chrome sepertinya berfungsi setiap saat. Ada petunjuk?

prinzdezibel
sumber
1
Anda meninggalkan kode di sini. Tidak ada kode yang terkait dengan acara klik untuk jangkar yang telah Anda perlihatkan kepada kami. Apa yang dilakukan kode itu? Apakah ada kode lain yang terlibat?
Matt
1
@Matt Jika Anda menggunakan metode klik tanpa parameter, itu tidak lagi diartikan sebagai peristiwa yang mengikat, itu sebenarnya akan KLIK (seolah-olah Anda mengklik dengan mouse Anda) elemen yang dirantai. Dalam hal ini, ketika elemen input diklik, elemen dengan ID 'thickboxId' juga harus diklik.
KyleFarris
3
@KyleFarris: Acara klik () tidak berfungsi di Chrome atau Safari kecuali elemen yang akan diklik memiliki acara onclick yang melekat padanya, dan masih hanya akan memicu bagian itu dan tidak menavigasi ke nilai href. Dalam kasus di atas ia ingin menavigasi ke properti href tag A, seolah-olah pengguna mengklik tautan.
Masuk akal

Jawaban:

123

Cobalah untuk menghindari inline panggilan jQuery Anda seperti itu. Letakkan tag skrip di bagian atas halaman untuk mengikat clickacara:

<script type="text/javascript">
$(function(){
    $('#thickboxButton').click(function(){
        $('#thickboxId').click();
    });
});
</script>

<input id="thickboxButton" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

Edit:

Jika Anda mencoba mensimulasikan pengguna mengklik tautan secara fisik, maka saya tidak percaya itu mungkin. Solusinya adalah memperbarui acara tombol clickuntuk mengubah window.locationdalam Javascript:

<script type="text/javascript">
$(function(){
    $('#thickboxButton').click(function(){
        window.location = $('#thickboxId').attr('href');
    });
});
</script>

Edit 2:

Sekarang saya menyadari bahwa Thickbox adalah widget UI jQuery khusus, saya menemukan petunjuk di sini :

Instruksi:

  • Buat elemen tautan ( <a href>)

  • Berikan tautan atribut kelas dengan nilai thickbox ( class="thickbox")

  • Dalam hrefatribut tautan tambahkan jangkar berikut:#TB_inline

  • Dalam hrefatribut setelah #TB_inlinemenambahkan string kueri berikut ke jangkar:

    ? height = 300 & width = 300 & inlineId = myOnPageContent

  • Ubah nilai tinggi, lebar, dan inlineId sesuai permintaan (inlineID adalah nilai ID elemen yang berisi konten yang ingin Anda tampilkan di ThickBox.

  • Secara opsional Anda dapat menambahkan modal = true ke string kueri (mis #TB_inline?height=155&width=300&inlineId=hiddenModalContent&modal=true) sehingga menutup ThickBox akan membutuhkan pemanggilan tb_remove()fungsi dari dalam ThickBox. Lihat contoh konten modal tersembunyi, di mana Anda harus mengklik ya atau tidak untuk menutup ThickBox.

John Rasch
sumber
window.lokasi di penangan klik tidak berfungsi, karena kotak itu tidak berfungsi seperti yang diharapkan.
prinzdezibel
Pada contoh kedua mungkin disarankan untuk menggunakan .prop()alih-alih attr()mendapatkan url yang diselesaikan.
Kevin Bowersox
Saya terkejut ini adalah jawaban yang diterima. Pemicu klik hanya akan berfungsi pada elemen DOM asli, bukan pada elemen pembungkus jQuery. Ini dibahas oleh @Stevanicus dan komentar, dan pada beberapa posting SO lainnya. Jawabannya harus diubah dengan yang dari Stevanicus.
Oliver
@ Skollii - silakan mengeditnya sesuai keinginan Anda.
John Rasch
3
Maksud saya jawaban yang diterima seharusnya dari @stevanicus
Oliver
194

Apa yang berhasil untuk saya adalah:

$('a.mylink')[0].click()
Stevanicus
sumber
1
. menyumbangkan bahwa bagian selanjutnya adalah nama kelas. # akan untuk id.
Stevanicus
3
Jika diperlukan untuk input, maka gunakan focussebagai ganti click:)
Andrius Naruševičius
Ini juga bekerja untuk saya, tetapi mengapa ini berhasil? Mengapa $ ('a.mylink') [0] .click () berfungsi tetapi $ ('a.mylink'). Eq (0) .click () tidak?
ChrisC
4
[0]menunjukkan elemen pertama dari array - pemilih mengembalikan 0 atau lebih elemen saat dijalankan. Sangat disayangkan bahwa .click()tampaknya tidak bekerja secara langsung di sini karena tampaknya doa lain diterapkan pada koleksi elemen dari penyeleksi secara konsisten di seluruh kerangka kerja.
cfeduke
8
Menggunakan [0]atau .get(0)sama. Ini menggunakan versi DOM elemen, bukan versi jQuery. The .click()fungsi dalam hal ini bukan acara jQuery klik, tapi yang asli.
Radley Sustaire
19

Baru-baru ini saya menemukan cara memicu acara klik mouse melalui jQuery.

    <script type="text/javascript">
    var a = $('.path > .to > .element > a')[0];
    var e = document.createEvent('MouseEvents');
    e.initEvent( 'click', true, true );
    a.dispatchEvent(e);
    </script>
Jure
sumber
1
Saya tidak berpikir ini bekerja di IE, setidaknya tidak 7 atau 8, karena tampaknya tidak ada metode createEvent pada dokumen.
Jeremy
Seperti kata eagle, ini berfungsi di browser webkit. Tetapi perhatikan bahwa Anda tidak benar-benar menggunakan jQuery di sini (selain dari $ selection)
tokland
1
ini hilang setengah dari keajaiban: stackoverflow.com/questions/1421584/…
daniloquio
9

pendekatan ini bekerja pada firefox, chrome dan IE. semoga membantu seseorang:

var comp = document.getElementById('yourCompId');
try { //in firefox
    comp.click();
    return;
} catch(ex) {}
try { // in chrome
    if(document.createEvent) {
        var e = document.createEvent('MouseEvents');
        e.initEvent( 'click', true, true );
        comp.dispatchEvent(e);
        return;
    }
} catch(ex) {}
try { // in IE
    if(document.createEventObject) {
         var evObj = document.createEventObject();
         comp.fireEvent("onclick", evObj);
         return;
    }
} catch(ex) {}
Damian
sumber
Pilihan ini sangat membantu dan lebih baik karena kompatibilitas silang menurut saya. Saya tidak suka harus membungkus semuanya dalam blok coba / tangkap tetapi saya mengerti ini dilakukan untuk membuat upaya untuk setiap browser.
h0r53
8

Meskipun ini adalah pertanyaan yang sangat lama saya menemukan sesuatu yang lebih mudah untuk menangani tugas ini. Ini adalah plugin jquery yang dikembangkan oleh tim UI jquery yang disebut simulasi. Anda dapat memasukkannya setelah jquery dan kemudian Anda dapat melakukan sesuatu seperti

<a href="http://stackoverflow.com/"></a>
$('a').simulate('click');

berfungsi dengan baik di chrome, firefox, opera, dan IE10. Anda dapat mengunduhnya dari https://github.com/eduardolundgren/jquery-simulate/blob/master/jquery.simulate.js

Ruwanka Madhushan
sumber
Fitur utama simulate()adalah bahwa ia mengirimkan acara jQuery serta memicu tindakan browser asli. Ini sekarang jawaban yang benar +1
Gone Coding
Bekerja seperti jimat dan memungkinkan saya membuka halaman di tab baru ketika pengguna mengklik tombol di kotak kendo saya.
John Sully
6

Judul pertanyaan mengatakan "Bagaimana saya bisa mensimulasikan klik jangkar di jQuery?". Nah, Anda dapat menggunakan metode "trigger" atau "triggerHandler", seperti:

<script type="text/javascript" src="path/to/jquery.js"></script>
<script type="text/javascript" src="path/to/thickbox.js"></script>
<script type="text/javascript">
$(function() {
    $('#btn').click(function() {
        $('#thickboxId').triggerHandler('click');
    })
})
</script>
...
<input id="btn" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

Tidak diuji, skrip yang sebenarnya ini, tetapi saya telah menggunakan triggeret al sebelumnya, dan mereka bekerja dengan baik.

UPDATE
triggerHandler tidak benar-benar melakukan apa yang diinginkan OP. Saya pikir 1421968 memberikan jawaban terbaik untuk pertanyaan ini.

elo80ka
sumber
5

Saya sarankan untuk melihat Selenium API untuk melihat bagaimana mereka memicu klik pada elemen dengan cara yang kompatibel dengan browser:

Cari BrowserBot.prototype.triggerMouseEventfungsinya.

Sébastien RoccaSerra
sumber
4

Saya yakin Anda bisa menggunakan:

$('#yourLink').bind('click', function() {
  //Do something over here
});

$('#yourLink').trigger('click');

Ini akan dengan mudah memicu fungsi klik, tanpa benar-benar mengkliknya.

Deepak
sumber
2

Apakah Anda perlu memalsukan klik jangkar? Dari situs kotak tebal:

ThickBox dapat dipanggil dari elemen tautan, elemen input (biasanya tombol), dan elemen area (peta gambar).

Jika itu dapat diterima, semudah menempatkan kelas kotak tebal pada input itu sendiri:

<input id="thickboxButton" type="button" class="thickbox" value="Click me">

Jika tidak, saya akan merekomendasikan menggunakan Firebug dan menempatkan breakpoint dalam metode onclick elemen anchor untuk melihat apakah itu hanya dipicu pada klik pertama.

Edit:

Oke, saya harus mencobanya sendiri dan bagi saya persis kode Anda berfungsi di Chrome dan Firefox:

<html>
<head>
<link rel="stylesheet" href="thickbox.css" type="text/css" media="screen" />
</head>
<body>
<script src="jquery-latest.pack.js" type="text/javascript"></script>
<script src="thickbox.js" type="text/javascript"></script>
<input onclick="$('#thickboxId').click();" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>
</body>
</html>

Jendela muncul tidak masalah jika saya mengklik input atau elemen jangkar. Jika kode di atas bekerja untuk Anda, saya sarankan kesalahan Anda terletak di tempat lain dan Anda mencoba untuk mengisolasi masalahnya.

Kemungkinan lain adalah bahwa kita menggunakan versi jquery / thickbox yang berbeda. Saya menggunakan apa yang saya dapatkan dari halaman kotak tebal - jquery 1.3.2 dan kotak tebal 3.1.

waxwing
sumber
Ya, saya perlu memalsukannya dan ya handler klik itu berfungsi. Tetapi pada kenyataannya, saya tidak mengatur acara onclick sama sekali dan itu berhasil, tetapi hanya pertama kalinya. Tetapi juga dengan onclick yang ditangani di thickboxId tidak akan berfungsi.
prinzdezibel
Yang saya maksudkan adalah memverifikasi bahwa klik di elemen jangkar dipicu setiap kali Anda mengklik elemen input. Oh, dan lihat edit saya di atas.
waxwing
2

Anda dapat membuat formulir melalui jQuery atau dalam kode halaman HTML dengan tindakan yang meniru tautan Anda href:

<a id="anchor_link" href="somepath.php">click here</a>.

var link = $('#anchor_link').attr('href');
$('body').append('<form id="new_form" action="'+link+'"></form>');
$('#new_form').submit();
Rus Miller
sumber
Metode ini menyebabkan seluruh halaman dimuat ulang daripada hanya melompat ke jangkar. Selain itu, ia juga menambahkan "?" ke url sehingga halaman tersebut menjadi example.com?#test alih-alih contoh example.com # . Diuji pada Chrome dan Safari.
Masuk akal
Dalam FF ini akan bekerja dengan baik. Di browser Webkit Anda akan mendapatkan url seperti yang dijelaskan Senseful. Tapi ini bukan masalah, bukan?
sdepold
2

Untuk mensimulasikan klik pada jangkar saat mendarat di sebuah halaman, saya hanya menggunakan jQuery untuk menghidupkan properti scrollTop di $(document).ready.Tidak perlu pemicu yang kompleks, dan itu berfungsi pada IE 6 dan setiap browser lainnya.

Julien
sumber
2

Jika Anda tidak perlu menggunakan JQuery, seperti saya tidak. Saya punya masalah dengan fungsi lintas browser .click(). Jadi saya menggunakan:

eval(document.getElementById('someid').href)
Craig
sumber
Cepat dan kotor, tetapi berhasil untuk saya. Di jQuery ini eval ($ ("# someid"). Attr ("href"));
mhenry1384
2

Di Javascript Anda bisa melakukan ini

function submitRequest(buttonId) {
    if (document.getElementById(buttonId) == null
            || document.getElementById(buttonId) == undefined) {
        return;
    }
    if (document.getElementById(buttonId).dispatchEvent) {
        var e = document.createEvent("MouseEvents");
        e.initEvent("click", true, true);
        document.getElementById(buttonId).dispatchEvent(e);
    } else {
        document.getElementById(buttonId).click();
    }
}

dan Anda bisa menggunakannya seperti

submitRequest("target-element-id");
Yashpal Singla
sumber
1

Menggunakan skrip Jure saya membuat ini, untuk dengan mudah "klik" elemen sebanyak yang Anda inginkan.
Saya baru saja menggunakannya Pustaka Google pada 1600+ item dan berfungsi dengan baik (di Firefox)!

var e = document.createEvent('MouseEvents');
e.initEvent( 'click', true, true );
$(selector).each(function(){this.dispatchEvent(e);});
fregante
sumber
Saya tidak berpikir ini bekerja di IE, setidaknya tidak 7 atau 8, karena tampaknya tidak ada metode createEvent pada dokumen.
Jeremy
Saya percaya bahwa document.createEventObject () harus digunakan di IE, tetapi saya belum mencobanya.
fregante
@ bfred.it: Sepertinya createEventObjectdi IE lebih untuk membuat objek acara untuk diteruskan ke penangan, daripada mengirim acara sintetis. IE fireEventmungkin lebih dekat dispatchEvent, tetapi hanya akan memicu pendengar - bukan tindakan browser default. Namun, di IE Anda bisa memanggil clickmetode.
theazureshadow
1

JQuery('#left').triggerHandler('click');berfungsi dengan baik di Firefox dan IE7. Saya belum mengujinya di browser lain.

Jika ingin memicu klik pengguna otomatis lakukan hal berikut:

window.setInterval(function() 
    {
        $('#left').triggerHandler('click');
    }, 1000);
Singh
sumber
1

Ini tidak berfungsi pada browser asli android untuk mengklik "elemen input (file) tersembunyi":

$('a#swaswararedirectlink')[0].click();

Tapi ini berhasil:

$("#input-file").show();
$("#input-file")[0].click();
$("#input-file").hide();
kuda
sumber
0

Dalam mencoba mensimulasikan 'klik' dalam unit test dengan pemintal jQuery UI, saya tidak bisa mendapatkan jawaban sebelumnya untuk bekerja. Secara khusus, saya mencoba mensimulasikan 'putaran' memilih panah bawah. Saya melihat tes unit pemintal jQuery UI dan mereka menggunakan metode berikut, yang bekerja untuk saya:

element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup();
wbdarby
sumber