【问题标题】:Opera does not call Flash's ExternalInterface.callback() function inside js callback called by flashOpera 不会在 flash 调用的 js 回调中调用 Flash 的 ExternalInterface.callback() 函数
【发布时间】:2013-05-09 19:12:42
【问题描述】:

我是 Flash ActionScript 的新手。我有一个以 WAV 格式录制音频的闪存录音机(修改为 jRecorder),并且我添加了对 MP3 编码的支持。记录器使用 ExternalInterface.callback() 为 JS 导出一些公共函数,并且还使用 Flash 容器(网站)中的 ExternalInterface.call() 调用 JS 回调。当从 JS 调用 flash 导出函数以开始录制/编码/其他函数时,flash 中的函数也会调用 JS 回调事件处理程序来处理事件,例如,recording_started、recording_stopped、encoding_started、encoding_ended 等。它在 IE、FF、Chrome 中工作正常但不是在 Opera 中。

我在一个web项目中使用过如下-

-> 录制时间最长为 2 分钟,当用户停止录制(按钮)或达到时间限制时录制会停止。对于这两种情况,都会触发“recording_stopped”事件,并在该事件处理程序中调用 mp3 编码函数(一个 flash 导出函数)。

-> 这里,JS事件处理函数被flash调用,在tern调用flash导出函数。

问题是,在 opera 中,导出的 flash 函数没有在处理程序内部调用。如果在处理程序的末尾调用该函数,则执行该函数上方的所有代码,但不执行该函数,如果我将该函数放在处理程序的开头,则不会执行其下方的代码。并且控制台中没有显示 JS 错误。但是,如果我从不是 Flash 的回调事件处理程序的 JS 函数调用它,则该函数可以正常执行。

我已经在两台不同的计算机上进行了测试,分别是 Opera 版本 11.51 和 12.15 以及 Flash 播放器版本 11.3、11.6 和 11.7。

我的opera版本是12.15,flash player版本是11.7(适用于所有浏览器)。

为什么会这样?

【问题讨论】:

  • @ShivanRaptor 您所说的两个链接与我的情况不同。首先,回调是由 flash 调用的,但它不会在回调中执行其导出的函数。其次,问题与我的不相似。
  • 我认为重复的问题符合您的问题,因为 Opera 根本不执行 ExternalInterface.call。在 Opera 中通过此 ActionScript 方法调用的任何函数都会失败。

标签: javascript actionscript opera flash


【解决方案1】:

我找到了一种在输入此问题时忽略此问题的方法。解决方案是,我不是直接从事件处理程序调用 flash 导出函数,而是使用 JS 的 window.setTimeout() 函数来调用它,例如 -

window.setTimeout(function(){
    if($.jRecorder.encodeToMp3())
      isEncoding = true;                
}, 0);

我不确定为什么会这样。 @Raptor 评论了这个问题的原因,可能是这个原因,也可能是其他原因。

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多