您只能在创建上下文菜单时单击菜单项,这是由插件动态完成的。所以,我们首先需要触发菜单。
据我所知,触发本机上下文菜单是不可能的。但是触发右键单击是可能的 https://stackoverflow.com/q/7914684/962603,你需要使用contextmenu
event.
特别是,使用$(el).trigger('contextmenu')
似乎工作正常。这似乎有效,因为插件明确地支持这个 https://swisnl.github.io/jQuery-contextMenu/docs/events.html#contextmenu。完成后,我们需要触发我们想要单击的菜单项的单击。
// first, trigger the context menu
$('.button-that-has-contextmenu').trigger('contextmenu');
// then click the menu item you want to click
// substitute the correct index in `eq(X)` here
$('.context-menu-item:eq(1)').trigger('mouseup');
由于此插件未托管在 CDN 上,因此在此创建代码片段并不容易。然而我创建了一个JSFiddle https://jsfiddle.net/Justastudent/vak81sdm/1/为了完整地演示这个,我将插件源复制并粘贴到小提琴中。
在评论中,您询问了web.whatsapp.com https://web.whatsapp.com/。我碰巧有一个 WhatsApp 帐户并在那里进行了测试。看来他们是not使用 jQuery contextMenu 插件。 A$
function 确实定义了,但它似乎不是 jQuery,而只是一个快捷方式document.querySelector https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector.
我不知道他们的自定义上下文菜单代码是什么,但我确实设法触发了它。基本上,我使用了上述代码的普通 JS 版本,然后必须弄清楚要触发哪个元素。后者比我想象的要容易。有一个打开的聊天列表,.infinite-list-item
元素。它们在 DOM 中的顺序与视觉顺序不匹配,但可以使用浏览器检查器等找到您想要的顺序。既然你已经拥有了,你想要.chat
该列表项内的元素。假设我们对第二项感兴趣,我们可以按如下方式选择它:
var target = $('.infinite-list-item:nth-child(2) .chat');
您可以在浏览器控制台中检查是否获得了正确的元素。然后,按如下方式触发事件。
var evt = new MouseEvent('contextmenu', {
bubbles: true,
cancelable: true,
view: window,
buttons: 2
});
target.dispatchEvent(evt);
这采用了现代MouseEvent https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent构造函数,代码基于这个例子 https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent#Example.
以上将打开浏览器左上角的上下文菜单。您可以通过传递来更改位置clientX
and clientY
财产进入MouseEvent
构造函数,表示窗口中的位置。
完成后,您可以单击上下文菜单中的项目。除非你无法使用 JavaScript 自动执行此操作。我查看了源代码,这些菜单项的单击处理程序检查是否event.isTrusted https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted,这意味着您无法以编程方式触发对它们的点击。
您可能想考虑使用可以模拟较低级别点击的东西,例如硒2.0 http://www.seleniumhq.org/projects/webdriver/(WebDriver),或者它周围的一些包装,比如网络驱动IO http://webdriver.io/.