ฉันจะจำลองการคลิกสมอผ่าน jquery ได้อย่างไร


144

ฉันมีปัญหากับการแกล้งทำคลิกยึดผ่าน jQuery: เหตุใด Thickbox ของฉันจึงปรากฏขึ้นเป็นครั้งแรกที่ฉันคลิกที่ปุ่มอินพุต แต่ไม่ใช่ครั้งที่สองหรือสาม

นี่คือรหัสของฉัน:

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

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

มันจะทำงานได้ตลอดเวลาเมื่อฉันคลิกที่ลิงค์โดยตรง แต่ไม่ใช่ถ้าฉันพยายามเปิดใช้งาน thickbox ผ่านปุ่มอินพุต นี่คือ FF สำหรับ Chrome ดูเหมือนว่าจะใช้งานได้ทุกครั้ง คำใบ้ใด ๆ


1
คุณกำลังออกรหัสที่นี่ ไม่มีรหัสที่เกี่ยวข้องกับการคลิกสำหรับสมอที่คุณแสดงให้เราเห็น รหัสนั้นทำอะไร? มีรหัสอื่นที่เกี่ยวข้องหรือไม่?
แมตต์

1
@Matt หากคุณใช้วิธีการคลิกโดยไม่มีพารามิเตอร์จะไม่ถูกตีความว่าเป็นการรวมเหตุการณ์อีกต่อไปมันจะคลิกจริง (ราวกับว่าคุณกำลังคลิกด้วยเมาส์ของคุณ) องค์ประกอบที่ถูกล่ามโซ่ไว้ ในกรณีนี้เมื่อคลิกองค์ประกอบอินพุตคลิกองค์ประกอบที่มี ID 'thickboxId' ก็ควรคลิกเช่นกัน
KyleFarris

3
@KyleFarris: เหตุการณ์ click () ไม่ทำงานบน Chrome หรือ Safari เว้นแต่ว่าองค์ประกอบที่จะคลิกนั้นมีเหตุการณ์ onclick ติดอยู่และยังจะทริกเกอร์ส่วนนั้นและไม่นำทางไปยังค่า href ในกรณีข้างต้นเขาต้องการให้นำทางไปยังคุณสมบัติ href ของแท็กราวกับว่าผู้ใช้คลิกที่ลิงก์
เหตุผล

คำตอบ:


123

พยายามหลีกเลี่ยงการทำให้การโทร jQuery ของคุณเป็นแบบนั้น ใส่แท็กสคริปต์ที่ด้านบนของหน้าเพื่อเชื่อมโยงกับclickเหตุการณ์:

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

แก้ไข:

หากคุณพยายามจำลองผู้ใช้คลิกที่ลิงก์จากนั้นฉันไม่เชื่อว่าเป็นไปได้ วิธีแก้ปัญหาคือการอัปเดตclickกิจกรรมของปุ่มเพื่อเปลี่ยนwindow.locationใน Javascript:

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

แก้ไข 2:

ตอนนี้ฉันรู้แล้วว่า Thickbox เป็นวิดเจ็ต jQuery UI ที่กำหนดเองฉันพบคำแนะนำแล้ว ที่นี่ :

