由于 Netflix 播放器代码无法使用 jQuery 设置事件侦听器,因此我建议使用原生 js-events 的解决方案。 Netflix 也可能需要一个比简单地在 1 毫秒内触发四个键事件更自然的事件计时(参见 SO - question)。
下面的函数创建四个本机keydown-KeyboardEvents,并按照您给定的顺序为键提供正确的属性。它们之间的延迟为 50 毫秒,以模拟更自然的行为。
我添加了一个紧随其后的带有“S”的keypress-event,因为某些设备会触发它。
在 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(),因为它已被弃用,并且浏览器处理它的方式非常不同。所以我添加了一个方法来重新定义事件对象中的这些属性。它是
灵感来自termi's answer on this SO-question。我也从T切换到S。
现在this FIDDLE works 适用于 FF、Chrome 和 Opera,但不适用于 IE 和 Safari(没有实现 KeyboardEvent API)。我会尝试为他们找到并实施一个简单的解决方案。
编辑 2: 由于它仍然无法正常工作,我们在“S”上添加了一个按键事件。查看更改后的代码。如果这还不够,我们将在放弃之前逐步释放 ALT、SHIFT 和 CTRL。