在 Tampermonkey 中模拟 mousedown、click、mouseup 序列?

IT技术 javascript mouseevent greasemonkey userscripts tampermonkey
2021-01-18 16:04:55

我想模拟整个点击,而不仅仅是

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

我怎么做?搜索结果似乎都是关于处理此类事件,而不是触发它们。

3个回答

发送鼠标事件。像这样:

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

如果网页是静态加载的,这会起作用。如果网页是 AJAX 驱动的,请使用以下技术:


注意:
问题代码有错误。您需要将类名传递给该函数。像这样:

document.getElementsByClassName ("SomeClassName")[0].click();
@jsv,请参阅此处此处,或者根据需要打开一个新问题。任何新问题都应该有一个 MCVE 或指向目标页面的链接,因为方法可能会根据页面和您的最终目标而有所不同。
2021-03-17 16:04:55
即使其他方法失败,您的代码也能完美运行!但是请您添加一些代码来模拟Shift Click 吗?
2021-03-18 16:04:55
@BrockAdams,所以我把它贴在这里希望不要太啰嗦!
2021-03-26 16:04:55
据我所知,这种行为并不新鲜。向上/向下是立即触发的基本事件,并在其他条件匹配时组合单击拖动鼠标松开相同的元素内最新的鼠标按下事件已针对性地被认为是点击,同样鼠标移动时按住按钮为拖动一段距离treshold(draggeble时),与之相似选择由于mouseup是一个硬性的事实,而click是随后的解释,所以这个顺序也应该是可以预料的。
2021-04-09 16:04:55
您在本机事件触发的顺序中是不正确的。鼠标点击触发点击事件在双击的情况下,顺序是:mousedown、mouseup、click、mousedown、mouseup、click、dblclick。请注意,当依赖单击事件时,没有内置机制来区分单击和双击。我建议编辑您的答案。我希望你对此感到安慰。
2021-04-11 16:04:55

Brock 的代码按我的预期工作后,我对其进行了一些改进

定义:

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

调用示例:

simulateMouseClick(document);

simulateMouseClick(document.querySelector("a[href*='stackoverflow']"));

位优化

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

你会像这样开火

fireMouseEvents("a[href*='stackoverflow']",['mouseover','mousedown','mouseup','click']);