2016-04-19 79 views
0

似乎无法在JavaScript中模拟右键单击。如何右键单击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/

现在看来似乎实际上不可能使上下文菜单出现,所以我需要fi nd其他方式。

我首先要创建一个扩展的chrome来为窗口对象添加一个函数,这个函数可以从任何使用额外功能的脚本中调用。

但是,铬扩展令人惊讶似乎没有提供一种在窗口对象中创建函数的方法。我没有看过它是否让我有能力弹出上下文菜单。

在放弃之前,我没有对Chrome扩展做过很多实验。

所以我需要另一种解决方案。

如果一个解决方案只适用于谷歌浏览器,或者如果不能保证它会在下一个版本中停止工作,那并不重要。

我应该钩一个DLL的铬进程?是吗?

+0

这是可能的:http://stackoverflow.com/questions/7914684/trigger-right-click-using-pure-javascript – wf4

+0

似乎这是不可能做到这一点在我的iframe的例子,这个问题已编辑。 –

回答

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

然后,当你执行这个 “sucess!”警报后跟文本更改为“你好,这是我的事,这是取消”:

编辑事件处理程序:(不要禁用默认)

var el=document.getElementById("mything"); 
el.addEventListener('contextmenu', function(ev) { 
    ev.preventDefault(); 
    alert('success!'); 
    return true; 
}, true); 

然后,当您执行这一点,“ sucess!“警报后跟文本更改为 ”你好,这是我的事,这是不是取消“:

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> 
+0

对不起,这个问题不是关于如何禁用上下文菜单。我改变了标题。 –

+0

当你触发该事件时,你做什么取决于你。如果您不想禁用,请返回true,请记住默认菜单不会从脚本中出现(不可能)。 –

+0

我想模拟右键单击事件,没有收到它。 –

1

你可以通过本地消息传递,通过chrome扩展中的exe文件调用dll。我在这个答案中提供了本地消息传递过程的示例: See the answer of this question

我希望能够有用。

+0

我想在没有网页脚本协作的情况下做到这一点。 –