似乎无法在javascript中模拟右键单击。
我试图右键单击iframe中的元素(段落),如下所示:
HTML
<button onclick="popup_context_menu_in_iframe()">
popup menu
</button>
<br/><br/>
<iframe srcdoc="<p>Hello world!</p>">
</iframe>
脚本
function popup_context_menu_in_iframe()
{
var $element = $('iframe').contents().find('p');
var element = $element.get(0);
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');
}
}
https://jsfiddle.net/sca60d64/2/
似乎实际上不可能出现上下文菜单,所以我需要找到其他方法。
我首先创建了一个chrome扩展来向window对象添加一个函数,可以从任何使用额外功能的脚本调用它。
然而,令人惊讶的是,Chrome扩展程序似乎没有为我提供在窗口对象中创建函数的方法。如果它甚至让我能够弹出上下文菜单,我还没看过。
在放弃Chrome扩展之前,我没有对chrome扩展进行过多次实验。
所以我需要另一种解决方案。
如果解决方案仅适用于Google Chrome或无法保证在下一版本中停止工作,则无关紧要。
我应该使用dll挂钩chrome进程吗?是吗?
答案 0 :(得分:1)
这适用于此标记:
<div id="mything">
Howdy this is my thing
</div>
事件处理程序:(禁用默认值)
var el=document.getElementById("mything");
el.addEventListener('contextmenu', function(ev) {
ev.preventDefault();
alert('success!');
return false;
}, false);
然后执行此操作时,“成功!”警报后面的文字变为“你好,这是我取消的事情”:
EDIT事件处理程序:(不要禁用默认值)
var el=document.getElementById("mything");
el.addEventListener('contextmenu', function(ev) {
ev.preventDefault();
alert('success!');
return true;
}, true);
然后执行此操作时,“成功!”警报后面的文字变为“你好,这是我的事情,这不会被取消”:
function simulateRightClick() {
var event = new MouseEvent('contextmenu', {
'view': window,
'bubbles': true,
'cancelable': true
});
var cb = document.getElementById('mything');
var canceled = !cb.dispatchEvent(event);
var cbtext = cb.textContent;
if (canceled) {
// A handler called preventDefault.
console.log("canceled");
cb.textContent = cbtext + "this is canceled";
} else {
// None of the handlers called preventDefault.
cb.textContent = cbtext + "this is NOT canceled";
console.log("not canceled");
}
}
simulateRightClick();
在此处测试:https://jsfiddle.net/MarkSchultheiss/bp29s0j4/
编辑:备用选择器:
var fcb = document.getElementById('myframe').contentWindow.document.getElementById('pid');
fcb.addEventListener('contextmenu', function(ev) {
ev.preventDefault();
alert('successFrame!');
return false;
}, false);
鉴于此标记:
<iframe id='myframe' srcdoc="<p id='pid'>Hello world!</p>">
</iframe>
答案 1 :(得分:1)
您可以通过Native Messaging通过chrome扩展程序中的exe文件调用dll。我在这个答案中提供了一个Native Messaging程序示例: See the answer of this question
我希望有用。