由于不确定 Netflix 播放器代码是否使用 jQuery 设置事件监听器,我建议使用本机 js 事件的解决方案。Netflix 可能需要更自然的事件时间,而不是在 1ms 内触发四个按键事件(请参阅此
SO-问题)。
下面的函数创建了四个本机的
keydown
-KeyboardEvents,按照您给定的顺序具有正确的属性。它们之间以 50ms 的延迟触发,以模拟更自然的行为。我添加了一个紧随其后的
keypress
-事件与 '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);
}
}
你可以将函数直接传递给点击处理程序:
$('body').on('click', 'div.player-status .player-status-main-title', simulateCtrlShiftAltS);
编辑:发现Webkit浏览器没有正确设置
keyCode
和
which
属性。我不建议使用
.initKeyboardEvent()
,因为它已经过时,并且浏览器处理方式非常不同。因此,我添加了一种方法来重新定义事件对象中的这些属性。它的灵感来自于
这个SO问题上termi的回答。我还从
T
切换到了
S
。
现在这个FIDDLE适用于FF、Chrome和Opera,但不适用于IE和Safari(没有实现KeyboardEvent API)。我将尝试找到并实现一个简单的解决方案。
编辑2:由于仍然无法正常工作,我们在'S'上添加了一个keyup事件。请参见更改后的代码。如果这还不够,我们将逐步释放ALT、SHIFT和CTRL,然后放弃。