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

时间:2014-11-08 10:53:05

标签: javascript jquery html5 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 () {
    alert('Clicked!');
    //Simulate?
});

2 个答案:

答案 0 :(得分:9)

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

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

此代码根据您关联的答案的评论进行调整:https://stackoverflow.com/a/10520017/2518069

准确地说,从这个例子:http://jsbin.com/awenaq/4

关于"根据需要进行调整":

有些页面处理元素上的事件,有些页面会等到它出现bodydocument之类的事件。你可以通过转到Dev Tools,Sources和启用Event Listener Breakpoints来监视这个问题。键盘。从那里,您将能够看到哪个事件触发了您需要的更改,以及哪个元素捕获了它 - 当断点触发时它将在this中。

另外,请注意,如果播放器实际上是插件,则所有这些都可能无效。我在YouTube HTML5播放器上对此进行了测试:它适用于除全屏之外的所有内容(我认为这是一项安全限制?),并在元素#movie_player处理。

答案 1 :(得分:1)

由于Netflix播放器代码使用jQuery设置事件监听器并不是不可靠,我建议使用本机js-events的解决方案。 Netflix还需要一个事件时间,这比在1ms内简单地发出四个关键事件更自然(见SO - question)。

下面的函数创建了四个本机keydown - KeyboardEvents,按照您给出的顺序为键提供了正确的属性。它们在中间延迟50ms被解雇,以模拟更自然的行为。 我已经在' S'中添加了一个紧随其后的keypress - 事件,因为有些设备会触发该事件。

在Timeouts中,IIFE(立即调用的函数表达式)用于将事件作为参数传递给Timeout-callback。

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

您只需将该功能传递给点击处理程序:

$('body').on('click', 'div.player-status .player-status-main-title', simulateCtrlShiftAltS);

编辑:已发现webkit浏览器无法正确设置keyCode - 和which - 属性。我不建议使用.initKeyboardEvent(),因为它已被弃用,浏览器处理它的方式非常不同。所以我添加了一个方法来重新定义事件对象中的这些属性。它&#39; S 灵感来自termi's answer on this SO-question。我也从T切换到S

现在this FIDDLE works适用于FF,Chrome和Opera,但不适用于IE和Safari(没有KeyboardEvent API的实现)。我将尝试为他们找到并实施一个简单的解决方案。

编辑2:由于它仍无法正常工作,我们会在&#39; S&#39;上添加一个keyup-event。查看更改的代码。如果这还不够,我们会在放弃之前逐步释放ALT,SHIFT和CTRL。