Simulating a mousedown, click, mouseup sequence in Tampermonkey?

后端 未结 3 1642
慢半拍i
慢半拍i 2020-11-27 13:09

I would like to simulate a whole click not just

document.getElementsByClassName()[0].click();

How do I do that? Search results all seem t

相关标签:
3条回答
  • 2020-11-27 13:23

    Bit Optimized

    function fireMouseEvents( query, eventNames ){
        var element = document.querySelector(query);
        if(element && eventNames && eventNames.length){
            for(var index in eventNames){
                var eventName = eventNames[index];
                if(element.fireEvent ){
                    element.fireEvent( 'on' + eventName );     
                } else {   
                    var eventObject = document.createEvent( 'MouseEvents' );
                    eventObject.initEvent( eventName, true, false );
                    element.dispatchEvent(eventObject);
                }
            }
        }
    }
    

    You would fire like this

    fireMouseEvents("a[href*='stackoverflow']",['mouseover','mousedown','mouseup','click']);
    
    0 讨论(0)
  • 2020-11-27 13:24

    Send mouse events. Like so:

    //--- Get the first link that has "stackoverflow" in its URL.
    var targetNode = document.querySelector ("a[href*='stackoverflow']");
    if (targetNode) {
        //--- Simulate a natural mouse-click sequence.
        triggerMouseEvent (targetNode, "mouseover");
        triggerMouseEvent (targetNode, "mousedown");
        triggerMouseEvent (targetNode, "mouseup");
        triggerMouseEvent (targetNode, "click");
    }
    else
        console.log ("*** Target node not found!");
    
    function triggerMouseEvent (node, eventType) {
        var clickEvent = document.createEvent ('MouseEvents');
        clickEvent.initEvent (eventType, true, true);
        node.dispatchEvent (clickEvent);
    }
    

    That works if the web page is statically loaded. If the web page is AJAX-driven, use a technique as in:

    • "Normal" button-clicking approaches are not working in Greasemonkey script?
    • Choosing and activating the right controls on an AJAX-driven site

    Beware:
    The question code has an error. You need to pass a class name to that function. Like so:

    document.getElementsByClassName ("SomeClassName")[0].click();
    
    0 讨论(0)
  • 2020-11-27 13:37

    I improved Brock's code a little after it worked as expected for me.

    Definition:

    function simulateMouseClick(targetNode) {
        function triggerMouseEvent(targetNode, eventType) {
            var clickEvent = document.createEvent('MouseEvents');
            clickEvent.initEvent(eventType, true, true);
            targetNode.dispatchEvent(clickEvent);
        }
        ["mouseover", "mousedown", "mouseup", "click"].forEach(function(eventType) { 
            triggerMouseEvent(targetNode, eventType);
        });
    }
    

    Calling examples:

    simulateMouseClick(document);
    
    simulateMouseClick(document.querySelector("a[href*='stackoverflow']"));
    
    0 讨论(0)
提交回复
热议问题