Flex-AJAX桥的FDMSLib有一个加载函数,可以将flash对象呈现给调用它的页面。这会导致使用Ext.JS时出现问题,因为插入的对象可能会被另一个渲染函数丢弃,或者在渲染页面时导致冲突,所以我试图重写加载函数以便它的Ext.JS(可能还有其他) JS框架)友好。
这是原始功能。
FDMSLibrary.load = function(path, callback)
{
var result = "<object id='_fesLib' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' \
codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,5,0,0' \
height='1' width='1'> \
<param name='flashvars' value='bridgeName=flash'/> \
<param name='AllowScriptAccess' value='always'/> \
<param name='src' value='"+ (path != undefined ? path : "") + "'/> \
<param name='wmode' value='transparent' /> \
<embed name='_fesLib' pluginspage='http://www.macromedia.com/go/getflashplayer' allowScriptAccess='always'\
src='" + (path != undefined ? path : "") + "' height='1' width='1' flashvars='bridgeName=flash'/> \
</object>";
document.write(result);
// todo:need a callback and variable here so you can keep track that both the fabridge and the fdmsbridge are available
FDMSLibrary.addInitializationCallback("flash", callback);
// register for call back when the FABridge has completed initialization
FABridge.addInitializationCallback("flash", FABridge_ready);
}
我已将此替换为以下内容:
loadFDMSBridge: function(path,callback) {
var FABridgeSWF = new Ext.FlashComponent({
id : '_fesLib',
height: '1',
width: '1',
flashVars : {
bridgeName:'flash'
},
wmode : 'transparent',
flashVersion : '8.5.0.0',
renderTo : Ext.getBody(),
url : path,
listeners : {
'render' : {
fn : this.initBridge,
scope : this
}
}
});
},
initBridge : function () {
FDMSLibrary.addInitializationCallback("flash", this.initPolling);
FABridge.addInitializationCallback("flash", FABridge_ready);
}
flash对象呈现给页面,它使用object中的data属性而不是src param,但我认为这对于渲染flash对象是正确的。
我遇到的问题是,当我调用FDMSLibrary.addInitializationCallback函数时,看起来桥已经就绪。
swf文件告诉javascript它已准备好使用。我很确定swf没问题,因为我有一个简单的测试页面并使用相同的swf和javascript库运行,但没有任何其他javascript,内容等的任何干扰。有点像瑞士法郎没有被加载和“执行”,Firebug似乎支持这一点,但我真的不知道为什么或我错过了什么。
如果您想查看FABridge的完整javascript库和actionscript源,可以在Adobe的subversion repo中找到它们:fds ajax bridge repo path
提前感谢您的帮助
答案 0 :(得分:1)
不确定,但您可以尝试afterrender
事件而不是render
。正如稍后在渲染周期中发生的那样(好吧,在它之后:)它可能会有所帮助 - 我知道在某些组件的某些部分实际上完成渲染之前,过去一直存在渲染问题(这就是后来添加了后来事件的原因)。
如果不起作用,另一件事可能是尝试稍微推迟initBridge功能。这有点延伸,但我已经看到过以前的情况,其中存在JS执行的时间问题,或者可能是导致此类症状的一些阻塞。推迟你的代码将延迟执行并在新线程上执行它,这可以解决问题。不是最好的解决方案,但我通过这种方式解决了几个浏览器问题。 E.g:
initBridge : function () {
(function(){
FDMSLibrary.addInitializationCallback("flash", this.initPolling);
FABridge.addInitializationCallback("flash", FABridge_ready);
}).defer(500, this);
}
至少这可能会确认它是否是时间/阻塞问题。您可以向上或向下调整500(ms)以查看是否有任何不同的行为。
答案 1 :(得分:0)
@bmoeskau:感谢有用的建议。
再次根据您的建议查看我的代码,我意识到了一些事情。
首先是我在错误的文件中进行更改。我做了一个独立的版本,不小心编辑了那些文件而不是ext.js应用程序。
其次,随着所有的变化,测试和一般的混乱,我设法使我的一些函数重载,这意味着调用了错误的函数。无论我改变了多少我正在看的功能它从未被调用过。
上述代码实际上如上所述。
答案 2 :(得分:0)
只是整理一下:
我继续提出Firefox bug and swfobjects(Ext.Flashcomponent的底层库)的问题。我最终不得不将原始html从FDMSLib load()函数推送到DOM而不是使用Ext对象。
// spec up the flash object for FABridge
var foSpec = {
tag : 'object',
id : '_fesLib',
classid : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
codebase: 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,5,0,0',
height :'1',
width : '1',
cn : [
{tag:'param', name:'flashvars', value:'bridgeName=flash'},
{tag:'param', name:'AllowScriptAccess', value:'always'},
{tag:'param', name:'src', value:path},
{tag:'param', name:'wmode', value:'transparent'},
{tag:'embed', name:"_fesLib", pluginspage:'http://www.macromedia.com/go/getflashplayer', allowScriptAccess:'always', src:path, height:'1', width:'1', flashvars:'bridgeName=flash'}
]
};
// Add it to the end of the body
Ext.getBody().createChild(foSpec);
我模糊地回忆起某个帖子,说FABridge使用“embed”标签,因为swfobject没有插入“嵌入”标签,这也可能导致问题。
除此之外,Ext.Flashcomponent的flashParams属性在所需的参数上引用this adobe technote。这表明只包含flash对象的对象必须包含param“movie”。 swfobject强行删除任何名为“movie”的参数。
在任何地方都没有多少乐趣!