最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How do you make React wait for ALL multimedia to be fully loaded? - Stack Overflow

programmeradmin0浏览0评论

I am building a website in ReactJS. The first screen of this site contains three videos. I want to know how I can set up an event that gets triggered when all three videos have been loaded.

My goal is to display my loading animation until all of the videos have successfully loaded (so the user doesn't sit there staring at video containers waiting to be populated). Ideally when the loading animation is plete, the videos will be fully loaded and ready to be played with no UI interruptions.

Using lifecycle hooks for this use case does not seem to work, as these hooks will wait until the DOM has rendered, but not until the multimedia has loaded.

  // Does not work
  // Similar to ponentDidMount and ponentDidUpdate:
  useEffect(() => {
    setIsLoading(false)
  });

I have seen similar questions mentioning to use the <video> onLoad event:

<video ref={video1}
    autoPlay
    playsInline
    muted
    className="video"
    loop
    src={bike}
    onLoad={()=>{console.log("I don't get called???")}}
/>

but for some reason this function is never called.

This seems like a relatively mon use case so I'd highly appreciate advice on the correct solution.

Extra Info:

  • These videos will be locally available (not fetched from an external endpoint)
  • I prefer to stick to using functional ponents

I am building a website in ReactJS. The first screen of this site contains three videos. I want to know how I can set up an event that gets triggered when all three videos have been loaded.

My goal is to display my loading animation until all of the videos have successfully loaded (so the user doesn't sit there staring at video containers waiting to be populated). Ideally when the loading animation is plete, the videos will be fully loaded and ready to be played with no UI interruptions.

Using lifecycle hooks for this use case does not seem to work, as these hooks will wait until the DOM has rendered, but not until the multimedia has loaded.

  // Does not work
  // Similar to ponentDidMount and ponentDidUpdate:
  useEffect(() => {
    setIsLoading(false)
  });

I have seen similar questions mentioning to use the <video> onLoad event:

<video ref={video1}
    autoPlay
    playsInline
    muted
    className="video"
    loop
    src={bike}
    onLoad={()=>{console.log("I don't get called???")}}
/>

but for some reason this function is never called.

This seems like a relatively mon use case so I'd highly appreciate advice on the correct solution.

Extra Info:

  • These videos will be locally available (not fetched from an external endpoint)
  • I prefer to stick to using functional ponents
Share Improve this question asked Jan 15, 2021 at 5:16 Jake ChambersJake Chambers 5632 gold badges8 silver badges25 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 10

Try using the "onLoadedData" event.

I wrote a small demo to verify that all three videos have loaded using this event.

Using the onLoadedData event to trigger setVideoLoaded.

      <video
        autoPlay
        playsInline
        muted
        className="video"
        loop
        src="http://mondatastorage.googleapis./gtv-videos-bucket/sample/BigBuckBunny.mp4"
        onLoadedData={() => {
          setVideoLoaded();
        }}
      />

Increment the state each time the event is fired by a video loading. Then do some more stuff when all three are ready to play.

const [loadCount, setLoadCount] = useState(0);

  const setVideoLoaded = () => {
    console.log("video loaded");
    if (loadCount <= 1) {
      setLoadCount(loadCount + 1);
    } else {
      console.log("All videos loaded!");
    }
  };

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>