0

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 对象被渲染到页面,它使用对象中的 data 属性而不是 src 参数,但我认为这对于渲染 flash 对象是正确的。

我遇到的问题是,当我调用 FDMSLibrary.addInitializationCallback 函数时,桥似乎还没有准备好。

swf 文件告诉 javascript 已准备好使用。我很确定 swf 没有问题,因为我使用相同的 swf 和 javascript 库启动并运行了一个简单的测试页面,但没有任何其他 javascript、内容等的干扰。感觉就像 swf 没有被加载和“执行”,而 Firebug 似乎支持这一点,但我真的不知道为什么或我错过了什么。

如果您想查看 FABridge 的完整 javascript 库和 actionscript 源,您可以在 Adob​​e 的 subversion repo 中找到它们:fds ajax bridge repo path

在此先感谢您的帮助

4

3 回答 3

1

不确定,但您可以尝试该afterrender事件而不是render. 正如它在渲染周期的后期发生的那样(好吧,在它之后:)它可能会有所帮助 - 我知道过去在组件的某些部分实际完成渲染之前渲染触发存在问题(这就是 afterrender 事件的原因后来添加)。

如果这不起作用,另一件事可能是尝试稍微推迟您的 initBridge 功能。这有点牵强,但我之前见过这样的情况,即 JS 执行存在时间问题,或者可能是一些导致这种症状的阻塞。延迟代码既会延迟其执行,又会在新线程上执行,这可能会解决问题。不是最好的解决方案,但我已经以这种方式解决了几个浏览器怪癖。例如:

initBridge : function () {
    (function(){
        FDMSLibrary.addInitializationCallback("flash", this.initPolling);
        FABridge.addInitializationCallback("flash", FABridge_ready);
    }).defer(500, this);
}

至少这可以确认它是否是时间/阻塞问题。您可以向上或向下调整 500 (ms) 以查看您是否遇到任何行为差异。

于 2010-01-29T21:01:18.493 回答
0

@bmoeskau:感谢您的有用建议。

根据您的建议再次查看我的代码,我意识到了一些事情。

首先是我在错误的文件中进行了更改。我制作了一个独立版本,但不小心编辑了这些文件,而不是 ext.js 应用程序。

其次,由于所有的变化、测试和一般的混乱,我已经设法重载了我的一些函数,这意味着调用了错误的函数。无论我如何更改我正在查看的函数,它都不会被调用。

上面的代码实际上按说明工作。

于 2010-02-01T10:02:20.120 回答
0

只是为了整理一下:

由于Firefox 错误和 swfobjects(Ext.Flashcomponent 的底层库),我遇到了持续的问题。我最终不得不将 FDMSLib load() 函数中的原始 html 推送到 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 使用“嵌入”标签,并且由于 swfobject 没有插入“嵌入”标签,这也可能导致问题。

除此之外,Ext.Flashcomponent 的 flashParams 属性在所需参数上引用了此 adobe 技术说明。这表明仅包含 Flash 对象的对象必须包含参数“电影”。swfobject 强制删除任何名为“movie”的参数。

用这个在任何地方都没有什么乐趣!

于 2010-02-03T12:18:49.640 回答