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?


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.


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()

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>

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) {}

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


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.



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.


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.


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();

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.


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)

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");

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);});

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);

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();

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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.