Javascript 在Monkey中模拟mousedown、click、mouseup序列?

Javascript 在Monkey中模拟mousedown、click、mouseup序列?,javascript,mouseevent,greasemonkey,userscripts,tampermonkey,Javascript,Mouseevent,Greasemonkey,Userscripts,Tampermonkey,我想模拟整个点击,而不仅仅是 document.getElementsByClassName()[0].click(); 我该怎么做?搜索结果似乎都是关于处理这些事件,而不是触发它们。发送鼠标事件。像这样: //--- Get the first link that has "stackoverflow" in its URL. var targetNode = document.querySelector ("a[href*='stackoverflow']"); if (targetNod

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

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

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

发送鼠标事件。像这样:

//--- 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);
}
document.getElementsByClassName ("SomeClassName")[0].click();

如果web页面是静态加载的,则该操作有效。如果网页是AJAX驱动的,请使用以下技术:


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

//--- 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);
}
document.getElementsByClassName ("SomeClassName")[0].click();
位优化

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']);
在它按预期对我起作用之后,我有了一点进步

定义:

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']"));

你可以使用document.createEvent(“MouseEvents”)来模拟点击。我以为这只是针对滚轮之类的东西。我不明白在没有mousedown或mouseup的情况下如何模拟整个鼠标点击=/我不知道我想做的是无意义的还是我只是走错了方向,基本上我有一个按钮,只在鼠标上工作。哇!!!mozilla开发网站为我做了这件事。对我来说,关键是:
var simMousedownEvent=newmouseevent('mousedown',{'view':window,'bubbles':true,'cancelable':true})$(“input.myelement”)[0]。dispatchEvent(simMousedownEvent)
需要[0]才能从jQuery对象转换为本机JS DOM对象。本机事件触发的顺序不正确。单击事件在鼠标移动后激发。在双击的情况下,顺序是:mousedown、mouseup、click、mousedown、mouseup、click、dblclick。请注意,在依赖单击事件时,没有内置机制来区分单击和双击。我建议编辑你的答案。我希望你对此感到安慰。据我所知,这种行为并不新鲜。向上/向下是立即触发的基本事件,单击或拖动是在其他条件匹配时合成的。最新mousedown事件所针对的同一元素中的mouseup被视为单击,同样地,当按钮保持为拖动(当拖动时)时,mousemove在树上移动一段距离,类似于选择。由于mouseup是一个硬事实,而click随后会被解释,所以这个顺序也应该是预期的顺序。即使其他方法失败,您的代码也可以完美地工作!但是,你能添加一些代码来模拟Shift-Click吗?@jsv,请参阅和,或者如果需要,打开一个新问题。任何新问题都应该有一个MCVE或指向目标页面的链接,因为方法可能因页面和最终目标而异。@BrockAdams,所以我发布了它。希望不要太罗嗦!