0

嘿,所以我有一堆麻烦让ExternalInterface工作,这很奇怪,因为我经常使用它。ExternalInterface

我希望这是我错过了,因为我一直在看它太久了。

flash_ready函数正确地返回objectID,并且据我所知,其他所有内容都是按顺序排列的。

不幸的是,当我运行它时,我得到一个错误(通过浏览器变化)告诉我,基本上document.getElementById(<movename>).test()不是一个有效的方法。

下面的代码:

的javascript:

function flash_ready(i){ 
    document.getElementById(i).test('success!'); 
} 

嵌入HTML(生成):

<script type="text/javascript"> 
    swfobject.embedSWF("/chainmaille/includes/media/flash/upload_image.swf", "/chainmaille/includes/media/flash/upload_image", "500", "50", "9.0.0","expressInstall.swf", {}, {allowScriptAccess:'always', wmode:'transparent'},{id:'uploader_flash',name:'uploader_flash'}); 
</script> 
<object type="application/x-shockwave-flash" id="uploader_flash" name="uploader_flash" data="/chainmaille/includes/media/flash/upload_image.swf" width="500" height="50"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object> 

AS3:

package com.jesseditson.uploader { 

    import flash.display.MovieClip; 
    import flash.external.ExternalInterface; 
    import flash.system.Security; 

    public class UI extends MovieClip { 

    // Initialization: 
    public function UI() { 
     Security.allowDomain('*'); 
     ExternalInterface.addCallback("test", test); 

     var jscommand:String = "flash_ready('"+ExternalInterface.objectID+"');"; 
     var url:URLRequest = new URLRequest("javascript:" + jscommand + " void(0);"); 
     navigateToURL(url, "_self"); 
    } 

    public function test(t){ 
     trace(t); 
    } 
    } 
} 

正在通过谷歌代码包括SwfObject的和th闪光灯嵌入得很好,所以这不是问题。

我有一个非常类似的设置工作在另一台服务器,但似乎无法得到它在这一个工作。这是一个Hostgator共享服务器。它可能是服务器的错?有人看到任何明显的语法问题?

提前致谢!

+0

也不会是,在调用'测试(t)的时间'没有定义? – 2010-04-29 09:46:25

+0

那么,在加载flash之前不会调用test(t),因为flash_ready()函数是从flash本身调用的。不知道这是否有道理,但这里是流程: UI实例化 - >构造函数(UI) - > flash_ready()调用 - > test()调用 因此,闪存本质上通过JavaScript调用测试函数,所以测试必须定义。是吗? – Jesse 2010-04-29 10:03:59

+0

它是否在所有浏览器中都这样做?我有时会在IE中遇到一些我必须解决的问题。 – 2010-04-29 14:08:43

回答

1

好的,经过进一步调查,看起来闪存对象的多个实例存在问题,因为我将它克隆到了一个lightbox。我现在已经开始工作了。

0

是否flash_ready正在接收您期待的对象ID?

另外,为什么使用:

var jscommand:String = "flash_ready('"+ExternalInterface.objectID+"');"; 
var url:URLRequest = new URLRequest("javascript:" + jscommand + " void(0);"); 
navigateToURL(url, "_self"); 

当这样的设计做到这一点:

ExternalInterface.call("flash_ready", ExternalInterface.objectID); 
+0

flash_ready正在接收我期待的对象,至于使用调用方法,我刚刚补充说因为我之前取得了成功,所以这段代码是肯定的不完整,只要解决此问题,我会将呼叫转移到ExternalInterface。谢谢! – Jesse 2010-04-29 18:22:23

0

邮政源(预generatred)。当浏览器说[Flash] .Method不是函数时,99%的时间意味着您在.swf准备好之前尝试在Flash中调用函数。我看到你试图做到这一点,但显然它不工作,所以一定要关闭。所以发布你的预渲染源,我相信我们可以找到问题。

1

Flash尚未完成构建。你正在调用你的构造函数的回调函数flash_ready,所以JS在对象处于舞台前试图调用它。将您的flash_ready呼叫转移到例如Event.ADDED_TO_STAGE侦听器,并且它应该开始工作。

1

刚刚花了5个小时与此战斗。这真是令人沮丧。就我而言,解决方案非常简单,我从来没有猜到它。 因此,对于所有从未见过在您的浏览器中找到this link that walks you through the setup的文件上运行的Flash Player调试器的人,首先会产生一些神奇的体验:) 现在来我的ExternalInterface发现:在同一个域内存在沙箱违例。这意味着flash无法从yourdomain.com访问www.yourdomain.com。奇怪的是,你没有明确地使用ExternalInterface调用域。 无论如何,解决方案非常简单:将此添加到我的.htaccess文件,就是这样!

# Redirect non-www to www 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteRule (.*) http://www.youtdomain.com/$1 [R=301,L] 

希望这可以帮助别人