在事件回调中获取播放器实例的方法咨询
解决多播放器实例的事件追踪问题
针对你遇到的多播放器实例事件追踪、以及没有getPlaying()方法的问题,给你几个实用的解决思路:
1. 绑定事件时直接关联播放器实例
在给每个播放器绑定事件(比如play、timeupdate)的时候,通过闭包、bind或者箭头函数把当前实例传递到回调里,这样回调里直接就能拿到触发事件的实例:
// 假设你动态创建播放器的逻辑 function createPlayer(videoInfo) { const player = new YourPlayerConstructor(videoInfo); // 用箭头函数保留实例引用 player.on('timeupdate', (data) => { // 这里直接能拿到当前触发事件的player实例 console.log('触发事件的播放器:', player); console.log('播放头位置:', data.position); // 直接获取视频详情 console.log('视频详情:', videoInfo); }); return player; }
如果用普通函数,可以用bind把实例作为回调的this:
player.on('timeupdate', function(data) { // this就是当前播放器实例 console.log('触发事件的播放器:', this); }.bind(player));
2. 通过事件对象的目标元素关联实例
如果你的播放器事件回调能拿到原生事件对象(部分播放器会传递),可以通过event.target或event.currentTarget找到对应的DOM元素,再通过预先绑定的标识(比如dataset)关联到你的播放器实例:
// 创建实例时给DOM元素加标识 function createPlayer(videoInfo) { const player = new YourPlayerConstructor(videoInfo); const playerDom = player.getDomElement(); // 假设播放器有获取DOM的方法 playerDom.dataset.playerId = videoInfo.id; // 把所有实例存在一个全局对象里 window.playerInstances = window.playerInstances || {}; window.playerInstances[videoInfo.id] = player; player.on('timeupdate', (data, event) => { const playerId = event.target.dataset.playerId; const currentPlayer = window.playerInstances[playerId]; console.log('触发事件的播放器:', currentPlayer); }); return player; }
3. 自己维护播放状态(替代getPlaying())
既然没有getPlaying(),可以监听每个实例的play和pause事件,自己维护一个状态映射表,随时能查到哪个实例在播放:
const playerPlayStates = {}; function createPlayer(videoInfo) { const player = new YourPlayerConstructor(videoInfo); const playerId = videoInfo.id; // 初始化状态 playerPlayStates[playerId] = player.getPaused(); // 更新播放状态 player.on('play', () => { playerPlayStates[playerId] = false; // 如果需要单例播放,这里可以暂停其他实例 // Object.values(window.playerInstances).forEach(p => p !== player && p.pause()); }); player.on('pause', () => { playerPlayStates[playerId] = true; }); // 随时可以查询状态 function isPlaying() { return !playerPlayStates[playerId]; } player.isPlaying = isPlaying; return player; } // 之后要查某个实例是否在播放,直接调用: // player.isPlaying(); // 或者查全局状态表: // const playingPlayers = Object.entries(playerPlayStates).filter(([id, paused]) => !paused);
内容的提问来源于stack exchange,提问作者maxxwv
相关产品推荐
相关产品推荐

