发新话题
打印

[分享] Object.watch的“另类”用法

Object.watch的“另类”用法

  前段时间我写了两篇关于SWF跟HTML结合的相关资料,HTML与FLASH之间的“静态”传值JavaScript与Flash的通信,其中提到了使用Object.watch来完成JS与AS的通信,但没有详细给出实例,因为在FLASH PLAYER8.0以上播放器里用ExternalInterface来完成JS与AS的通信更便捷,没必要使用这种另类的方法了,除非你的应用要兼顾低版本浏览器。

  承蒙闪吧版主zszen关注,对我所说的Object.watch使用感兴趣,那我就专门对它的使用做个整理,虽然结合了比较老的JS方法SetVariable,而且个人感觉比较怪怪的,但确实有效。大家也可以当作一个思路的扩充,首先看一下演示

  其实实现道理很简单,利用SetVarible来更改AS中的一个变量,然后SWF中通过侦测变量的改变来判断JS的操作,进而执行相应的AS函数。只是这里的侦测变量没有用onEnterFram和setInteval,而是用了Object对象的watch方法。这是AS官方文档对此方法的解释:

watch(Object.watch 方法)
public watch(name:String, callback:Function, [userData:Object]) : Boolean
  注册当 ActionScript 对象的指定属性更改时要调用的事件处理函数。当该属性发生更改时,用 myObject 作为包含对象调用此事件处理函数。

  演示实例中的AS代码如下:
复制内容到剪贴板
代码:
//定义需要监视对象
var lis_obj:Object = new Object();
//定义监视变量
lis_obj.op_status = "init";
//监视变量
lis_obj.watch("op_status",doOperation);
//定义回调函数
function doOperation(prop:String,oldVal:String,newVal:String){
//接收监视的变量名
//trace(prop);
//接收改变前的变量值
//trace(oldVal);
//接收改变后的变量值
//trace(newVal);
//通过判断改变的值来执行下面的操作
if(newVal=="run"){
s_txt.text = "你点击了run按钮!"
}
else if(newVal=="walk"){
s_txt.text = "你点击了walk按钮!"
}
else if(newVal==oldVal){
s_txt.text = "你什么都没做!"
}
else{
s_txt.text = "你干了什么?"
}
//可是用unwatch删除对变量属性的监视
//lis_obj.unwatch(prop);

}  HMTL关键代码:
复制内容到剪贴板
代码:
//定义一个JS函数
function doAction($s){
if(document.swf){
window.document.swf.SetVariable("lis_obj.op_status", $s);
}
}
//按钮调用JS函数来更改SWF中的变量
<input type='button' value='Run' onclick="doAction('run');"/>
<input type='button' value='Walk' onclick="doAction('walk');"/>

  
我的Blog空间 = Simple Life=  [http://www.v-sky.com]

TOP

54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

doOperation函数中,最后加个
return newVal
这是个回调函数
寻觅终生伴侣!

my blog

TOP

引用:
原帖由 ycccc8202 于 2007-6-11 11:48 发表
doOperation函数中,最后加个
return newVal
这是个回调函数
嗯 加个返回值是标准点 :)不过这里只是做为状态表示,其实就算返回了undefiend也不影响
我的Blog空间 = Simple Life=  [http://www.v-sky.com]

TOP

我正要找这个

TOP

这个是属于object底层的处理模式 效率应当很高
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

引用:
原帖由 zszen 于 2007-6-11 17:30 发表
这个是属于object底层的处理模式 效率应当很高
对于效率这个问题我也一直在思考,没有考证过,所以说他是个另类用法 :)
我的Blog空间 = Simple Life=  [http://www.v-sky.com]

TOP

发新话题