Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_Jquery_Html_Google Chrome_Google Chrome Extension - Fatal编程技术网

有没有办法用javascript模拟鼠标点击时按下多个键?

有没有办法用javascript模拟鼠标点击时按下多个键?,javascript,jquery,html,google-chrome,google-chrome-extension,Javascript,Jquery,Html,Google Chrome,Google Chrome Extension,我正在开发chrome扩展,以使Netflix视频播放器打开隐藏的“更改质量”面板 Netflix会根据您的互联网速度自动更改视频质量 但是有一种已知的方法可以打开隐藏面板并手动更改质量 这是仅在HTML5播放器中打开隐藏面板的方法CTRL+SHIFT+ALT+S 当用户点击标题时,有没有办法, 它模拟键盘键CTRL+SHIFT+ALT+S $('body').on('click', 'div.player-status .player-status-main-title', function

我正在开发chrome扩展,以使Netflix视频播放器打开隐藏的“更改质量”面板

Netflix会根据您的互联网速度自动更改视频质量

但是有一种已知的方法可以打开隐藏面板并手动更改质量

这是仅在HTML5播放器中打开隐藏面板的方法CTRL+SHIFT+ALT+S

当用户点击标题时,有没有办法,
它模拟键盘键CTRL+SHIFT+ALT+S

$('body').on('click', 'div.player-status .player-status-main-title', function () {
    alert('Clicked!');
    //Simulate?
});

由于Netflix player代码使用jQuery设置事件监听器的不是舒尔,因此我建议使用原生js事件的解决方案。Netflix也可能需要一个比在1ms内简单触发四个关键事件更自然的事件计时(见下图)

下面的函数创建四个本机
keydown
-KeyboardEvents,并按照给定的顺序为键创建正确的属性。它们之间的延迟时间为50毫秒,以模拟更自然的行为。 我添加了一个紧随其后的带有“S”的
按键事件,因为一些设备会在该事件上触发

在超时内部,使用IIFE(立即调用的函数表达式)将事件作为参数传递到超时回调中

function simulateCtrlShiftAltS() {
    var keys = [
            {view: document.defaultView, bubbles: true, location: 1, keyLocation: 1, keyIdentifier: 'U+0017', key: 'Control', keyCode: 17, which: 17, altKey: false, ctrlKey: true, shiftKey: false},
            {view: document.defaultView, bubbles: true, location: 1, keyLocation: 1, keyIdentifier: 'U+0016', key: 'Shift', keyCode: 16, which: 16, altKey: false, ctrlKey: true, shiftKey: true},
            {view: document.defaultView, bubbles: true, location: 1, keyLocation: 1, keyIdentifier: 'U+0018', key: 'Alt', keyCode: 18, which: 18, altKey: true, ctrlKey: true, shiftKey: true},
            {view: document.defaultView, bubbles: true, location: 0, keyLocation: 0, keyIdentifier: 'U+0053', key: 'S', keyCode: 83, which: 83, altKey: true, ctrlKey: true, shiftKey: true}
        ], body = document.body;
    for (var i = 0; i < 5; i++) {
        var events = [new KeyboardEvent(i == 4 ? 'keyup' : 'keydown', keys[i] || keys[3])];
        if (i == 3) events.push(new KeyboardEvent('keypress', keys[i]));
        if (events[0].keyCode == 0) events.forEach(function(ev) {
            ['keyCode', 'which'].forEach(function(p) {
                delete ev[p]; Object.defineProperty(ev, p, {value: (keys[i] || keys[3])[p], enumerable: true});
            });
        });
        window.setTimeout(function(evts) {
            return function() {evts.forEach(function(ev) {body.dispatchEvent(ev);});};
        }(events), i * 50);
    }
}
编辑:发现webkit浏览器未正确设置
keyCode
-和
属性。我不建议使用
.initKeyboardEvent()
,因为它已被弃用,而且浏览器处理它的方式非常不同。因此,我添加了一个方法来在事件对象中重新定义这些属性。它是 灵感来自。我还从
T
切换到
S

现在是FF、Chrome和Opera,而不是IE和Safari(没有实现KeyboardEventAPI)。我将尝试为他们找到并实现一个简单的解决方案

编辑2:由于它仍然不起作用,我们在“s”上添加了一个键控事件。查看更改后的代码。如果这还不够,我们将在放弃之前逐步释放ALT、SHIFT和CTRL。

试试这个(无法测试,因为我无法访问Netflix tested,已确认从11.11.14开始工作)

此代码根据您链接的答案的注释改编:

准确地说,从这个例子中可以看出:

关于“根据需要调整”:

有些页面处理某个元素上的事件,有些页面等待该元素冒泡为
body
document
之类的内容。您可以通过转到Dev工具、源代码和启用事件侦听器断点>键盘来监视这一点。从那里,您将能够看到哪个事件触发了所需的更改,以及哪个元素捕获了它—当断点触发时,它将位于
this


另外,请注意,如果播放器实际上是一个插件,那么所有这些可能都不起作用。我在YouTube HTML5播放器上对此进行了测试:它适用于除全屏之外的所有功能(我认为这是一个安全限制?),并在element
#movie\u player
(电影播放器

)进行处理。可能需要注入此功能。我在Netflix上进行了测试,但它不起作用。。。我认为传递T See时有问题,在这里,当我移除T键检查器时,它会在@Jim
T
-keyCode是
84
而不是16(您的警报如果)。但是Webkits在初始化键盘事件时将
keyCode
始终设置为
0
。不知道为什么,我会寻找解决方案。顺便说一句,钥匙不是,很抱歉。。。另外,请从$('body')中删除额外的}。在('click'、'div.player-status.player status main title')上,…@MartinErnst我测试了新的编辑,但不幸的是,我面临着与Xan代码相同的问题,Netflix没有响应触发器,就像我按下键盘上的键一样:(如果它是HTML5函数,那就意味着它是用javascript运行的。为什么不完全跳过按键步骤,直接识别并触发该函数以打开面板?@DiMono我试过了,但我不太擅长javascript,我没能识别该函数,如果你需要netflix帐户来自己尝试,我会为你提供帐户谢谢,这是真的。)ems您的代码触发按键(我检查了控制台,我确信它工作正常)但是Netflix不会像我按键盘上的键那样响应!…如果你需要Netflix帐户来尝试自己,我会提供帐户给你,只需要一种私人方式向你发送我的帐户我这样做了,这是我得到的看到第18531行,我试图触发函数本身,但我得到控制台错误未捕获引用错误:m不是definedYou不应该尝试触发函数;您只需要知道哪个元素捕捉到事件。断点触发时,这将是作用域变量中的
This
。这个:body#page-WiPlayer.ua-chrome.ua-chrome-38.le-blink.os-win.os-win-81.ua-not-ie.sc-wn.sc-struts.global-header用于手动触发的事件实际显示界面?
$('body').on('click', 'div.player-status .player-status-main-title', simulateCtrlShiftAltS);
function simulateCtrlShiftAltS() {
  // Prepare function for injection into page
  function injected() {
    // Adjust as needed; some events are only processed at certain elements
    var element = document.body;

    function keyEvent(el, ev) {
      var eventObj = document.createEvent("Events");
      eventObj.initEvent(ev, true, true);

      // Edit this to fit
      eventObj.keyCode = 83;
      eventObj.which = 83;
      eventObj.ctrlKey = true;
      eventObj.shiftKey = true;
      eventObj.altKey = true;

      el.dispatchEvent(eventObj);
    }

    // Trigger all 3 just in case
    keyEvent(element, "keydown");
    keyEvent(element, "keypress");
    keyEvent(element, "keyup");
  }

  // Inject the script
  var script = document.createElement('script');
  script.textContent = "(" + injected.toString() + ")();";
  (document.head||document.documentElement).appendChild(script);
  script.parentNode.removeChild(script);
}