2010-11-14 66 views
1


我有一个嵌入swfobject的简单页面。
看起来像IE在嵌入式对象上的“过滤器”属性有问题。
我的测试页面看起来像这样:IE重新加载嵌入swfobject页面时抛出'未指定的错误'

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>test</title> 
    <script type="text/javascript" src="../scripts/swfobject.js"></script> 
    <script type="text/javascript" src="../scripts/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript"> 
     var url = ""; 
     $(function() 
     { 
      var flashvars = {}; 
      var parameters = {}; 
      var attributes = {}; 
      flashvars["data-file"] = url; 
      parameters.wmode = "transparent";  
      swfobject.embedSWF("test.swf", "graph1", "100%", "100%", "9.0.0", "expressInstall.swf", flashvars, parameters, attributes); 
     }); 
    </script> 
    <style type="text/css"> 
     #graph1 
     { 
      margin:30px; 
      height: 400px; 
      width: 600px; 
     } 
    </style> 
</head> 
<body> 
    <div id="graph1"></div> 
</body> 
</html> 

注:test.swf文件是从download page一个SWFObject的包。

现在,当我重新加载页面时,它会在IE上引发'未指定的错误',但不会在Firefox中将其filters属性设置为undefined

,似乎会导致错误的代码是在swfobject.js V2.2(行494-504):

/*! SWFObject v2.2 <http://code.google.com/p/swfobject/> 
    is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/ 


function removeObjectInIE(id) { 
     var obj = getElementById(id); 
     if (obj) { 
      for (var i in obj) { 
       if (typeof obj[i] == "function") { 
        obj[i] = null; // when (i == 'filters') we get the error 
       } 
      } 
      obj.parentNode.removeChild(obj); 
     } 
    } 

没有人有任何想法,为什么这可能发生?

回答

0

我没有一个想法,为什么出现这种情况,但你可以尝试用一个try/catch

try{obj[i] = null;}catch(e){} 

此修复程序应该避免的错误消息。

+0

我现在的解决方案是一致的。我不喜欢它。无论如何感谢:) – kfiroo 2010-11-14 23:48:46

+0

是的,当然这是更多的化妆品,而不是一个真正的bugfix。 – 2010-11-15 06:55:08

2

两件事情,立即引起了我的注意:

第一: 你包裹在一个jQuery的“美元”声明的匿名函数(包含SWFObject的代码)。 jQuery美元函数“接受一个包含CSS选择器的字符串,然后用它来匹配一组元素。”

你的函数不会返回任何东西,所以当jQuery尝试使用空引用作为CSS选择器时,会导致JavaScript错误。 swfobject.embedSWF也不会返回值,所以最好从代码中删除jQuery美元函数。

如果你只是想你的代码在一个匿名函数冒,滴之$并在末尾添加一个函数调用:

(function() 
    { 
     var flashvars = {}; 
     var parameters = {}; 
     var attributes = {}; 
     flashvars["data-file"] = url; 
     parameters.wmode = "transparent";  
     swfobject.embedSWF("test.swf", "graph1", "100%", "100%", "9.0.0", "expressInstall.swf", flashvars, parameters, attributes); 
})(); 

二: 你传递一个Flash变数变量名包含连字符,这在JavaScript和ActionScript中都是非法的。

最后,removeObjectInIE(子函数swfobject.removeSWF)已在IE 6,7和8中进行了全面测试。由于IE9仍处于测试阶段,因此swfobject尚未正式支持它。但是,我们不预期任何问题。我建议尝试我上面提到的编辑,看看它是否清除你的问题。

+0

感谢您的评论。我会检查是否删除美元符号,并让你知道。请注意,这个页面只是一个简单的测试页面,我试图寻找那个神秘的bug的来源。在我的主站点上嵌入不会发生在docReady方法内,这使我认为它不是问题的原因。至于非法的连字符,它是我们正在使用的组件所必需的开放式flash图表,这也使我认为它不应该导致浏览器将过滤器prop设置为例外。再一次,谢谢,我很快就会回复。 – kfiroo 2010-11-14 23:47:54

+0

我明白了。我不确定你的页面是如何设置的,但仅供参考swfobject.embedSWF有一个自动'domready'函数,所以你不需要使用jQuery的$(document).ready。使用jQuery的$(document).ready与swfobject.embedSWF不会导致任何错误,但它会是多余的。 – pipwerks 2010-11-15 01:09:05

+0

+1函数调用并不总是包装一个函数在'美元'是伟大的提示 – amelvin 2011-05-16 09:23:59