4

使用 Youtube iframe 删除 DOM 元素时,可能未定义“__flash__removeCallback”的副本

我浏览了一些网站,但找不到确切的解决方案,为什么 youtube 在使用 youtube iframe 删除 dom 元素时抛出此异常,解决方案是什么?

我得到的一些解决方案是:

  1. ytplayer.getIframe().src='';-> 我不知道这如何解决我的问题?

2. $('#youtube iframe').attr('src', ''); $('#youtube').remove()-> 我试过这个,但没有用。

3.在删除父元素之前隐藏 iframe -> 不起作用。

请帮我解决这个问题。

4

4 回答 4

3

这似乎是一个仅限 IE9 的错误。

当 Flash 对象使用 JavaScript(Flash/ActionScript 端的外部接口)与 HTML 文档交互时,会发生这种情况,并且当包含带有 Flash 对象的 HTML 文档的 IFRAME 发挥作用时,它会抬起丑陋的脑袋。

看到您如何指定您正在使用 YouTube API,遗憾的是,您无法确保 Flash 取消注册自身并且不会调用 JavaScript 函数(反之亦然),因为您依赖第三方来删除它在您的应用程序域之外运行的软件。

如果您不需要 YouTube API,而只是在应用程序中获取视频的快速方法,那么最安全的选择是使用为 IE9 嵌入的旧样式对象和用于其他理智世界的 API / IFRAME 嵌入。

<object width="{WIDTH}" height="{HEIGHT}">
  <embed src="https://www.youtube.com/v/{VIDEO_ID}?version=3&autoplay=1"
         type="application/x-shockwave-flash"
         allowscriptaccess="always"
         width="{WIDTH}" height="{HEIGHT}"></embed>
</object>

删除上面的对象(您可以使用 SWFObject 的“embedSWF”和“removeSWF”就可以了)将使视频播放器离开您的页面,而不会引发任何_flash _remove .. 警告。

如果您需要 YouTube API / 控制视频播放器状态:

您是否尝试过在 ytplayer 上调用“销毁”方法?取消销毁,虽然我不愿意使用超时发布“答案”,但在将 iframe 的源设置为空字符串(以便文档卸载)之前,给 Flash 对象一些时间来取消注册,然后清除 iframe 或者它是父容器。

虽然我记得在之前的一个项目中,这让我们发疯了(上下文是一个动态添加和删除视频的单页界面),我们求助于使用 AS3 YT 代码编写自己的 Flash 播放器后备。这就是它有多烦人。

于 2013-04-13T17:31:28.757 回答
1

下面的代码应该适用于所有浏览器(并且不会产生您上面描述的 IE9/IE10 错误)。

function playVideo() {
    $('#video iframe').attr('src', 'http://www.youtube.com/embed/VIDEO_ID_HERE');
    $('#video iframe').fadeIn();
}

function stopVideo() {
    $('#video iframe').attr('src', '');
    $('#video').fadeOut();
}

最终结果是单击按钮时将加载的视频,并且将安全地删除视频而不会导致 IE9/IE10 中的内存泄漏。

于 2013-06-05T16:28:04.247 回答
0

这在 IE9 中对我有用。

 $(window).unload(function() {
        jwplayer('video1').stop();
        jwplayer('video1').remove();
        $(window).remove();
    });
于 2013-08-26T21:43:54.800 回答
0

您还可以通过自己的覆盖来修复 Flash 的回调删除功能。此问题与视频应用程序无关。在下面的示例中,我在页面卸载之前覆盖它,但它可以在 swf 加载后的任何时间发生。

window.onbeforeunload = function () { this.__flash__removeCallback = function (instance, name) { if (instance == null) return; // <-- this line prevents the error instance[name] = null; } }

于 2014-04-24T17:36:29.030 回答