ฉันจะเปิดใช้งานกิจกรรมจาวาสคริปต์ได้อย่างไร


215

ฉันมีการเชื่อมโยงหลายมิติในหน้าของฉัน ฉันกำลังพยายามทำให้จำนวนคลิกบนไฮเปอร์ลิงก์โดยอัตโนมัติเพื่อการทดสอบ มีวิธีใดบ้างที่คุณสามารถจำลองการคลิก 50 ครั้งบนไฮเปอร์ลิงก์โดยใช้ JavaScript?

<a href="#" target="_blank" onclick="javascript:Test("Test");">MSDN</a>

ฉันกำลังมองหาทริกเกอร์เหตุการณ์ onClick จาก JavaScript

คำตอบ:


285

การดำเนินการคลิกเพียงครั้งเดียวในองค์ประกอบ HTML:element.click()เพียงแค่ทำ เบราว์เซอร์ที่สำคัญส่วนใหญ่สนับสนุนนี้


หากต้องการคลิกซ้ำมากกว่าหนึ่งครั้ง:เพิ่ม ID ลงในองค์ประกอบเพื่อเลือกซ้ำ:

<a href="#" target="_blank" id="my-link" onclick="javascript:Test('Test');">Google Chrome</a>

และเรียก.click()วิธีการในรหัส JavaScript ของคุณผ่านทาง for for loop:

var link = document.getElementById('my-link');
for(var i = 0; i < 50; i++)
   link.click();

1
NB นี้ใช้สำหรับการทดสอบอย่างรวดเร็ว สำหรับโซลูชันข้ามเบราว์เซอร์ที่ได้มาตรฐานและทนทานกว่าดูที่คำตอบของ Juan
อินสแตนซ์ของฉัน

3
ฉันไม่เข้าใจการวนซ้ำและสิ่งนี้ไม่ได้ทำงานบนมือถือ
im_benton

