วิธีจำลองการคลิกด้วย JavaScript ได้อย่างไร


293

ฉันแค่สงสัยว่าฉันจะใช้ JavaScript เพื่อจำลองการคลิกบนองค์ประกอบได้อย่างไร

ปัจจุบันฉันมี:

<script type="text/javascript">
function simulateClick(control)
{
    if (document.all)
    {
        control.click();
    }
    else
    {
        var evObj = document.createEvent('MouseEvents');
        evObj.initMouseEvent('click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
        control.dispatchEvent(evObj);
    }
}
</script>

<a href="http://www.google.com" id="mytest1">test 1</a><br>

<script type="text/javascript">
    simulateClick(document.getElementById('mytest1'));
</script>

แต่มันไม่ทำงาน :(

ความคิดใด ๆ


9
"ห้าข้อผิดพลาดการเข้ารหัสที่พบบ่อยที่สุด": javascript.about.com/od/hintsandtips/a/worst_4.htm - ไม่มีใครเรียกใช้ IE4 อีกต่อไปดังนั้นการสนับสนุนเอกสาร DOM ทั้งหมดไม่จำเป็นต้องใช้อีกต่อไป เป็นเรื่องที่น่าแปลกใจจริง ๆ ว่ามีกี่คนที่ยังคงใช้มันในการเขียนโค้ด ที่เลวร้ายยิ่งคือการรองรับเอกสาร DOM ทั้งหมดมักจะทดสอบเพื่อกำหนดเบราว์เซอร์ที่ใช้และหากได้รับการสนับสนุนรหัสจะถือว่าเบราว์เซอร์เป็น Internet Explorer (ซึ่งเป็นการใช้งานที่ผิดอย่างสมบูรณ์ตั้งแต่ Operaยังรู้จัก DOM นั้น) .
zaf

คำตอบ:


418

นี่คือสิ่งที่ฉันทำขึ้น มันค่อนข้างง่าย แต่ใช้งานได้:

function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('Events');
    evObj.initEvent(etype, true, false);
    el.dispatchEvent(evObj);
  }
}

การใช้งาน:

eventFire(document.getElementById('mytest1'), 'click');

12
@Anderson Green: ฉันได้เพิ่มตัวอย่างใน jsfiddle นี้: jsfiddle.net/KooiInc/W4BHD
KooiInc

4
พิสูจน์ว่านี่ใช้งานได้ (ใน Chromium): +1 กับdocument.querySelector('[value="2706236"]').nextSibling.nextSibling.dispatchEvent(ev);:)
PointedEars

58
ฉันลองใช้จาวาสคริปต์ของคุณบนปุ่มโหวตโหวต :) (ทำงานแน่นอน)
0fnt

1
ในการจำลองพฤติกรรมผู้ใช้ที่แน่นอนคุณควรปิดdispatchEventหรือclickเรียกใช้ด้วยsetTimeoutตามที่ปรากฏว่าdispatchEventเป็นแบบซิงโครนั
เลฟคาซาคอฟ

16
Event.initEventขณะนี้เลิกใช้งาน developer.mozilla.org/en/docs/Web/API/Event/initEvent
artnikpro

394

สิ่งที่เกี่ยวกับสิ่งที่ง่ายเช่น:

document.getElementById('elementID').click();

รองรับแม้โดย IE


@HermannIngjaldsson ใช่มันทำงานได้อย่างสมบูรณ์แบบใน IE - msdn.microsoft.com/en-us/library/ie/ms536363%28v=vs.85%29.aspx
Darren Sweeney

6
คำถามคือ "ใช้งานได้ดีเช่นกัน?" - คำตอบคือใช่ - AFAIK อย่างน้อยลดเหลือ 8 ไม่ได้ตรวจสอบ 7
Darren Sweeney

24
สิ่งนี้ไม่เคยมีมาก่อนหรือไม่? ทำไมคำตอบในปี 2010 ไม่ได้พูดถึงวิธีแก้ปัญหาง่ายๆนี้? เพียงแค่อยากรู้อยากเห็น ...
Parth

3
@ NinoŠkopacใช้งานได้ดีกับเดสก์ท็อปในปัจจุบัน แต่ไม่รับประกันว่าจะทำงานกับเบราว์เซอร์มือถือได้ แม้แต่เว็บไซต์ผู้พัฒนาโมซิลล่าก็ยังไม่แสดงการสนับสนุนทางมือถือ
le0diaz

8
@Parth บางทีอาจเป็นไปได้ แต่ก็ไม่ได้คลิกเลย
Andrew

78

คุณได้พิจารณาใช้ jQuery เพื่อหลีกเลี่ยงการตรวจหาเบราว์เซอร์ทั้งหมดหรือไม่ ด้วย jQuery มันจะง่ายเหมือน:

$("#mytest1").click();

21
นี่เป็นการเริ่มตัวจัดการเหตุการณ์ jQuery เท่านั้นไม่ใช่พฤติกรรมเริ่มต้น (เบราว์เซอร์จะไปที่ href ในกรณีนั้น)
Romuald Brunet

12
ฉันไม่รู้เรื่องเศร้า แต่ก็มั่นใจได้ว่าจะไม่จำเป็นต้องทำการบันทึกซ้ำในการตรวจหาเบราว์เซอร์เดิมซ้ำแล้วซ้ำอีก
BradBrening

