Javascript Video loadmetadata 事件未在 React-Redux 应用程序上触发

Posted

技术标签:

【中文标题】Javascript Video loadmetadata 事件未在 React-Redux 应用程序上触发【英文标题】:Javascript Video loadmetadata event not being triggered on React-Redux Application 【发布时间】:2018-09-28 17:51:36 【问题描述】:

我有一个从视频中读取一些元数据的 React-Redux 应用程序。

但是添加到loadmetadata 事件的代码永远不会被触发。

作为一种解决方法,我在之前添加了一个等待 1 秒的计时器,这是一个非常糟糕的解决方案,并且并非每次都有效。

另一件事是我找不到一种优雅的方式来将视频元素集成到 Redux 代码中而无需操作 DOM。

代码如下:

  videoPlayerElement = document.getElementById(`videoplayer-$videoId`);
  videoPlayerElement.addEventListener('loadedmetadata', function(e) 
      const duration = videoPlayerElement.duration;
      ...
  )

监听器内部的代码永远不会被执行。 我也尝试了不同的方法来分配 loadmetadata 事件,即:直接分配给videoPlayerElement.onloadmetadata 仍然不起作用。

我认为这可能是因为对象的范围,所以我将其更改为全局只是为了测试......没有帮助。

关于可能导致的任何其他想法?

如果我运行一个简单的示例,例如 this one,它可以正常工作。

【问题讨论】:

你是用你的 react 应用渲染 videoPlayerElement 还是从哪里来的? 是的,它是在 React 组件中呈现的。忘了提一下,当我在调用 getElementById 后记录对象时,视频对象就在那里。 他们为什么不使用react synthetic events?一般来说,如果没有必要,您应该避免从 DOM 中选择元素。我将在我的回答中提供一个例子。 为什么人们在没有礼貌地解释他们的理由的情况下继续投反对票? 这是一个非常好的问题。在我看来,如果你投反对票,你应该解释为什么以及需要改进的地方。虽然您的问题对于某些人来说可能是基本的,但我不明白为什么它应该被否决。 【参考方案1】:

在反应中,您应该尽可能使用synthetic events。您的用例示例:

class MediaPlayer extends Component 

    handleMetadata = event => 
        const duration = event.currentTarget.duration;
        // ...
    

    render() 
        const src = this.props;

        return(
            <video src=src onLoadedMetadata=this.handleMetadata />
        );
    

【讨论】:

以上是关于Javascript Video loadmetadata 事件未在 React-Redux 应用程序上触发的主要内容,如果未能解决你的问题,请参考以下文章

javascript 创建video元素

javascript video_board.js

javascript kill_video_modal.js

javascript--封装自己的video控件

从 Javascript 播放 <audio> + <video> 的正确方法

javascript 在可见视口区域重置视频#js #jquery #video