无需嵌入即可在 Flash 和 JavaScript 之间进行通信

It is possible to Communicate Between Flash and JavaScript without embedding

我发现这个很酷的 file-upload repo by mailru,它叫做 FileAPI。 FileAPI 使用 .swf 文件作为调试工具。在不嵌入 .swf 文件的情况下如何工作?

他们可以使用文件 API。不要将它与 Mail.ru 库的名称混淆。请参阅此链接: https://developer.mozilla.org/en/docs/Web/API/File https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest#sendAsBinary()

How this works without embedding the .swf file??

他们似乎在动态更新 html 页面(现在嵌入了 SWF)。这意味着使用 innerHTML 生成新内容,这些内容最初是 而不是 在 html 文件中编码的。您可以在此处查看基本指南 about innerHTML

查看 FileAPI.js, onwards from line 3590 我们发现他们确实使用 innerHTML 来嵌入 Flash 对象。当触发右 Javascript 函数时,它会(动态地)嵌入。

他们的代码的一些简短片段如下:

/**
 * Publish flash-object
 *
 * @param {HTMLElement} el
 * @param {String} id
 * @param {Object} [opts]
 */
publish: function (el, id, opts){
    opts = opts || {};
    el.innerHTML = _makeFlashHTML({
          id: id
        , src: _getUrl(api.flashUrl, 'r=' + api.version)
        //, src: _getUrl('http://v.demidov.boom.corp.mail.ru/uploaderfileapi/FlashFileAPI.swf?1')
        , wmode: opts.camera ? '' : 'transparent'
        , flashvars: 'callback=' + (opts.onEvent || 'FileAPI.Flash.onEvent')
            + '&flashId='+ id
            + '&storeKey='+ navigator.userAgent.match(/\d/ig).join('') +'_'+ api.version
            + (flash.isReady || (api.pingUrl ? '&ping='+api.pingUrl : ''))
            + '&timeout='+api.flashAbortTimeout
            + (opts.camera ? '&useCamera=' + _getUrl(api.flashWebcamUrl) : '')
            + '&debug='+(api.debug?"1":"")
    }, opts);
},

... etc etc etc ...