9
@ErikAigner: ฉันสงสัยเหมือนกัน แต่ดีใจที่คำตอบที่ยอมรับในกรณีนี้คือ JavaScript ธรรมดาไม่ใช่ jQuery เห็นว่าหลายครั้งเกินไปดังนั้น อีกครั้ง: jQuery คือ JavaScript แต่ JavaScript ไม่ใช่ jQuery แม้ว่าฉันจะชอบใช้ jQuery แต่ฉันเห็นมากขึ้นเรื่อย ๆ ที่ devs ไม่เข้าใจสิ่งที่แท้จริง 2 เซ็นต์ของฉันไม่สามารถต้านทานที่จะแสดงความคิดเห็น ;)
Sander

58
นอกจากนี้ยังมีมนุษย์จำนวนมากที่ไม่รู้ว่าจะเริ่มต้นอย่างไรถ้าพวกเขาต้องซักเสื้อผ้าด้วยมือเนื่องจากครัวเรือนส่วนใหญ่มีเครื่องซักผ้าและเกือบจะมีเครื่องอบผ้า jQuery เหมือนกับเครื่องใช้ที่ทันสมัยทำให้งานบ้านเก่า ๆ ง่ายขึ้นและเกิดข้อผิดพลาดน้อยลง มันไม่ใช่วิธีแก้ปัญหาสำหรับทุกคนอย่างไรก็ตามการลดคำตอบลงที่ตอบคำถามอย่างถูกต้องโดยใช้ไวยากรณ์ที่กระชับและเข้าใจได้มากกว่าในขณะที่การทำงานร่วมกันข้ามเบราว์เซอร์ดูเหมือนจะย้อนหลัง +1
FreeAsInBeer

2
@ FreeAsInBeer ดังนั้นคุณไม่ควรเดินไปทุกที่เพราะการขับนั้นง่ายกว่ามาก แต่เรารู้ว่ามันโง่ คุณเดินถ้าคุณไม่จำเป็นต้องไปไกล คุณใช้ JavaScript ธรรมดาถ้าคุณต้องการทำสิ่งที่ง่ายและไม่ต้องการโหลดทั้งไลบรารีเพื่อทำมัน ไม่จำเป็นต้องเสียแก๊ส / แบนด์วิดท์สำหรับสิ่งที่ง่าย
จาค็อบอัลวาเรซ

18
var elem = document.getElementById('mytest1');

// Simulate clicking on the specified element.
triggerEvent( elem, 'click' );

/**
 * Trigger the specified event on the specified element.
 * @param  {Object} elem  the target element.
 * @param  {String} event the type of the event (e.g. 'click').
 */
function triggerEvent( elem, event ) {
  var clickEvent = new Event( event ); // Create the event.
  elem.dispatchEvent( clickEvent );    // Dispatch the event.
}

การอ้างอิง


ฉันเชื่อว่านี่เป็นคำตอบที่ดีที่สุดในปัจจุบัน
DavidTaubmann

15

คุณสามารถประหยัดพื้นที่ได้ด้วยการใช้ jQuery คุณจะต้องใช้:

$('#myElement').trigger("click")

10
OP ขอ JavaScript แม้ว่าสิ่งนี้จะมีขนาดกะทัดรัดและใช้งานได้ แต่บางคนก็ชอบ no-Library JS มากกว่าสิ่งต่างๆเช่น jQuery
ซาก

43
ประหยัดพื้นที่ด้วยการดาวน์โหลด jquery?
MH

9
บางคนชอบการชุมนุมเช่นกัน
Dan Nissenbaum

@MH ฉันคิดว่าอาร์กิวเมนต์ที่ถูกต้องมากกว่านี้คือ "เพื่อให้ง่าย" โปรไฟล์เริ่มต้นของคุณที่นี่ใน SO มีขนาดประมาณ jQuery เท่ากัน
adelriosantiago

7

คำตอบที่ดีที่สุดคือ! อย่างไรก็ตามมันไม่ได้เรียกเหตุการณ์เมาส์สำหรับฉันใน Firefox เมื่อetype = 'click'เมื่อ

ดังนั้นผมเปลี่ยนdocument.createEventไป'MouseEvents'และแก้ไขปัญหา รหัสพิเศษคือการทดสอบว่ามีการใส่รหัสอีกเล็กน้อยหรือไม่และเหตุการณ์นั้นถูกยกเลิกไปหรือไม่และหากมีการยกเลิกฉันจะบันทึกมันไว้ที่คอนโซล

function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent(etype, true, false);
    var canceled = !el.dispatchEvent(evObj);
    if (canceled) {
      // A handler called preventDefault.
      console.log("automatic click canceled");
    } else {
      // None of the handlers called preventDefault.
    } 
  }
}

-1
document.getElementById('elementId').dispatchEvent(new MouseEvent("click",{bubbles: true, cancellable: true}));

ไปที่ลิงก์นี้เพื่อทราบเกี่ยวกับเหตุการณ์เมาส์โดยใช้ Javascript และความเข้ากันได้ของเบราว์เซอร์ในลักษณะเดียวกัน

https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent#Browser_compatibility

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