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

Javascript 通过Greasemonkey向窗口发送箭头键事件,javascript,greasemonkey,keyboard-events,Javascript,Greasemonkey,Keyboard Events,我正在尝试制作一个简单的脚本来重新映射WASD键,以便将上/左/下/右键事件发送到窗口。我正在使用最新的Firefox版本和Greasemonkey 这是我现在拥有的脚本,我已经尝试了它的许多变体,以及我在网上找到的一些其他方法。什么都不管用 // ==UserScript== // // @grant unsafeWindow // // ==/UserScript== function KeyCheck(e) { //alert(e.keyCode); var k

我正在尝试制作一个简单的脚本来重新映射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);
我所需要的只是一个简单的函数,它可以成功地将关键事件发布到窗口或文档中。手动滚动页面在这里不是一个选项(因为我想确保页面上运行的检测箭头键的其他脚本被触发)

好的——我找到了一种方法来实现它

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

哦,我的上帝,什么函数有10个参数(为什么会有人这样做)?这有点广泛。无论如何,希望你的问题得到解决。:)这可能不可能使用Greasemonkey。目标页面是否使用jQuery?闪光iFrames?没有目标页面,我试图将其作为我如何处理论坛、画廊等事物的一般扩展来编写。这就是为什么我希望发送关键事件,而不是其他任何事情-因为在某些情况下,箭头键滚动页面,而在其他情况下,它们具有页内效应。@BrockAdams注意到您处理了许多用户脚本问题。这个问题的解决方案可能很有趣,可以放到你的工具箱里。@JeremyJStarcher,你的答案似乎只是注入了OP的代码。Op的代码只在选择的情况下工作,无论是否注入。一般来说,浏览器不能很好地响应生成的键盘事件,您可能还需要模拟自然序列。此外,Flash或iFrame会使事情复杂化。感谢您的努力。我猜Firefox(至少)的设置方式,即使这样做也不会触发滚动或其他链接到普通箭头键的页面事件。不幸的是,通过Greasemonkey似乎没有解决方案。我可能不得不使用一些外部工具,如自动热键。