JavaScript 이벤트 클릭을 트리거하는 방법


215

내 페이지에 하이퍼 링크가 있습니다. 테스트 목적으로 하이퍼 링크에서 여러 번의 클릭을 자동화하려고합니다. JavaScript를 사용하여 하이퍼 링크에서 50 회의 클릭을 시뮬레이션 할 수있는 방법이 있습니까?

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

JavaScript에서 onClick 이벤트 트리거를 찾고 있습니다.

답변:


285

HTML 요소를 한 번 클릭 하면 간단히 수행 할 수 element.click()있습니다. 대부분의 주요 브라우저는이 기능을 지원합니다 .


클릭을 두 번 이상 반복하려면 요소에 ID를 추가하여 고유하게 선택하십시오.

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

.click()for 루프를 통해 JavaScript 코드에서 메소드를 호출하십시오 .

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

1
NB 이것은 빠른 테스트 목적입니다. 보다 강력하고 표준을 준수하는 크로스 브라우저 솔루션에 대해서는 Juan의 답변을 참조하십시오.
instanceof me

3
루프를 이해하지 못하며 모바일에서 작동하지 않았습니다.
im_benton

@im_benton : 루프는 OP의 특정 요구를위한 것입니다. 클릭 이벤트 만 트리거하면으로 시작하는 행을 생략 할 수 있습니다 for(.
rinogo

87

최신 정보

이것은 오래된 대답이었습니다. 요즘에는 click 을 사용해야합니다 . 보다 고급 이벤트 발생을 위해서는 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, true, true); // 변경 이벤트에 대해 버블 링을 비활성화 한 이유를 모르겠습니다. 당신의 생각을 말 해주세요.
Aleksander Lech

40

 l.onclick();

does의 onclick함수를 정확하게 호출하는 l것입니다 l.onclick = myFunction;. 설정하지 않은 경우 l.onclick아무 것도 수행하지 않습니다. 대조적으로

 l.click();

클릭을 시뮬레이션하고 l.addEventHandler('click', myFunction);, HTML 또는 기타 방식으로 추가 여부에 관계없이 모든 이벤트 핸들러를 실행합니다 .


1
FWIW 이것은 요소 수준에서만 작동합니다. 클릭 이벤트를 window객체에 추가하면 마술처럼 window.click함수가 노출되지 않습니다 .
제임스 도넬리

20

부정확하거나 공개되지 않은 부분 적용 가능성이 너무 많다는 것이 부끄럽습니다.

가장 쉬운 방법은 콘솔을 사용하는 Chrome 또는 Opera (예제에서는 Chrome을 사용함)를 사용하는 것입니다. 콘솔에 다음 코드를 입력하십시오 (일반적으로 한 줄로).

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

필요한 결과가 생성됩니다


12

.click()Android에서는 작동하지 않습니다 ( 모바일 문서 , 모바일 섹션 참조). 이 방법으로 클릭 이벤트를 트리거 할 수 있습니다.

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/ - 셀레늄은 시스템을 테스트 자동화 된 웹 응용 프로그램입니다.

Firefox 플러그인 Selenium IDE를 사용하여 테스트를 만들 수 있습니다

이벤트 수동 발생

올바른 방법으로 이벤트를 수동으로 발생 시키려면 다른 브라우저에 대해 다른 방법을 사용해야 합니다 (앵커 요소가 될 위치 el.dispatchEvent또는 el.fireEvent위치) el. 두 가지 모두 전달할 Event 객체를 생성해야한다고 생각합니다.

완전히 정확하지 않고 더럽고 더러운 방법은 다음과 같습니다.

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.