如何正确卸载/销毁VIDEO元素

spa*_*ey0 46 javascript jquery html5 dom memory-management

我正在开发一个实时媒体浏览/回放应用程序,它使用<video>浏览器中的对象进行回放(如果可用).

我正在使用直接javascript和jQuery的混合,

我关心的是记忆.应用程序永远不会在窗口中重新加载,并且用户可以观看许多视频,因此随着时间的推移,内存管理成为一个大问题.在今天的测试中,我看到内存配置文件按照每个后续加载流式传输的视频大小跳跃,并且永远不会回落到基线.

我尝试了以下相同的结果:

1 - 清空包含已创建元素的父容器,例如:

$(container_selector).empty();
Run Code Online (Sandbox Code Playgroud)

2 - 暂停并删除匹配"视频"的子项,然后清空父容器:

$(container_selector).children().filter("video").each(function(){
    this.pause();
    $(this).remove();
});
$(container_selector).empty();
Run Code Online (Sandbox Code Playgroud)

有没有其他人遇到这个问题,有没有更好的方法来做到这一点?

小智 78

从DOM结构中处理视频非常棘手.它可能会导致浏览器崩溃.这是帮助我完成项目的解决方案.

var videoElement = document.getElementById('id_of_the_video_element_here');
videoElement.pause();
videoElement.removeAttribute('src'); // empty source
videoElement.load();
Run Code Online (Sandbox Code Playgroud)

这会重置一切,保持沉默,没有错误!

以下是完整的细节和更好的解释http://www.attuts.com/aw-snap-solution-video-tag-dispose-method/

希望它能解决您的疑问.

  • 如果`src`设置为````,IE和Edge会向服务器发送请求,类似于`img`元素.应该删除该属性,[按照标准的建议](https://html.spec.whatwg.org/multipage/embedded-content.html#best-practices-for-authors-using-media-elements). (4认同)
  • `videoElement.load()`似乎是关键所以它可以在Firefox中运行. (2认同)

Ken*_*ler 17

据报道,这种"解决方案"可以正常工作,大概是因为它会使这些视频容器对象可用于垃圾收集(请参阅下面的说明,讨论为什么delete不应该有所作为).在任何情况下,您的结果可能会因浏览器而异:

$(container_selector).children().filter("video").each(function(){
    this.pause(); // can't hurt
    delete this; // @sparkey reports that this did the trick (even though it makes no sense!)
    $(this).remove(); // this is probably what actually does the trick
});
$(container_selector).empty();
Run Code Online (Sandbox Code Playgroud)

注意:毫无疑问,delete指定关键字只是为了从对象中删除属性(正如其他人在评论中指出的那样).thisdelete this上面的行之前和之后记录到控制台,每次都显示相同的结果.delete this应该什么都不做,没有任何区别.然而,这个答案继续获得涓涓细流的投票,人们已经报告说,省略delete this使其停止工作.也许某些浏览器JS引擎的实现方式delete很奇怪,或浏览器delete与jQuery正在做什么之间的异常交互this.

所以,请注意,如果这个答案解决了你的问题,那么如果它确实有效,那么就不清楚为什么会出现这种情况,而且出于各种原因它也可能停止工作.

  • `delete`语句根本不会做任何事情,因为它只删除属性.如果它被删除,我相信它将完全相同. (4认同)

Bis*_*nna 5

将视频重置为空白而不删除它

$("#video-intro").first().attr('src','')
Run Code Online (Sandbox Code Playgroud)

它停止了视频


Arn*_*der 5

delete(this); 
Run Code Online (Sandbox Code Playgroud)

不是一个解决方案。如果它适用于 x 或 y,则是浏览器的不当行为。在这里阅读:

delete 运算符从对象中删除属性。

事实是,当自动播放属性打开时,某些浏览器(例如 Firefox)会将视频缓冲区缓存在内存中。处理起来很痛苦。

从 DOM 中移除 video 标签或暂停它只会产生不稳定的结果。您必须卸载缓冲区。

var video = document.getElementById('video-id');
video.src = "";
Run Code Online (Sandbox Code Playgroud)

我的实验表明它是这样做的,但不幸的是,这是规范未完全指定的浏览器实现。您不需要在 src 更改后调用 load() 。更改视频标签的 src 时,您会在其上隐式调用 load(),W3C 规范中对此进行了说明。