actionscript javascript 用ExternalInterface绑定接口
看了一些介绍的帖子,都提到as js加载顺序会导致一些问题
好像一般都是默认js会大大快于as加载,而且在html中js先于as描述,
所以as调js问题不大,保证as调js是两者都已加载(说明,俺对“加载”也不甚清楚滴)
反过来的话,由于flash加载慢,js调as可能会报错
解决的笨办法是设定延时,多少毫秒之后js才调as,保证as已加载就绪。
还有,就是从as出发,调js(意思是保证flash加载吧),再从js反调as,绕路完成js调as。
还有人用轮循,轮循看不懂,等会贴上来。
问:js和as加载完成,有什么标志性的事件或者条件可以测试,来确认加载吗?
或者整个页面加载完成,用啥测试确认吗?
---------------------------下面就是js调as例子--------------
----------但匿名函数和轮循哪块看不懂,轮循貌似只能做一次啊,如果当时不满足,下次轮循怎么发起啊,获得as和js加载完毕是什么啊?-------------
javascript到flash
这个才是本文的重点,简单来说,就是在flash里绑定js事件,不过要在浏览器和各种页面加载情况下实现这个功能
有以下几点注意事项,缺一不可.
flash里:ExternalInterface.addCallback("j2s_callback",this, j2s_callback);
function j2s_callback(_p)
{
trace(_p);
}
复制代码js里,首先要获得对flash元素的引用,考虑到不同浏览器,需要对object和embed标签都赋予不同的id,然后判断浏览器类型,通过getElementById来获取ref.然后通过ref.j2s_callback来调用flash内方法.
所以,大致的代码会是这样:var swf_id = "swf_" + (isIE ? "ie" : "other");
var ref = document.getElementById(swf_id);
复制代码而html里 object 标签和 embed 标签对应的 id 属性分别是 "swf_ie" 和 "swf_other";
注意:
1.当flash和页面跨域时候,flash里需要加入允许js添加callback的安全许可:System.security.allowDomain("域");
复制代码2.由于各个浏览器的缓存机制和页面加载机制都不同,所以不要指望flash在addCallback执行的时候确实相应的js程序已经定义了,如果没有的话,addCallback是不会成功的.
所以,可以设个轮循来检测页面是否初始完成:this.onEnterFrame = function()
{
if (ExternalInterface.call("s2j_check"))
{
ExternalInterface.addCallback("j2s_callback",this, j2s_callback);
this.onEnterFrame = null;
}
};
复制代码现在你以为这段代码完美了吧?其实有很大问题,当s2j_check函数未定义的时候,网页是会报错的.所以还需要将上述代码中轮循js的那一行改为:if (ExternalInterface.call("function(){try{if(s2j_check()=='ok'){return true;}}catch(ex){}}"))
复制代码这样用一个匿名函数去try就万无一失了,什么设个间隔,等几百毫秒再去加载之类的方法就千万别再用了.
页面:function s2j_check()
{
return "ok";
};
function j2s_callback()
{
//to do 调用flash;
};
复制代码这样,就可以保证addCallback之前函数已经被初始化完毕.
还有什么遗漏的欢迎补充.
--
修改:SlANmASTer FROM 211.99.222.*
FROM 211.99.222.*