diff --git a/example/src/IframePage.tsx b/example/src/IframePage.tsx index 936fdf2f..7c04d955 100644 --- a/example/src/IframePage.tsx +++ b/example/src/IframePage.tsx @@ -1,85 +1,120 @@ -import React, {useEffect} from 'react' +import React, {useCallback, useEffect, useRef, useState} from 'react' import {EVENTS, ACTIONS, createMessageHelper} from 'griffith-message' -export default function IframePage() { +export default function IframePage(): JSX.Element { + const [iframeRefs] = useState(() => + [...Array(4).keys()].map(() => React.createRef()) + ) + const timeInputRef = useRef(null) + const helperRef = useRef>() + useEffect(() => { - const {subscribeMessage, dispatchMessage} = createMessageHelper() + helperRef.current = createMessageHelper() - function pauseAllOtherVideos(thisWindow) { - Array.from(document.querySelectorAll('iframe')) - .map(node => node.contentWindow) - .filter(w => w !== thisWindow) - .forEach(w => dispatchMessage(w, ACTIONS.PLAYER.PAUSE)) + function pauseAllOtherVideos(thisWindow: MessageEventSource) { + iframeRefs + .map((ref) => ref.current!.contentWindow!) + .filter((w) => w !== thisWindow) + .forEach((w) => + helperRef.current!.dispatchMessage(w, ACTIONS.PLAYER.PAUSE) + ) } - const disposer = subscribeMessage((messageName, data, sourceWindow) => { - if (messageName === EVENTS.DOM.PLAY) { - pauseAllOtherVideos(sourceWindow) + const disposer = helperRef.current.subscribeMessage( + (messageName, data, sourceWindow) => { + if (messageName === EVENTS.DOM.PLAY) { + pauseAllOtherVideos(sourceWindow!) + } } - }) - - const firstVideoWindow = document.querySelector('iframe').contentWindow - - document.getElementById('jsPauseFirst').addEventListener('click', () => { - dispatchMessage(firstVideoWindow, ACTIONS.PLAYER.PAUSE) - }) - - document.getElementById('jsPlayFirst').addEventListener('click', () => { - dispatchMessage(firstVideoWindow, ACTIONS.PLAYER.PLAY) - }) - - document.getElementById('jsSeekFirst').addEventListener('click', () => { - const currentTime = Number(document.getElementById('time').value) - dispatchMessage(firstVideoWindow, ACTIONS.PLAYER.TIME_UPDATE, { - currentTime, - }) - }) - - document - .getElementById('jsShowControllerFirst') - .addEventListener('click', () => { - dispatchMessage(firstVideoWindow, ACTIONS.PLAYER.SHOW_CONTROLLER) - }) - - document - .getElementById('jsSetVolumeFirst') - .addEventListener('click', () => { - dispatchMessage(firstVideoWindow, ACTIONS.PLAYER.SET_VOLUME, { - volume: 0, - }) - }) + ) return () => { disposer.unsubscribe() } - }, []) + }, [iframeRefs]) + + const getFirstWindow = useCallback( + () => iframeRefs[0].current!.contentWindow!, + [iframeRefs] + ) return ( <>

本页面可以测试播放器在 iframe 中的效果,还可以测试跨窗口消息接口

-

场景 1:向一个视频发出暂停 / 播放指令

-

场景 2:一个视频开始播放时,暂停其他视频

-

场景 3:手动 seek

-

场景 4:显示进度条

-

场景 5:设置视频的音量

-
-