2013-04-08 60 views
4

可能的'__flash__removeCallback' is undefined when deleting DOM element with Youtube iframe__flash__removeCallback是IE9不确定的错误,同时去除DOM元素

重复我通过一些网站去,但不能发现的,为什么YouTube的同时除去YouTube的iframe和DOM元素抛出该异常的精确解什么是解决方案?

一些解决方案,我有如下:

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

2. $('#youtube iframe').attr('src', ''); $('#youtube').remove() - >我已经尝试过,但不会工作。

3.隐藏iframe前删除父元素 - >将无法正常工作。

请帮我解决这个问题。

+0

请帮忙吗? – 2013-04-10 15:19:10

回答

3

这似乎是一个IE9的错误。

当Flash对象使用JavaScript(Flash/ActionScript端的ExternalInterface)与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”就好这BTW)将得到视频播放器关闭您的网页,没有抛出任何_ 闪光灯 _remove ..警告。

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

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

虽然我记得从前一个项目中,这让我们发疯(上下文是一个单页面的界面,动态地添加和删除视频),并且我们使用AS3 YT代码编写了我们自己的Flash Player后备。这是多么恼人的。

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导致内存泄漏。

0

这在IE9中适用于我。

$(window).unload(function() { 
     jwplayer('video1').stop(); 
     jwplayer('video1').remove(); 
     $(window).remove(); 
    }); 
0

您也可以通过用自己的覆盖函数修复Flash的回调移除函数。这个问题不仅仅与视频应用程序有关。在下面的例子中,我在页面被卸载之前覆盖它,但它可能在swf加载后随时发生。

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