@im_benton: การวนซ้ำสำหรับความต้องการเฉพาะของ OP for(หากคุณเพียงแค่ต้องเรียกเหตุการณ์คลิกคุณสามารถละเว้นบรรทัดที่ขึ้นต้นด้วย
rinogo

87

UPDATE

นี่เป็นคำตอบเก่า ปัจจุบันคุณก็ควรจะใช้การคลิก สำหรับการยิงเหตุการณ์ที่สูงขึ้นใช้dispatchEvent

const body = document.body;

body.addEventListener('click', e => {
  console.log('clicked body');
});

console.log('Using click()');
body.click();

console.log('Using dispatchEvent');
body.dispatchEvent(new Event('click'));

คำตอบเดิม

นี่คือสิ่งที่ฉันใช้: http://jsfiddle.net/mendesjuan/rHMCy/4/

อัปเดตให้ทำงานกับ IE9 +

/**
 * Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically
 * by testing for a 'synthetic=true' property on the event object
 * @param {HTMLNode} node The node to fire the event handler on.
 * @param {String} eventName The name of the event without the "on" (e.g., "focus")
 */
function fireEvent(node, eventName) {
    // Make sure we use the ownerDocument from the provided node to avoid cross-window problems
    var doc;
    if (node.ownerDocument) {
        doc = node.ownerDocument;
    } else if (node.nodeType == 9){
        // the node may be the document itself, nodeType 9 = DOCUMENT_NODE
        doc = node;
    } else {
        throw new Error("Invalid node passed to fireEvent: " + node.id);
    }

     if (node.dispatchEvent) {
        // Gecko-style approach (now the standard) takes more work
        var eventClass = "";

        // Different events have different event classes.
        // If this switch statement can't map an eventName to an eventClass,
        // the event firing is going to fail.
        switch (eventName) {
            case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.
            case "mousedown":
            case "mouseup":
                eventClass = "MouseEvents";
                break;

            case "focus":
            case "change":
            case "blur":
            case "select":
                eventClass = "HTMLEvents";
                break;

            default:
                throw "fireEvent: Couldn't find an event class for event '" + eventName + "'.";
                break;
        }
        var event = doc.createEvent(eventClass);
        event.initEvent(eventName, true, true); // All events created as bubbling and cancelable.

        event.synthetic = true; // allow detection of synthetic events
        // The second parameter says go ahead with the default action
        node.dispatchEvent(event, true);
    } else  if (node.fireEvent) {
        // IE-old school style, you can drop this if you don't need to support IE8 and lower
        var event = doc.createEventObject();
        event.synthetic = true; // allow detection of synthetic events
        node.fireEvent("on" + eventName, event);
    }
};

โปรดทราบว่าการโทรfireEvent(inputField, 'change');ไม่ได้หมายความว่าจะเปลี่ยนฟิลด์อินพุตจริง กรณีการใช้งานทั่วไปสำหรับการยิงเหตุการณ์การเปลี่ยนแปลงคือเมื่อคุณตั้งค่าฟิลด์โดยทางโปรแกรมและคุณต้องการให้ตัวจัดการเหตุการณ์ถูกเรียกตั้งแต่การโทรinput.value="Something"จะไม่ทำให้เกิดเหตุการณ์การเปลี่ยนแปลง


เฮ้ฮวน! ตัวอย่างของคุณไม่ได้กำหนด JSUtil.NodeTypes.DOCUMENT_NODE
Kato

ฉันรู้ว่าคำถามนั้นเกี่ยวกับการคลิกกิจกรรม แต่คุณให้รหัสทั่วไปที่นี่และสิ่งที่ฉันเห็นว่าเหตุการณ์การเปลี่ยนแปลงจะไม่ถูกไล่ออก (ฉันทดสอบแล้วและนี่ไม่ได้ผลสำหรับกิจกรรมดังกล่าว) ในการทริกเกอร์เหตุการณ์การเปลี่ยนแปลงฉันต้องใช้ฟังก์ชันทริกเกอร์ jquery
Aleksander Lech

@AleksanderLech เพียงแค่ยิงเหตุการณ์ไม่รับประกันว่าการกระทำจะเกิดขึ้น มันทำเพื่อการคลิกมันไม่ได้สำหรับการเปลี่ยนแปลง กรณีการใช้งานสำหรับเหตุการณ์ที่การเปลี่ยนแปลงไม่ทำงานคือเมื่อคุณต้องการเปลี่ยนแปลงมูลค่า แต่คุณต้องการให้ตัวจัดการเหตุการณ์การเปลี่ยนแปลงทั้งหมดถูกเรียก (ไม่ว่าจะถูกตั้งค่าด้วยjQueryหรือไม่ก็ตาม) ฉันสามารถให้ความช่วยเหลือที่มีความหมายมากขึ้นถ้าคุณถามคำถามใหม่ด้วยรหัสที่แน่นอนที่คุณพยายาม แต่ไม่ได้ทำงาน
Juan Mendes

ขอบคุณสำหรับการตอบสนองที่รวดเร็ว ฉันสามารถรับเหตุการณ์การเปลี่ยนแปลงที่ทำงานหลังจากแก้ไขตัวอย่างโค้ดของคุณ: 1) var node = document.getElementById (originalEvent.srcElement.id); 2) event.initEvent (eventName จริงจริง); // ฉันไม่รู้ว่าทำไมคุณปิดการใช้งาน bubbling สำหรับเหตุการณ์การเปลี่ยนแปลง โปรดบอกฉันว่าคุณคิดอย่างไร
Aleksander Lech

40

อะไร

 l.onclick();

ไม่ว่าจะเรียกonclickฟังก์ชั่นl, ที่อยู่, l.onclick = myFunction;ถ้าคุณได้ตั้งเป็นหนึ่งเดียวกับ หากคุณยังไม่ได้ตั้งค่าl.onclickมันจะไม่ทำอะไรเลย ในทางตรงกันข้าม,

 l.click();

จำลองการคลิกและยิงตัวจัดการเหตุการณ์ทั้งหมดไม่ว่าจะเพิ่มด้วยl.addEventHandler('click', myFunction);ใน HTML หรือด้วยวิธีอื่นใด


1
FWIW ใช้ได้กับระดับองค์ประกอบเท่านั้น หากคุณเพิ่มเหตุการณ์คลิกไปที่windowวัตถุสิ่งนั้นจะไม่เปิดเผยwindow.clickฟังก์ชันอย่างน่าอัศจรรย์
James Donnelly

