【问题标题】:How to right click from javascript如何从javascript右键单击
【发布时间】:2016-04-19 06:30:34
【问题描述】:

似乎无法在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 扩展来向窗口对象添加一个函数,可以从任何使用一些额外功能的脚本调用。

然而,令人惊讶的是,chrome 扩展似乎没有为我提供在窗口对象中创建函数的方法。我还没有看它是否让我能够弹出上下文菜单。

在放弃之前,我没有对 chrome 扩展进行大量实验。

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

解决方案是否仅适用于 google chrome 或者无法保证它会在下一个版本中停止运行都没有关系。

我应该用 dll 挂钩 chrome 进程吗?是这样吗?

【问题讨论】:

标签: javascript windows google-chrome


【解决方案1】:

您可以通过Native Messaging通过chrome扩展名中的exe文件调用dll。我在此答案中提供了本机消息传递过程的示例: See the answer of this question

希望对你有用。

【讨论】:

  • 我想在没有网页脚本协作的情况下这样做。
【解决方案2】:

这应该适用于这个标记:

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

然后当你执行这个,“成功!”警报后的文本更改为“您好,这是我的事情,这已被取消”:

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

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>

【讨论】:

  • 对不起,这个问题不是关于如何禁用上下文菜单。我更改了标题。
  • 当该事件被触发时,您如何处理它取决于您。如果您不想禁用,请返回 true,请记住默认菜单不会从脚本中出现(不可能)。
  • 我想模拟右键事件,不接收。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2011-01-25
  • 2011-04-05
  • 2015-07-14
相关资源
最近更新 更多