Twilio Video调用detach解绑track后残留video标签问题求助
问题原因
localVideoTrack.attach() 每次执行都会生成全新的video DOM节点,每次开启视频都会向目标div新增一个节点,而detach()方法仅解除视频轨道和DOM节点的绑定关系,默认不会删除已生成的DOM元素,多次启停后节点累加就会出现多余的空白块。
修复方案
1. 修改关闭视频逻辑,主动清理残留DOM
endvideo(){ if(this.localvideotrack != null){ let div = document.getElementById( this.videoclient.localParticipant.sid + 'vid'); // detach方法返回被解绑的video元素数组,直接批量移除 const detachedElements = this.localvideotrack.detach(div); detachedElements.forEach(el => el.remove()); // 兜底清空目标div所有子元素,避免漏删 while(div.firstChild) { div.removeChild(div.firstChild); } this.localvideotrack.stop(); this.videoclient.localParticipant.unpublishTrack(this.localvideotrack); // 重置存储track的变量,避免后续误操作旧轨道 this.localvideotrack = null; // 新增:取消设备订阅,避免内存泄漏 this.devicessubscription?.unsubscribe(); this.addremovevideohtml(this.videoclient.localParticipant.sid); } }
2. 可选:开启视频前先清空容器,避免残留
在startvideo方法最开头新增容器清空逻辑:
startvideo(){ let div = document.getElementById( this.videoclient.localParticipant.sid + 'vid'); // 启动前先清空容器所有内容 while(div.firstChild) { div.removeChild(div.firstChild); } // 原有逻辑不变 navigator.mediaDevices.getUserMedia({video: true}).then((stream)=>{ createLocalVideoTrack({ deviceId: stream.id }).then(localVideoTrack =>{ return this.videoclient.localParticipant.publishTrack((localVideoTrack)).then(publication =>{ this.localvideotrack = localVideoTrack; div.appendChild(localVideoTrack.attach()); this.removenovideohtml(this.videoclient.localParticipant.sid); this.mms.getDevicesOnComputer(); this.devicessubscription = this.mms.receiveDevices() .subscribe( (req: any)=>{ this.devicesoptions = req; } ); }); }); }); }
内容的提问来源于stack exchange,提问作者Christopher Jakob
相关产品推荐
相关产品推荐