20

ฉันค่อนข้างละอายใจที่มีการบังคับใช้บางส่วนที่ไม่ถูกต้องหรือไม่เปิดเผย

วิธีที่ง่ายที่สุดคือผ่าน Chrome หรือ Opera (ตัวอย่างของฉันจะใช้ Chrome) โดยใช้คอนโซล ป้อนรหัสต่อไปนี้ลงในคอนโซล (โดยทั่วไปใน 1 บรรทัด):

var l = document.getElementById('testLink');
for(var i=0; i<5; i++){
  l.click();
}

สิ่งนี้จะสร้างผลลัพธ์ที่ต้องการ


12

.click()ไม่ทำงานกับ Android (ดูmozilla docsที่ส่วนมือถือ) คุณสามารถทริกเกอร์เหตุการณ์คลิกด้วยวิธีนี้:

function fireClick(node){
    if (document.createEvent) {
        var evt = document.createEvent('MouseEvents');
        evt.initEvent('click', true, false);
        node.dispatchEvent(evt);    
    } else if (document.createEventObject) {
        node.fireEvent('onclick') ; 
    } else if (typeof node.onclick == 'function') {
        node.onclick(); 
    }
}

จากกระทู้นี้


1
ฉันพยายามคลิกทริกเกอร์ของ jQuery แต่พบว่าเป็นการโทรติดต่อกลับแทนที่จะส่งเหตุการณ์จริงใน DOM @ manolo วิธีการของคุณถูกต้อง
Akshay Gundewar

" .click()ไม่ทำงานกับ Android" จริง ๆ แล้วตารางล่าสุดระบุว่า "ไม่รู้จักความเข้ากันได้"
Gaurang Tandon

8

ใช้กรอบการทดสอบ

สิ่งนี้อาจมีประโยชน์ - http://seleniumhq.org/ - Selenium เป็นระบบทดสอบอัตโนมัติของเว็บแอปพลิเคชัน

คุณสามารถสร้างการทดสอบโดยใช้ปลั๊กอิน Firefox ซีลีเนียม

ยิงเหตุการณ์ด้วยตนเอง

ในการเริ่มต้นเหตุการณ์ด้วยตนเองวิธีที่ถูกต้องคุณจะต้องใช้วิธีการที่แตกต่างกันสำหรับเบราว์เซอร์ที่แตกต่างกัน - el.dispatchEventหรือel.fireEventที่elจะเป็นองค์ประกอบ Anchor ของคุณ ฉันเชื่อว่าทั้งสองอย่างนี้จะต้องมีการสร้างวัตถุเหตุการณ์เพื่อส่งต่อ

ทางเลือกที่ไม่ถูกต้องรวดเร็วและสกปรกจะเป็นเช่นนี้:

var el = document.getElementById('anchorelementid');
el.onclick(); // Not entirely correct because your event handler will be called
              // without an Event object parameter.


1

คำเตือนที่เป็นธรรม:

element.onclick()ไม่ทำงานตามที่คาดไว้ มันรันโค้ดภายในonclick="" attributeเท่านั้น แต่ไม่เรียกใช้การทำงานเริ่มต้น

ฉันมีปัญหาที่คล้ายกันกับปุ่มตัวเลือกไม่ได้ตั้งค่าให้ตรวจสอบแม้ว่าonclickฟังก์ชั่นที่กำหนดเองก็ทำงานได้ดี จำเป็นต้องเพิ่มradio.checked = "true";เพื่อตั้งค่า น่าจะเป็นกันไปและองค์ประกอบอื่น ๆ (หลังa.onclick()ควรจะมียังwindow.location.href = "url";)


อันที่จริงการใช้onclick()หมายความว่าeventวัตถุจะไม่ถูกกำหนดโดยเบราว์เซอร์โดยอัตโนมัติดังนั้นวิธีการทั่วไปเช่นevent.stopPropagation()จะไม่ได้กำหนด
โบอาซ

0

กรุณาเรียกฟังก์ชั่นทริกเกอร์ที่ใดและปุ่มจะคลิก


<a href="#" id="myBtn" title="" >Button click </a>

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