| | 
 |  | 
 | 
 | 
 |  | | | 
 | | 本文部分內(nèi)容來自emllab,在后部分,加入了本人的一個(gè)整合范例,中文譯文轉(zhuǎn)載請注明本站出處.
 
 在過去的一年里,對于開發(fā)人員來說使用flash與javascript通訊總會碰到一些麻煩的事情,從flash調(diào)用
                                                    javascript函數(shù)已經(jīng)沒有什么問題了,因?yàn)槲覀兛梢允褂胓etURL方法來直接調(diào)用,但是要想使用javascript返回flash在許多瀏覽
                                                    器上幾乎是不可能的。但是現(xiàn)在可以了。
 Flash8的出現(xiàn),這件事就變的比較容易了。J
 
 The ExternalInterface API
 
 之前我們使用flash調(diào)用javascript函數(shù),一般使用這樣的方法:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | getURL(“javascript:alert(‘hello ’);”); |  
                                                                |  |  但是使用這種方法從flash調(diào)用javascript函數(shù)仍存在許多困難。特別是在處理多個(gè)javascript函數(shù)調(diào)用問題上。ExternalInterface API可以與javascript實(shí)現(xiàn)無縫調(diào)用,并且它的能力達(dá)到可以在flash時(shí)間線使用。
 
 在我們正式進(jìn)入它的使用方法之前,我們需要確保在flash時(shí)間上可用,就要導(dǎo)入它的類向這樣:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | import flash.external.*; |  
                                                                |  |  
 現(xiàn)在它已經(jīng)允許我們做的第一件事就是可以調(diào)用javascript函數(shù)了。
 
 Call 調(diào)用方法
 
 call方法對于ExternalInterface對象來說是一個(gè)靜態(tài)方法,也就是說我們不需要使用ExternalInterface對象的實(shí)例來調(diào)用方法,我們可以直接通過對象類來調(diào)用,向這樣:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | ExternalInterface.call(functionName:String,Parameters); |  
                                                                |  |  這個(gè)方法有兩個(gè)參數(shù):
 ·    functionName – 你想要調(diào)用的javascript函數(shù)名要以字符串的形式
 ·    Parameters – 需要傳遞給javascript函數(shù)的參數(shù),用逗號分開,是可選的。
 這些是基本的內(nèi)容,現(xiàn)在讓我們來看一個(gè)例子:
 1.    創(chuàng)建一個(gè)flash文檔命名為external1.fla.
 2.    創(chuàng)建兩個(gè)層上面的層命為AS,下面的層命名為”內(nèi)容”
 3.    在內(nèi)容層里面,創(chuàng)建一個(gè)文本域,將它設(shè)置為輸入文本域,打開顯示邊框以方便你能看到,并給它取個(gè)名字為alert_txt,將它放在場景的左邊。
 4.    仍然在內(nèi)容這一層上,拖動一個(gè)按鈕組件于場景中并把它放在動態(tài)文本的右邊,設(shè)置它的label為”Alert”并給它起個(gè)名字為alert_butn.
 5.    選擇上方的as層在第一幀上輸入代碼,
 6.    //調(diào)用alert
 7.
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | import flash.external.*; alert_butn.clickHandler = function() {
 ExternalInterface.call("alert", alert_txt.text);
 }
 
 |  
                                                                |  |  
 前面部分的代碼是導(dǎo)入ExternalInterface類包。然后為按鈕組件設(shè)置事件,當(dāng)點(diǎn)擊時(shí)調(diào)用javascript函數(shù),并將文本中輸入的文本通過externalInterface傳遞給javascript函數(shù)。
 現(xiàn)在發(fā)布你的影片,將它和html放在服務(wù)器上,當(dāng)你在服務(wù)器上測試時(shí)不論你在文本中輸入什么信息,它都將顯示在alert對話框中,但是如果你在本地測試,你可能就會發(fā)現(xiàn)當(dāng)你點(diǎn)擊按鈕時(shí),什么也沒發(fā)生,這是由flashplayer的安全特性造成的。
 
 演示文件
 
 上面這個(gè)范例是一個(gè)方法的例子,使用getURL方法也可以做到,然而externalinterface不只是能做到這些,除了發(fā)送信息給javascript,它還可以通過addCallback方法接收從javascript返回的信息。
 
 addCallback 方法
 
 AddCallback方法允許javascript調(diào)用flash時(shí)間上函數(shù),基本的語法結(jié)構(gòu)如下:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | ExternalInterface.addCallback(functionID:String,instance:Object,functionName:Function); |  
                                                                |  |  與call方法類似,它也是一個(gè)靜態(tài)方法,它有三個(gè)參數(shù)
 ·    functionID - 從 JavaScript 調(diào)用 ActionScript 函數(shù)時(shí)可使用的名稱。此名稱不必與 ActionScript 方法的實(shí)際名稱匹配。
 ·    instance - this 在該方法中被解析成的對象。此對象不一定是在其上可找到該方法的對象,您可以指定任何對象(或 null)。
 ·    functionName - 要從 JavaScript 調(diào)用的 ActionScript 方法。
 現(xiàn)在讓我們開始一個(gè)例子,在這個(gè)例子中我們將使用flash調(diào)用javascript的命令來請示用戶輸入色值,當(dāng)色值輸入后點(diǎn)擊ok,對象返回到flash并更改它的色彩,如下方法:
 1.    創(chuàng)建一個(gè)flash文檔命名為external2.fla.
 2.    與第一個(gè)例子相同,創(chuàng)建兩層上層命名為as.下層命名為“內(nèi)容”。
 3.    在內(nèi)容層拖動一個(gè)按鈕組件至場景中,放在左上方,將label設(shè)為”變色”,實(shí)例名為change_butn.
 4.    確保當(dāng)前在”內(nèi)容層”,繪制一個(gè)色值為0x000000的盒子,大小為100*100,當(dāng)然這個(gè)沒有限制。
 5.    將這個(gè)方塊轉(zhuǎn)換為movieclip.實(shí)例名稱命名為rec_mc.
 6.    在第一幀上輸入代碼如下:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | import flash.external.*; //改變方塊的色彩
 function onChange(clr:Number) {
 var temp_color:Color = new Color(rec_mc);
 temp_color.setRGB(clr);
 }
 //允許javascript調(diào)用onChang函數(shù)
 ExternalInterface.addCallback("onChange", this, onChange);
 //打開命今窗口
 change_butn.clickHandler = function() {
 ExternalInterface.call("callPrompt", "你想用什么的色彩? (ex: 0xff0000)");
 }
 
 |  
                                                                |  |  
 在代碼的前邊我們要先導(dǎo)入externalinterface類包,然后我們創(chuàng)建一個(gè)能改變場景中方塊色彩的函數(shù),完成后,我們調(diào)用
                                                    addCallback方法以使javascript可以調(diào)用flash的onChang函數(shù)。最后,我們針對按鈕創(chuàng)建事件來調(diào)用javascript命
                                                    令。
 你需要發(fā)布swf和html,然后用編輯軟件打開編輯器,如果你只是從flash調(diào)用javascirpt,那么你什么也不用做。但是如果你需要使用javascirpt調(diào)用flash函數(shù),還有一些小的工作需要做。
 
 在tilte標(biāo)簽的下方加入下面的javascript代碼:如下:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | <script language=JavaScript>
 var me; //代表swf的id
 //獲取正確的引用
 function getID(swfID) {
 if (navigator.appName.indexOf("Microsoft") > -1) {
 me = window[swfID];
 } else {
 me = document[swfID];
 }
 }
 //下面這段調(diào)用onChang函數(shù)并返回到flash.
 function makeCall(str){
 me.onChange(str);
 }
 //下面這個(gè)函數(shù)是被flash調(diào)用的。
 function callPrompt(str){
 makeCall(prompt(str));
 }
 </script>
 
 |  
                                                                |  |  
 開始,我們創(chuàng)建變量me來存放swf的引用。如果沒有它,我們不能調(diào)用flash函數(shù)。然后我們使用函數(shù)getID通過條件針對不同的瀏覽器來設(shè)
                                                    置引用,之后,我們創(chuàng)建makeCall函數(shù),用來調(diào)用flash函數(shù),最后我們創(chuàng)建由flash來調(diào)用的函數(shù)callPromt().它將調(diào)用
                                                    makeCall函數(shù)來發(fā)送信息返回到flash.
 在html的body標(biāo)簽的屬性中加入onload,并設(shè)置它等于getID函數(shù),如下:
 
 
                                                        
                                                            
                                                                | 代碼: |  
                                                                |  |  
                                                                | <body bgcolor="#ffffff" onload="getID(‘external2‘);"> |  
                                                                |  |  注意,當(dāng)我們設(shè)函數(shù)給onload事件,我們傳遞給它swf的id.它可以在swf的嵌入位置找到,現(xiàn)在,當(dāng)頁初始化完成后,函數(shù)getID將被調(diào)用,變量me就會被設(shè)置,以使javascript可以調(diào)用flash函數(shù)。
 將文件上傳到服務(wù)器上,并進(jìn)行測試,當(dāng)你點(diǎn)擊按鈕并在提示中輸入色彩值,flash中的方塊色就會改變。如下。
 
 演示文件
 
 在彈出窗口時(shí)如果你沒有輸入色彩值,而是點(diǎn)擊了取消,會返回null空回flash.flash中的方塊仍會保持原色。
 最終源文件下載(source)
 
 本人對上面的內(nèi)容進(jìn)行了一下整合,制作了一個(gè)終合范例,集成有顯示swf信息,獲取網(wǎng)址,調(diào)用對話框.
 
 范例演示
 
 
 | 
 | 
 | 
 | 
 | 
 |