javascript - 如何处理 Netflix 视频中的 dragend 事件

标签 javascript react-redux rxjs dom-events

我有一个 Chrome 扩展程序,可以针对 Netflix 执行一些基本的自动化操作。我有这一行向后或向前执行跳过:

netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[trickyIndex].handler(null, {value: 123, pointerEventData: {playing: true}});

trickyIndex 为 1 时,仅当 Netflix slider 保持不变时,它才能完美运行。如果查看者向前或向后拖动 slider 或使用向前或向后箭头键向后或向前跳转,则下次调用上述行时,它会抛出以下两个错误之一:

Uncaught TypeError: Cannot read property 'handler' of undefined

或者...

Cannot read property 'target' of null

显示的第二个错误是迄今为止最常见的错误,但我也见过第一个错误。

看来他们正在使用带有 RxJSreact-redux 的 Observable 模式。

但是在浏览器移动 slider (或箭头)后,如果 trickyIndex 为 0,上面的代码将从那时起完美运行。无论再次调用多少次,或者是否用户向后或向前跳转,0 的 trickyIndex 将始终有效,但 1 的 trickyIndex 将始终抛出上面显示的错误。

如果我从一开始就使用 0 的 trickyIndex,它就会抛出错误。它只有在用户使用 slider 或箭头手动跳过后才能正常工作。

问题:我不知道如何检测用户何时拖动 slider 或使用左/右箭头键。如果我能检测到这一点,我就可以正确设置 trickyIndex,我相信它在所有情况下都能正常工作。或者我愿意接受更好或更强大的解决方案。另一个问题是 try/catch 根本无法解决显示的代码行。我认为是因为涉及一个异步的处理程序。如果我能成功捕捉到错误,我可以简单地尝试 1,如果失败,则尝试 0,这可能会很有效。但是 catch block 什么也没捕获,异常一直崩溃并返回到浏览器。

我还尝试过这种方法,它运行时完全没有错误,但不执行搜索/跳过:

netflix.cadmium.UiEvents.events.resize.forEach(function(resizeItem) {
    if (resizeItem.scope) {
        resizeItem.scope.events.dragend.forEach(function(dragendItem) {
            if (dragendItem.scope) {
                dragendItem.handler(null, {
                    value: 123,
                    pointerEventData: {playing: true}
                });
            }
        });
    }
});

我确认输入了外部 foreach 而不是内部 foreach (dragendItem.scope 始终为 null)。这令人费解,因为如果我运行原始行:netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[trickyIndex].handler(null, {value: 123, pointerEventData: {playing: true}});——它在特定用例中确实有效。

有什么想法吗?

最佳答案

Netflix 制作 extensive useobservable pattern客户端和服务器端 - 您尝试对其事件执行的任何操作都需要考虑到这一点。

在特定事件中成为“时间集合”,然后它们应用集合函数(例如 map)。

这种设计模式不会留下事件处理程序(这是它的一大优势),因此您将无法保留它们,您需要连接到核心观察者或添加自己的观察者.

这意味着使用 Rx methods ,而不是索引,因为索引会随着新事件的发生和旧事件的丢弃而不断变化。

像这样:

netflix.cadmium.UiEvents.events.resize.subscribe(
    // This will repeat every time resize happens
    r => r.scope.events.dragend.subscribe(
        // This will repeat every time dragend happens
        d => d.handler(null, {value: 123, pointerEventData: {playing: true}})
    )
);

Netflix have been quite open about using Rx ,如果您打算在其上构建任何内容,我强烈建议您观看他们的视频(他们的 UI 有一个完整的 YouTube channel )。

关于javascript - 如何处理 Netflix 视频中的 dragend 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43198311/

相关文章:

javascript - 如何在 React 中使用 Rxjs 返回 Promise?

javascript - 使用ajax发送数据,然后发送电子邮件

javascript - 如何加快我的 javascript 粘贴操作?

javascript - Redux Spread 运算符与 Map

javascript - 如何在javascript中获取多维数组中数组的键和值

javascript - 合并连续的观测值

javascript - 如何关闭由 settimeout 设置的函数

javascript - 如何使用此 jquery 代码传递文件值

javascript - 具有删除功能的 React 模态

arrays - React Native 对象子映射在父映射内