如何从javascript右键单击

时间:2016-04-19 06:30:34

标签: javascript windows google-chrome

似乎无法在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进程吗?是吗?

2 个答案:

答案 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

我希望有用。