一、AS調用JS方法時出現同名方法(查看實例)
AS代碼如下:
import flash.external.*;
var v = ExternalInterface.available;
t_btn.onRelease = function (){
//調用JS函數
var s = ExternalInterface.call("say","JS函數調用成功!")
//調用AS本地函數
s += say("\n本地函數調用成功!");
r_txt.text = s;
}
//AS本地函數
function say(s){
return s;
}
HTML代碼:
//定義一個JS函數
function say(txt){
return txt;
}
可以看到在JS中定義了一個say方法供AS調用,現在我們在AS中定義了一個同名的say方法來驗證它們是否會出現覆蓋。結果證明它們不會覆蓋,都工作得很好。(PS:不錯~)
二、JS調用AS方法時出現同名方法(查看實例)
AS代碼如下:
//導入包
import flash.external.*;
//提供JS訪問的函數名
var _method:String = "say";
//指定本地函數中this變量的作用域,可設置為null留空
var e_area:Object = null;
//AS內部函數名
var method:Function = say;
//將函數注冊到容器列表
var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, method);
↑ 這里返回的void因此無法轉換為Boolean
//查看注冊是否成功
if(wasSuccessful){
result_txt.text = "函數注冊成功";
}
//本地的函數
function say(txt:String) {
result_txt.text = txt;
}
HTML代碼如下:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh_cn" lang="zh_cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>javascript 調用 flash 方法</title>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script src="AC_RunActiveContent.js" language="javascript"></script>
</head>
<body bgcolor="#ffffff">
<!--影片中使用的 URL-->
<!--影片中使用的文本-->
<!--
<p>你們好</p>
-->
<!-- saved from url=(0013)about:internet -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="550" height="400" align="middle" id="myFlash">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="flash讀取css.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /> <embed name="myFlash" swLiveConnect="true" src="flash讀取css.swf" quality="high" bgcolor="#ffffff" width="550" height="400" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
<SCRIPT LANGUAGE=JavaScript>
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function myFlash_DoFSCommand(command, args) {
var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
alert (args);
}
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
document.write(' call myFlash_DoFSCommand(command, args)\n');
document.write('end sub\n');
document.write('</SCRIPT\> \n');
}
</SCRIPT>
<script>
//定義一個JS本地函數
function say(s){
thisMovie("myFlash").say(s);
//↑這里的demo指的是使用Object插入flash的時候指定的id和embed指定的name,例如:id="demo"和name="demo"
alert(s);
}
//瀏覽器兼容訪問DOM,并且將 flash Object返回
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
</script>
<form name="www">
內容:<input type="text" name="sendText" maxlength="45" onChange="say(this.value)" >
</form>
</body>
</html>
可以看到在AS中定義了一個say方法供JS調用,現在我們在JS中定義了一個同名的say方法來驗證它們是否會出現覆蓋。結果證明它們不會覆蓋,都工作得很好。(PS:也不錯~)
通過上面的兩個例子我們可以得出結論在使用ExternalInterface時即使定義了同名方法,也不會造成方法覆蓋,你大可放心使用。
其余
============================================================
在論壇上經常看見有新手問到“我想讓FLASH得到URL中的參數ID號,該怎么辦?”“某某視頻網站的FLASH播放器是如何播放不同ID的視頻的?”...諸如此類問題看到了太多,每次都有一堆回帖,眾說紛紜,里面難免有誤導性質的回復。今天特結合自己平時工作中使用的心得對此類問題做一個小小的歸納。
我所指的
靜態傳值是區別于與服務端通信進行值傳遞的方式,例如LoadVars,XML,Remoting之類,后者暫且不在本文的討論范圍內,當你想讓FLASH獲取URL中的參數時,你為何不換個角度想了?其實我們可以讓服務端動態生成SWF的的插入代碼,主動將我們需要的參數“靜態”傳遞給FLASH,FLASH直接用就可以了,根本不需要自己去拿,而以何種形式傳遞給FLASH,就是我所指的靜態傳值。我知道的可行的HTML與FLASH之間的靜態傳值方法有三種:
- SWF地址后使用參數傳遞符“?”
- FlashVars傳遞
- JS控制
下面來具體介紹下這三種方式的傳遞是如何工作的:
一、SWF地址后使用參數傳遞符“?”
我們知道,在ULR地址中使用參數傳遞符“?”可以以GET方式傳遞參數,例如http://www.v-sky.com?uid=12&uname=vsky,這里使用了參數傳遞符“?”,同時使用了連接符“&”做為變量分隔標識,以這種規范的格式來傳遞兩個參數:uid=12和uname=vsky,那么服務端可以使用GET方式獲取這兩個值。
在FLASH中我們同樣可以采用類似的方式來傳遞參數,HTML頁面中插入SWF文件最常用的就是使用Object標簽和Embed標簽結合的方式,這也是Adobe的推薦方式:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="300" id="flashvars" align="center">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="demo.swf?uid=12&uname=vsky" />
<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="demo.swf?uid=12&uname=vsky" quality="high" bgcolor="#ffffff" width="400" height="300" name="flashvars" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
|
其中粗體部分對應的就是SWF文件的地址,那么我們可以在這個地址后面通過類似于URL中GET方式傳參的方法來個SWF傳遞參數,例如上面代碼在頁面完全加載完畢時,它已經給SWF文件寫入了兩個變量:uid=12和uname=vsky。
二、FlashVars傳遞
你可以查閱FLASH幫助文檔來看FlashVars的官方定義。其實在HTML語法中,這是一個被很多新手所忽視的屬性,同樣以上面的參數為例,下面用FlashVars來傳遞變量:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="300" id="flashvars" align="center">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="demo.swf" />
<param name="FlashVars" value="uid=12&uname=vsky" />
<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="demo.swf" FlashVars="uid=12&uname=vsky" quality="high" bgcolor="#ffffff" width="400" height="300" name="flashvars" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object> |
跟方式一相同,它也是直接給FLASH里添加了這兩個變量。但我個人推薦使用此方式,結合SWFObject的使用,使用FlashVars來傳遞變量有很多好處,例如代碼清晰,容易管理,瀏覽其兼容,符合標準。他們的結合使用在“為FLASH程序構造靈活的接口”一文中我已經做了介紹(PS:隨后我會提供一個復雜點的、有說服力的實際應用來說明這種靈活接口的使用)。
三、JS控制
對于客戶端頁面中的資源,JS通過DOM結構來控制它們可以說是隨心所欲的,FLASH也不例外,下面是Flash Player的Javascript方法一覽表:
Play() —————————————- 播放動畫
StopPlay()————————————停止動畫
IsPlaying()———————————– 動畫是否正在播放
GotoFrame(frame_number)—————- 跳轉到某幀
TotalFrames()——————————- 獲取動畫總幀數
CurrentFrame()——————————回傳當前動畫所在幀數-1
Rewind()————————————-使動畫返回第一幀
SetZoomRect(left,top,right,buttom)——-放大指定區域
Zoom(percent)——————————改變動畫大小
Pan(x_position,y_position,unit)————使動畫在x,y方向上平移
PercentLoaded()—————————-返回動畫被載入的百分比
LoadMovie(level_number,path)———– 加載動畫
TGotoFrame(movie_clip,frame_number)- movie_clip跳轉到指定幀數
TGotoLabel(movie_clip,label_name)—— movie_clip跳轉到指定標簽
TCurrentFrame(movie_clip)————— 回傳movie_clip當前幀-1
TCurrentLabel(movie_clip)—————–回傳movie_clip當前標簽
TPlay(movie_clip)—————————播放movie_clip
TStopPlay(movie_clip)———————-停止movie_clip的播放
GetVariable(variable_name)—————–獲取變量
SetVariable(variable_name,value)———–變量賦值
TCallFrame(movie_clip,frame_number)—call指定幀上的action
TCallLabel(movie_clip,label)—————-call指定標簽上的action
TGetProperty(movie_clip,property)——–獲取movie_clip的指定屬性
TSetProperty(movie_clip,property,number)———-設置movie_clip的指定屬性
|
在這里我們只需要使用的是粗體標識的SetVariable方法,JS通過調用此方法能夠直接更改SWF中的變量值。首先我們需要定義插入的SWF的ID,例如id為VskyDemo,那么我們可以通過下面的JS語句來完成SWF內部變量的設置:
window.document.VskyDemo.SetVariable("uid", 12); |
很簡單吧,就是這樣的。除非是涉及到了HTML中SWF之外元素跟它交互,否則我一般不使用JS來控制SWF里的變量,因為我總覺得怪怪的,呵呵,個人習慣吧。
多多實踐,不要覺得這些小東西不起眼,小東西多了,聚結到一起了就是一個大的應用。
條條大路通北京,選擇你自己喜歡的,自己認為便捷的方式就可以了,目前我是沒有發現這三個方式存在功能上的缺陷。
======================================================================================
前言、JavaScript和Macromedia Flash的通信示例
原文地址: http://www.macromedia.com/support/flash/ts/documents/java_script_comm.htm
說明: 略作修改,主要是一些很初級的操作; 又很多相似的文章,不過這個很權威
下面是一些在Flash和使用Javascript的HTML文件直接通信的示例,每個示例都有簡略的步驟
本文討論了3種基本的Flash/Javascript通信方式:
Javascript 到 Flash的通信----使用Flash播放器的javascript方法
Flash 到 Javascript的通信----使用Flash的fscommand
Flash 到 Flash的通信----------使用本地連接對象或綜合上2種技術
并不是所有的瀏覽器都很重視腳本.為了和Flash播放器通信,瀏覽器必須有內置的鉤子以便Flash播放器可以'監聽'.瀏覽器必須是下列的幾種:
Netscape Navigator 3.0-4.7x, 和 Netscape 6.2或更高
(Windows 95/98/NT/2000/XP 或 MacOS; 允許Java和LiveConnect)
Internet Explorer 3.0 或更高
(僅Windows 95/98/NT/2000/XP; 允許ActiveX)
注意:Macintosh上的Internet Explorer和早期版本的Netscape6不支持這種方法.請查看本文的附加信息
一、Javascript到Flash的通信
這個例子演示了如何使用Flash的method把變量從HTML的input text 發送到該頁面中的Flash文件中.HTML input的數據通過Flash的SetVariable方法傳送到Flash文件中.
查看示例:示例
下載源文件: javascript_to_flash.zip(17k)
步驟:
Flash中
1.新建一個文件,保存為javascript_to_flash.fla
2.用文字工具在舞臺上創建一個文本域
3.選擇這個文本域,在屬性面板中,從下拉列表中選擇動態文本(Dynamic Text),在變量(variable)欄填上"myVar"
注意:最好的習慣是使用Instance,用myVar.text更改myVar的值.為了簡單起見和兼容Flash4和Flash5,我們使用的是變量名的形式.
4.保存文件
5.發布HTML文件和SWF文件
Dreamweaver中
下一步的工作轉移到Dreamweaver中了,當然也可以是其他的HTML編輯器
1.打開上一步發布的HTML文件
2.插入生成的SWF文件和OBJECT/EMBED標簽
(1) Insert>Media>Flash,并選擇這個Flash
(2) 切換到代碼視圖,我們需要修改被選中的<OBJECT>和<EMBED>標簽
(3) 在OBJECT標簽中,插入id="myFlash"
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
注意:如果你是粘貼復制代碼的話,確保刪除不必要的換行.否則可能會引起錯誤; id也可以在屬性面板里直接輸入
(4) 在EMBED標簽中,插入name="myFlash"和swLiveConnect="true",確保沒有使用id屬性!代碼應當是這樣子的:
<embed src="javascript_to_flash.swf" quality=high width=366 height=142
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash"
name="myFlash" swLiveConnect="true">
</embed>
3.創建表單域
(1) 回到設計視圖
(2) 插入文本域(Insert> Form Object> Text Field),如果詢問是否添加表單域,選擇是
(3) 把文本域的HTML標簽修改成這樣:
<input type="text" name="sendText" maxlength="45"
onChange="doPassVar(this)">
每當文本域內容發生變化時,onChange就被觸發,doPassVar()函數就被調用
4.創建傳遞變量值的Javascript函數
復制下面的Javascript到<head></head>標簽內
<SCRIPT LANGUAGE=JavaScript>
<!--
function doPassVar(args){
var sendText = args.value;
window.document.myFlash.SetVariable("myVar", sendText);
}
//-->
</SCRIPT>
5.保存文件,測試一下(F12)
二、Flash到Javascript的通信
從HTML可以發送數據到Flash,反過來也可以. 這個例子演示了如何應用Flash的Fscommand來發送數據到Javascript.
查看示例:示例2
下載源文件: flash_to_javascript.zip(10K)
簡要步驟:
Flash中
新建一個文件,保存為flash_to_javascript.fla
創建一個文本域,設置成輸入文本(Input Text),選擇"border"以便我們能看到他,指定他的變量為inputVar
創建一個按鈕,在按鈕上添加如下的as:
on (release) {
fscommand ("send_var", inputVar);
}
保存文件,導出HTML和SWF
Dreamweaver中
1.打開導出HTML文件,修改<OBJECT>和<EMBED>標簽,結果同上:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
<embed src="javascript_to_flash.swf" quality=high
width=366 height=142
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash" name="myFlash" swLiveConnect="true">
</embed>
2. 插入如下的Javascript到<Body>標簽內:
<SCRIPT LANGUAGE=JavaScript>
<!--
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function myFlash_DoFSCommand(command, args) {
var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
alert (args);
}
if (navigator.appName && navigator.appName.indexOf("Microsoft")
!= -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows
3.1") == -1) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
document.write(' call myFlash_DoFSCommand(command, args)\n');
document.write('end sub\n');
document.write('</SCRIPT\> \n');
}
//-->
</SCRIPT>
三、Flash和Flash的通信
通過上面兩種方法的混和使用,同一HTML中兩個或者更多的Flash直接可以相互傳送消息. 從一個flash使用fscommand傳送消息給Javascript,使用Flash的Javascript methods把消息傳給另外一個flash
詳細的看這里:Flash影片之間的通信示例
從Flash MX開始,local connection對象可以用來在flash之間傳送消息. 這使得同一HTML中的或者位于兩個瀏覽器窗口中的兩個flash影片可以相互發送消息,而不必使用Javascript或者fscommand
詳細的看這里:在Flash MX中使用local connection對象(英文)
本站的localConnection教程:http://www.flashempire.com/school/tutorview.php?id=327
附可控制Flash Player的Javascript方法:
一覽表:
Play() ---------------------------------------- 播放動畫
StopPlay()------------------------------------停止動畫
IsPlaying()----------------------------------- 動畫是否正在播放
GotoFrame(frame_number)---------------- 跳轉到某幀
TotalFrames()------------------------------- 獲取動畫總幀數
CurrentFrame()------------------------------回傳當前動畫所在幀數-1
Rewind()-------------------------------------使動畫返回第一幀
SetZoomRect(left,top,right,buttom)-------放大指定區域
Zoom(percent)------------------------------改變動畫大小
Pan(x_position,y_position,unit)------------使動畫在x,y方向上平移
PercentLoaded()----------------------------返回動畫被載入的百分比
LoadMovie(level_number,path)----------- 加載動畫
TGotoFrame(movie_clip,frame_number)- movie_clip跳轉到指定幀數
TGotoLabel(movie_clip,label_name)------ movie_clip跳轉到指定標簽
TCurrentFrame(movie_clip)--------------- 回傳movie_clip當前幀-1
TCurrentLabel(movie_clip)-----------------回傳movie_clip當前標簽
TPlay(movie_clip)---------------------------播放movie_clip
TStopPlay(movie_clip)----------------------停止movie_clip的播放
GetVariable(variable_name)-----------------獲取變量
SetVariable(variable_name,value)-----------變量賦值
TCallFrame(movie_clip,frame_number)---call指定幀上的action
TCallLabel(movie_clip,label)----------------call指定標簽上的action
TGetProperty(movie_clip,property)--------獲取movie_clip的指定屬性
TSetProperty(movie_clip,property,number)-設置movie_clip的指定屬
posted on 2007-12-18 18:00
Q系列類、方法、變量…… 閱讀(2949)
評論(2) 編輯 收藏