通过Greasemonkey向窗口发送箭头键事件

时间:2014-08-17 03:14:07

标签: javascript greasemonkey keyboard-events

我正在尝试创建一个简单的脚本来重新映射WASD键,以向窗口发送/向左/向下/向右键事件。我正在使用最新的Firefox版本和Greasemonkey。

这是我现在的脚本,我尝试了很多变种,以及我在网上找到的其他一些方法。什么都行不通。

// ==UserScript==
//
// @grant          unsafeWindow
//
// ==/UserScript==

function KeyCheck(e)
{
  //alert(e.keyCode);
  var key = 0;
  if (e.keyCode == 87) 
  {
    key = 38;
  }
  else if (e.keyCode == 65)
  {
    key = 37;
  }
  else if (e.keyCode == 83)
  {
    key = 40;
  }
  else if (e.keyCode == 68)
  {
    key = 39;
  }
    var ev = document.createEvent ('KeyboardEvent');
    ev.initKeyEvent('keypress', true, true, window, false, false, false, false, key, key);
  unsafeWindow.dispatchEvent(ev);
}

unsafeWindow.addEventListener('keydown', KeyCheck, true);

我需要的只是一个简单的功能,可以成功地将关键事件发布到窗口或文档。手动滚动页面不是一个选项(因为我想确保触发可能在检测箭头键的页面上运行的其他脚本)

1 个答案:

答案 0 :(得分:0)

好的 - 我找到了解决方法。

在Firefox和GreaseMonkey下测试 - 我没有在Chrome下测试它。

修改在Chrome和TamperMonkey下测试。也登记了松柏。我不相信常规的内置Chrome用户脚本有不安全的窗口,而且它们更受限制。

简而言之,代码不会像用户脚本一样工作。

因此,我们欺骗系统并将用户脚本转换为常规脚本并将其注入页面本身。

现在,它实际上并没有工作和滚动 - 但它确实捕获了关键事件并引发了警报。

编辑:注意

根据我的经验,GreaseMonkey非常偏执于让任何意外地从不安全的窗口滑入用户脚本的沙盒和受保护的世界。

特别是事件有点棘手。注册到unsafeWindow的事件不能也不会冒泡回GreaseMonkey - 这一点让我产生了不小的悲痛。

// ==UserScript==
//
// @grant          unsafeWindow
// @include   http://*/*
// @include   https://*/*
//
// ==/UserScript==


var head = unsafeWindow.document.getElementsByTagName('head') [0],
script = unsafeWindow.document.createElement('script');

// The magic is here.
// We turn the script into a string which will get parsed be the JS compiler
// when it is added to the unsafeWindow.document.

var scriptTxt = '(' + fn + ')()';

script[script.innerText ? 'innerText' : 'textContent'] = scriptTxt;
head.appendChild(script);

// This is just a wrapper to hold things.    
function fn() {

  function KeyCheck(e)
  {
    alert(e.keyCode);
    var key = 0;
    if (e.keyCode == 87)
    {
      key = 38;
    } 
    else if (e.keyCode == 65)
    {
      key = 37;
    } 
    else if (e.keyCode == 83)
    {
      key = 40;
    } 
    else if (e.keyCode == 68)
    {
      key = 39;
    }
    var ev = document.createEvent('KeyboardEvent');
    ev.initKeyEvent('keypress', true, true, window, false, false, false, false, key, key);
    window.dispatchEvent(ev);
  }
  window.addEventListener('keydown', KeyCheck, true);
};