使用纯 Javascript 触发右键单击

IT技术 javascript
2021-01-18 02:19:51

我怎样才能手动触发一个正确的使用Javascript点击?

我可以用 jQuery 做到这一点,但在这种情况下我只能使用纯 Javascript。

3个回答

使用CustomEvent构造函数创建一个事件,或者(当它不受支持时),使用document.createEvent字符串“HTMLEvents”作为参数创建一个事件(因为您要创建一个click事件)。然后,使用该initEvent方法创建一个click事件。

最后,使用dispatchEvent方法来触发事件。如果您使用的是 IE,则fireEvent必须改用方法。

如果要触发右键单击事件contextmenu,请使用以下代码:

var element = document.getElementById('yourElement');
if (window.CustomEvent) {
    element.dispatchEvent(new CustomEvent('contextmenu'));
} else if (document.createEvent) {
    var ev = document.createEvent('HTMLEvents');
    ev.initEvent('contextmenu', true, false);
    element.dispatchEvent(ev);
} else { // Internet Explorer
    element.fireEvent('oncontextmenu');
}
@Patrick 我很高兴看到演示。以下演示基于之前的演示和您的提示不显示上下文菜单(Chrome 21):jsfiddle.net/9gbd4/2
2021-03-18 02:19:51
感谢您的链接 - 但它似乎对我不起作用?我在几个浏览器上尝试过。这是一个例子:jsfiddle.net/9gbd4
2021-03-29 02:19:51
@Abs 您应该调用dispatchEvent应该获得右键单击事件的元素上方法。click您应该使用代替mousedown,因为该click事件通常不会捕获右键单击事件。小提琴:jsfiddle.net/9gbd4/1注意:如果您打算使用 JavaScript 显示上下文菜单,请放弃。JavaScript 无法触发此类行为。
2021-03-30 02:19:51
@Abs,不知何故,我将“右键单击”解释为“正确实现单击”。一秒钟更新答案,概念是一样的。编辑您的意思是contextmenu事件,还是真正的右键单击?
2021-04-02 02:19:51
@RobW 我相信您实际上可以通过触发此事件来触发本机浏览器上下文菜单。实际上,我已经完成并测试了这一点。据我所知,棘手的一点是您只能在另一个鼠标事件期间执行此操作。具体来说,我已经能够阻止在一个元素上发生右键单击事件,并在同一个处理程序中触发另一个元素上的上下文菜单。希望有帮助。
2021-04-11 02:19:51

另一个变体,这次使用的是更现代MouseEvent API。就我而言,我实际上发送了所有三个事件 mouseup/mousedown/contextmenu:

var element = document.getElementById("yourElement");
var ev1 = new MouseEvent("mousedown", {
    bubbles: true,
    cancelable: false,
    view: window,
    button: 2,
    buttons: 2,
    clientX: element.getBoundingClientRect().x,
    clientY: element.getBoundingClientRect().y
});
element.dispatchEvent(ev1);
var ev2 = new MouseEvent("mouseup", {
    bubbles: true,
    cancelable: false,
    view: window,
    button: 2,
    buttons: 0,
    clientX: element.getBoundingClientRect().x,
    clientY: element.getBoundingClientRect().y
});
element.dispatchEvent(ev2);
var ev3 = new MouseEvent("contextmenu", {
    bubbles: true,
    cancelable: false,
    view: window,
    button: 2,
    buttons: 0,
    clientX: element.getBoundingClientRect().x,
    clientY: element.getBoundingClientRect().y
});
element.dispatchEvent(ev3);

以 Rob W 为例,我还没有尝试过,但是,您需要制作事件对象并在触发事件时将其传递。对于右键单击传递 event.button = 2;

var element = document.getElementById("yourElement"),
  ev;
if(document.createEvent ) {
    ev = document.createEvent("MouseEvents");
    ev.initMouseEvent("click", true, false, window,0,0,0,0,0,false,false,false,false,2,null);
    element.dispatchEvent(ev);
} else {
    ev = document.createEventObject();
    ev.button = 2;
    element.fireEvent('onclick', ev);
}

根据 mdn initMouseEvent 更新。祝你好运 :)

@Abs 它在 IE 和我检查过的所有其他浏览器中都有效。捕获的事件对象将设置为 button = 2
2021-03-17 02:19:51
我在 Firefox 3.2 中试过这个setting a property that has only a getter,我的萤火虫出现错误
2021-03-24 02:19:51
你是对的,它是按钮,但我不确定它是否成功。因为我不知道@Abs 在追求什么
2021-04-02 02:19:51
@Rob W 由于某些奇怪的原因,此代码有效。而mozilla案例中的ev.button是一个遗留物。但我检查过,这段代码有效,仔细检查了一下。
2021-04-03 02:19:51
ev.which 不能更改,因为它是只读属性(至少在 Firefox 3.6.23 中)。
2021-04-13 02:19:51