คำแนะนำ:

  • สร้างองค์ประกอบลิงค์ (<a href> )

  • ให้ลิงค์แอตทริบิวต์ class ด้วยค่า thickbox (class="thickbox" )

  • ในแอhrefททริบิวต์ของลิงค์ให้เพิ่มสมอต่อไปนี้:#TB_inline

  • ใน hrefแอ็ตทริบิวต์หลังจาก#TB_inlineเพิ่มเคียวรีสตริงต่อไปนี้ลงในจุดยึด:

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

  • เปลี่ยนค่าของความสูงความกว้างและ inlineId ในคิวรีตาม (inlineID คือค่า ID ขององค์ประกอบที่มีเนื้อหาที่คุณต้องการแสดงใน ThickBox

  • คุณสามารถเพิ่ม modal = true ให้กับสตริงข้อความค้นหา (เช่น#TB_inline?height=155&width=300&inlineId=hiddenModalContent&modal=true) เพื่อให้การปิด ThickBox จะต้องเรียกใช้tb_remove()ฟังก์ชันจากภายใน ThickBox ดูตัวอย่างเนื้อหากิริยาที่ซ่อนอยู่ซึ่งคุณต้องคลิกใช่หรือไม่เพื่อปิด ThickBox


window.location ในตัวจัดการการคลิกไม่ทำงานแล้ว thickbox ไม่ทำงานตามที่คาดไว้
prinzdezibel

ในตัวอย่างที่สองอาจแนะนำให้ใช้.prop()แทนattr()รับ URL ที่ได้รับการแก้ไข
Kevin Bowersox

ฉันประหลาดใจที่นี่เป็นคำตอบที่ได้รับการยอมรับ ทริกเกอร์การคลิกจะทำงานกับองค์ประกอบ DOM ดั้งเดิมเท่านั้นไม่ได้อยู่ในองค์ประกอบ wrapper jQuery เรื่องนี้ถูกกล่าวถึงโดย @Stevanicus และความคิดเห็นและอีกหลายโพสต์ดังนั้น คำตอบควรเปลี่ยนเป็นของ Stevanicus
โอลิเวอร์

@Schollii - อย่าลังเลที่จะแก้ไขให้ถูกต้องตามที่คุณต้องการ
John Rasch

3
ฉันหมายความว่าคำตอบที่ได้รับการยอมรับควรเป็นของ @stevanicus
Oliver

194

สิ่งที่ทำงานให้ฉันคือ:

$('a.mylink')[0].click()

1
. บริจาคว่าส่วนถัดไปเป็นชื่อคลาส # จะเป็นรหัส
Stevanicus

3
หากจำเป็นต้องป้อนข้อมูลให้ใช้focusแทนclick:)
Andrius Naruševičius

มันใช้งานได้สำหรับฉันเช่นกัน แต่ทำไมถึงใช้งานได้ ทำไม $ ('a.mylink') [0] .click () ทำงานได้ แต่ $ ('a.mylink') eq (0) .click () ไม่ทำงาน
ChrisC

4
[0]ระบุองค์ประกอบแรกของอาร์เรย์ - ตัวเลือกส่งกลับองค์ประกอบ 0 หรือมากกว่าเมื่อมีการดำเนินการ มันโชคร้ายที่.click()ดูเหมือนว่าจะไม่ทำงานที่นี่โดยตรงเนื่องจากดูเหมือนว่าคำร้องอื่น ๆ จะถูกนำไปใช้กับคอลเลกชันขององค์ประกอบจากตัวเลือกอย่างสม่ำเสมอทั่วทั้งกรอบ
cfeduke

8
การใช้[0]หรือ.get(0)เหมือนกัน สิ่งเหล่านี้ใช้องค์ประกอบ DOM รุ่นแทนรุ่น jQuery .click()ฟังก์ชั่นในกรณีนี้ไม่ได้เป็นเหตุการณ์คลิก jQuery แต่คนพื้นเมือง
Radley Sustaire

19

ฉันเพิ่งค้นพบวิธีการทริกเกอร์เหตุการณ์คลิกเมาส์ผ่าน 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
ฉันไม่คิดว่ามันจะทำงานได้ใน IE อย่างน้อยไม่ใช่ 7 หรือ 8 เพราะดูเหมือนว่าจะไม่มีวิธีการ createEvent ในเอกสาร
Jeremy

ตามที่นกอินทรีบอกว่ามันใช้งานได้ในเบราว์เซอร์ webkit แต่โปรดทราบว่าคุณไม่ได้ใช้ jQuery ที่นี่ (นอกเหนือจากการเลือก $)
tokland

1
นี่คือครึ่งหนึ่งของเวทมนตร์ที่ขาดหายไป: stackoverflow.com/questions/1421584/…
daniloquio

9

วิธีนี้ใช้ได้กับ Firefox, Chrome และ IE หวังว่ามันจะช่วยให้ใครบางคน:

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

มีประโยชน์มากและเป็นตัวเลือกที่ดีกว่าเนื่องจากความเข้ากันได้ในความคิดของฉัน ฉันไม่ชอบที่จะต้องห่อทุกอย่างใน try / catch block แต่ฉันเข้าใจว่ามันทำเพื่อลดความพยายามของเบราว์เซอร์แต่ละตัว
h0r53

8

แม้ว่านี่จะเป็นคำถามที่เก่ามาก แต่ฉันก็พบว่ามีบางสิ่งที่ง่ายต่อการจัดการกับงานนี้ มันเป็นปลั๊กอิน jquery ที่พัฒนาโดยทีมงาน jquery UI ที่เรียกว่าจำลอง คุณสามารถรวมมันหลังจาก jquery แล้วคุณสามารถทำสิ่งที่ชอบ

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

ทำงานได้ดีใน chrome, firefox, opera และ IE10.you คุณสามารถดาวน์โหลดได้จากhttps://github.com/eduardolundgren/jquery-simulate/blob/master/jquery.simulate.js


คุณสมบัติที่สำคัญของsimulate()มันคือมันจะส่งเหตุการณ์ jQuery เช่นเดียวกับการเรียกการกระทำของเบราว์เซอร์พื้นเมือง นี่คือตอนนี้คำตอบที่ถูกต้อง 1
Gone Coding

ทำงานได้อย่างมีเสน่ห์และทำให้ฉันเปิดหน้าเว็บในแท็บใหม่เมื่อผู้ใช้คลิกที่ปุ่มในตารางเคนโด้ของฉัน
John Sully

6

ชื่อคำถามกล่าวว่า "ฉันจะจำลองการคลิกสมอใน jQuery ได้อย่างไร" คุณสามารถใช้วิธีการ "ทริกเกอร์" หรือ "triggerHandler" ได้เช่น:

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

ไม่ได้ทดสอบสคริปต์จริงนี้ แต่ฉันเคยใช้triggeret al มาก่อนและพวกเขาทำงานได้ดี

การอัพเดท
triggerHandlerไม่ได้ทำตามที่ OP ต้องการ ฉันคิดว่า 1421968ให้คำตอบที่ดีที่สุดสำหรับคำถามนี้


5

ฉันขอแนะนำให้ดูที่ Selenium API เพื่อดูว่าพวกเขากระตุ้นการคลิกที่องค์ประกอบในลักษณะที่เข้ากันได้กับเบราว์เซอร์อย่างไร:

มองหาBrowserBot.prototype.triggerMouseEventฟังก์ชั่น


4

ฉันเชื่อว่าคุณสามารถใช้:

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

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

สิ่งนี้จะเรียกใช้ฟังก์ชันการคลิกอย่างง่ายดายโดยไม่ต้องคลิกเลย


2

คุณต้องการที่จะปลอมคลิกยึด? จากไซต์ thickbox:

ThickBox สามารถเรียกใช้จากองค์ประกอบลิงก์องค์ประกอบอินพุต (โดยทั่วไปคือปุ่ม) และองค์ประกอบพื้นที่ (แมปรูปภาพ)

หากเป็นที่ยอมรับก็ควรจะง่ายเหมือนการวางคลาส thickbox บนอินพุตเอง:

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

ถ้าไม่ฉันขอแนะนำให้ใช้ Firebug และวางเบรกพอยต์ในเมธอด onclick ขององค์ประกอบจุดยึดเพื่อดูว่ามันถูกทริกเกอร์เฉพาะในการคลิกครั้งแรก

แก้ไข:

โอเคฉันต้องลองด้วยตัวเองและสำหรับฉันรหัสของคุณใช้ได้ทั้ง Chrome และ 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>

หน้าต่างป๊อปอัปไม่ว่าฉันจะคลิกที่อินพุตหรือองค์ประกอบสมอ หากรหัสด้านบนใช้งานได้สำหรับคุณฉันขอแนะนำให้ข้อผิดพลาดของคุณอยู่ที่อื่นและคุณพยายามแยกปัญหาออก

อาจเป็นไปได้ว่าเรากำลังใช้ jquery / thickbox รุ่นต่างๆ ฉันใช้สิ่งที่ฉันได้รับจากหน้า thickbox - jquery 1.3.2 และ thickbox 3.1


ใช่ฉันต้องทำการปลอมและใช่ตัวจัดการการคลิกเองทำงานได้ แต่ในความเป็นจริงฉันไม่ได้ตั้งเหตุการณ์ onclick เลยและใช้งานได้ แต่เป็นครั้งแรกเท่านั้น แต่ยังมี onclick จัดการใน thickboxId มันจะไม่ทำงาน
prinzdezibel

สิ่งที่ฉันหมายถึงคือการยืนยันว่า onclick ในองค์ประกอบจุดยึดจะถูกเรียกใช้ทุกครั้งที่คุณคลิกองค์ประกอบอินพุต โอ้และดูการแก้ไขของฉันด้านบน
waxwing

2

คุณสามารถสร้างฟอร์มผ่าน jQuery หรือในโค้ดเพจ HTML ด้วยการกระทำที่เลียนแบบลิงก์ของคุณ 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();

วิธีนี้ทำให้หน้าทั้งหมดโหลดซ้ำมากกว่าเพียงแค่กระโดดไปที่จุดยึด นอกจากนี้ยังเพิ่ม "?" ไปยัง URL ดังนั้นหน้าจะกลายเป็นexample.com?#testแทนexample.com # ทดสอบ ทดสอบบน Chrome และ Safari
เหตุผล

ใน FF สิ่งนี้จะทำงานได้ดี ใน Webkit-browser คุณจะได้ URL ตามที่อธิบายไว้ แต่นี่ไม่มีปัญหาใช่มั้ย
sdepold

2

เพื่อจำลองการคลิกที่จุดยึดในขณะที่เชื่อมโยงไปถึงหน้าฉันเพิ่งใช้ jQuery เพื่อทำให้คุณสมบัติ scrollTop เคลื่อนไหวโดย$(document).ready.ไม่จำเป็นต้องใช้ทริกเกอร์ที่ซับซ้อนและทำงานได้บน IE 6 และเบราว์เซอร์อื่น ๆ


2

หากคุณไม่จำเป็นต้องใช้ JQuery เหมือนฉัน ผมเคยมีปัญหากับเบราว์เซอร์ func .click()ข้าม ดังนั้นฉันใช้:

eval(document.getElementById('someid').href)

รวดเร็วและสกปรก แต่ทำงานให้ฉัน ใน jQuery นี่คือ eval ($ ("# someid"). attr ("href"));
mhenry1384

2

ใน Javascript คุณสามารถทำสิ่งนี้ได้

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

และคุณสามารถใช้มันได้

submitRequest("target-element-id");

1

การใช้สคริปต์ของ Jure ฉันทำสิ่งนี้เพื่อ "คลิก" องค์ประกอบได้มากเท่าที่คุณต้องการ
ฉันเพิ่งใช้ Google Reader กับอุปกรณ์มากกว่า 1600 รายการและใช้งานได้สมบูรณ์แบบ (ใน Firefox)!

var e = document.createEvent('MouseEvents');
e.initEvent( 'click', true, true );
$(selector).each(function(){this.dispatchEvent(e);});

ฉันไม่คิดว่ามันจะทำงานได้ใน IE อย่างน้อยไม่ใช่ 7 หรือ 8 เพราะดูเหมือนว่าจะไม่มีวิธีการ createEvent ในเอกสาร
Jeremy

ฉันเชื่อว่าควรใช้ document.createEventObject () ใน IE แทน แต่ฉันยังไม่ได้ลอง
Fregante

@ bfred.it: ดูเหมือนว่าcreateEventObjectใน IE เป็นมากกว่าสำหรับการสร้างวัตถุเหตุการณ์เพื่อส่งต่อไปยังตัวจัดการแทนที่จะส่งเหตุการณ์สังเคราะห์ IE fireEventอาจเข้าใกล้dispatchEventแต่จะเรียกเฉพาะผู้ฟังเท่านั้นไม่ใช่การกระทำของเบราว์เซอร์เริ่มต้น อย่างไรก็ตามใน IE คุณสามารถเรียกclickเมธอดได้
theazureshadow

1

JQuery('#left').triggerHandler('click');ทำงานได้ดีใน Firefox และ IE7 ฉันยังไม่ได้ทดสอบบนเบราว์เซอร์อื่น

หากต้องการทริกเกอร์การคลิกโดยอัตโนมัติของผู้ใช้ให้ทำดังนี้:

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

1

สิ่งนี้ใช้ไม่ได้กับเบราว์เซอร์ดั้งเดิมของ Android เพื่อคลิก "องค์ประกอบอินพุต (ไฟล์) ที่ซ่อนอยู่":

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

แต่งานนี้:

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

0

ในการพยายามจำลอง 'คลิก' ในการทดสอบหน่วยด้วยสปินเนอร์ jQuery UI ฉันไม่สามารถรับคำตอบก่อนหน้านี้ได้ โดยเฉพาะอย่างยิ่งฉันพยายามจำลอง 'การหมุน' ของการเลือกลูกศรลง ฉันดูการทดสอบหน่วยสปินเนอร์ jQuery UIและพวกเขาใช้วิธีต่อไปนี้ซึ่งใช้งานได้สำหรับฉัน:

element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.