Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将键盘和鼠标事件从一个浏览器选项卡发送到另一个浏览器选项卡_Javascript_Google Chrome_Events_Tabs_Dispatchevent - Fatal编程技术网

Javascript 将键盘和鼠标事件从一个浏览器选项卡发送到另一个浏览器选项卡

Javascript 将键盘和鼠标事件从一个浏览器选项卡发送到另一个浏览器选项卡,javascript,google-chrome,events,tabs,dispatchevent,Javascript,Google Chrome,Events,Tabs,Dispatchevent,因此,我有一个网页,可以作为第一个页面的子页面打开另一个页面(浏览器选项卡)。父选项卡包含执行应用程序大部分工作的代码。子选项卡包含通常嵌入在父选项卡中的组件,但有时用户可能希望在其自己的选项卡中打开该组件。所以他们可以 问题是,子选项卡中的组件支持大约20个不同的键盘命令和许多与鼠标相关的命令(作为键盘命令的组合)。我试图避免将子窗口中的每个键盘命令重新映射到父窗口中的调用。现在,在父窗口中,我使用一个插件映射和处理键盘命令,所有这些命令都被发送到正确的组件API调用 我想做的是,将键盘和鼠标

因此,我有一个网页,可以作为第一个页面的子页面打开另一个页面(浏览器选项卡)。父选项卡包含执行应用程序大部分工作的代码。子选项卡包含通常嵌入在父选项卡中的组件,但有时用户可能希望在其自己的选项卡中打开该组件。所以他们可以

问题是,子选项卡中的组件支持大约20个不同的键盘命令和许多与鼠标相关的命令(作为键盘命令的组合)。我试图避免将子窗口中的每个键盘命令重新映射到父窗口中的调用。现在,在父窗口中,我使用一个插件映射和处理键盘命令,所有这些命令都被发送到正确的组件API调用

我想做的是,将键盘和鼠标事件从子窗口传输回父窗口,以便这些事件的常规处理可以正常进行。我不想在子窗口中再次为每个命令设置特定的处理程序。管道化键/鼠标事件感觉更优雅,理想情况下,所需代码更少

我尝试的第一件事是:

// CHILD WINDOW
window.document.addEventListener("keydown",  Redispatch, false);
function Redispatch(event){  
        window.opener.myRedirector.dispatchChildEvent(event);
 }
在父窗口中,它有以下内容:

myRedirector.dispatchChildEvent = function(event){
    var r = dispatchEvent(e);
    console.log('dispatched event from child window');
}
在这种情况下,什么也不会发生。父窗口中的console.log()函数永远不会启动,通过它,console.log()行永远不会被命中。dispatchEvent(e)调用的行为就像发生错误一样,但不会抛出任何东西(这是最新的Chrome)

因此,我尝试在父级中实例化一个新事件,如下所示(从另一篇StackOverflow文章中可以看到):

这里的问题是,这不会初始化事件的所有属性,如keyCodewhich。我正在使用的键盘处理程序插件不读取keyIdentifier,而是使用keyCode。我无法手动设置keyCode,因为它在对象上是只读的。我曾想过将插件更改为读取键标识符,但该值不是整数,而是Unicode字符串,如“U+005”等,我不想将所有键代码重新映射到插件中的那些值(尽管这可能是特定于Chrome的)

因此,我还尝试实例化一个CustomEvent,并向其添加属性,这几乎奏效了。除了CustomEvent有一个类型属性,该属性设置为空字符串,并且不能被覆盖,因此插件无法捕获它,因为它不是“keydown”类型,等等

我一直觉得我错过了一些让这成为可能的东西。这就是为什么我避免了其他解决方案,比如重新映射值,或者在子窗口中设置所有新的处理程序,等等

感觉应该可以通过管道将键盘/鼠标事件传递到父窗口。不过,到目前为止,我似乎找不到办法


有什么建议或解决方案吗?

所以,我使用的是document.createEvent(),它生成的事件对象已经添加了太多属性(只读)。所以当我这么做的时候:

var event = new Event(childEvent.type);
这创建了一个正确类型的事件,但没有keyCode或keyIdentifier或其他类似属性,我可以从childEvent动态添加它们。然后,派遣他们工作得很好

var event = new Event(childEvent.type);