2

在使用 swfobject.embedSwf 将动态加载的 SWF 嵌入到 IE 6、7、8 中的 HTML 表单中时,我遇到了无穷无尽的问题。

针对该问题提出的所有手动解决方法都涉及从窗口对象创建对 Object DOM 元素的引用。例如:

window[id] = document.getElementById(id);

其中 id 是 swf 对象 dom 元素的 id。就我而言,我无法设置window[id]为 swf 对象 ID,因为它尚未创建!

swfobject 中导致 javascript 错误的行是:

el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';

当 SWF 电影设置其 Javascript 外部接口时,它会尝试访问 window[id]。因为这不存在,所以它失败了。

如果我应用上面提到的解决方法并填充window[id]被 embedSwf 替换的 DOM 元素,它仍然会失败,因为它试图在 div DOM 元素而不是对象 DOM 元素上调用 Flash 特定方法。

我发现这个问题自 Flash 8 和 IE6 以来一直没有得到解决,这让我感到很惊讶!

4

1 回答 1

2

我不确定你在哪里遇到问题。ExternalInterface 和 SWFObject 在 IE6/7/8 中工作得很好。见这个例子(例子的解释在这里

当您说“在表单中嵌入 swf”时,您到底想做什么?如果您将 swf 嵌入到 div 中,那么 div 是在表单中还是在正文中的任何其他位置都无关紧要。

是表单中的 SWF 示例

至于 window[id],这是一种已弃用的方法,应由 document.getElementById(id) 代替。许多旧的 Flash 教程/文档都说在使用 ExternalInterface 时使用 window[id],但是现在可以安全地忽略这个建议,因为每个主要浏览器都支持 W3C 标准 document.getElementbyId。这包括 IE6/7/8、Firefox、Safari/Webkit、Opera 等。

至于在试图找到它之前存在的元素,这是一个时间问题。SWFObject 在 domready/onload 中嵌入 SWF,这意味着在 SWF 加载之前不应尝试调用 ExternalInterface。您可以通过将您正在编写的任何代码放在 domready 函数中来做到这一点:

swfobject.addDomLoadEvent(function (){
  //safe to execute code on your embedded SWF in here
});

SWFObject 2.2 有一个新的回调功能,可让您在嵌入 SWF 后立即调用函数。Bobby Van der Sluis 有一个示例,您可以在 上“查看源代码”SWFObject API 文档涵盖了它的用法。

希望有帮助

--菲利普

于 2009-07-01T03:53:37.407 回答