日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[js] flash如何与js交互?

發(fā)布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [js] flash如何与js交互? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[js] flash如何與js交互?

當(dāng)Flash置于HTML容器中時,經(jīng)常會遇到AS與JS的通信問題,例如:JS能否調(diào)用AS中的變量、方法,AS能否調(diào)用JS中的變量、方法等等。答案是肯定的。隨著技術(shù)的不斷發(fā)展,解決方案也是多種多樣的。 在我總結(jié)的HTML與FLASH之間的“靜態(tài)”傳值一文中提到了JS使用SetVariable方法來設(shè)置FLASH中的變量,kinglong認(rèn)為此法已經(jīng)過時。對此我表示同意,但上文重點畢竟不是在討論JS與AS的通信,因此另外對AS與JS通信做一個個人總結(jié),歡迎大家討論。 實現(xiàn)JS跟AS的通信,目前可選方法比較多,但早期的方法在使用便捷和功能上都不是很完美,下面做一簡要說明:一、getURL  getURL("javascript:history.go(-1)");通過URL協(xié)議來訪問頁面中的javascript,上面控制瀏覽器歷史的代碼很眼熟吧,諸如此類我們平時在定制頁面收藏,發(fā)送郵件時都會經(jīng)常使用這種方式。雖然你也可以調(diào)用頁面中自己定義的JS函數(shù),但我個人認(rèn)為局限性還是比較大,函數(shù)的參數(shù)傳遞并不是很靈活,無返回值,而且只能實現(xiàn)AS調(diào)用JS,反之不行。二、fscommand命令 使用fscommand來調(diào)用AS定義的方法也是一個很常用的方式,但我們需要在HTML頁面中定義一個具有規(guī)定格式的myFlash_DoFSCommand函數(shù),首先定義這個函數(shù)我個人就覺得麻煩,而且也只能實現(xiàn)AS調(diào)用JS,無函數(shù)返回值。三、SetVariable   上面兩種方法都只能實現(xiàn)AS調(diào)用JS,而SetVariable恰恰相反,只要我們稍微做下處理,他就可以幫我們變相調(diào)用AS中的方法。大概思路如下:AS中設(shè)置一個狀態(tài)變量,并使用Object的watch方法對其監(jiān)視,JS通過SetVariable來修改這個狀態(tài)變量,一旦偵測到了變量的改變,那就可以根據(jù)不同的狀態(tài)值來選擇執(zhí)行AS中的相應(yīng)函數(shù)了。如果需要考慮用戶的低版本播放器,那么你可以考慮下該方法,個人認(rèn)為還是比較靈活的。可以看出上面的這些做法都有一定的局限性,所以在我們的應(yīng)用中很多時候都不得不將他們結(jié)合使用。而下面我要具體介紹的就是 ExternalInterface的做法,通過它你能輕松實現(xiàn)AS與JS的雙向方法調(diào)用,從而也解決了雙向的變量訪問,詳細(xì)介紹可參見FLASH幫助文檔和Adobe的官方教程,下面用兩個簡單例子來說明ExternalInterface的使用。一、AS調(diào)用JS的方法(實例演示)Flash中代碼: //導(dǎo)入包 import flash.external.*; get_btn.onRelease = function(){ //調(diào)用頁面中的JS函數(shù) var temp_str = String(ExternalInterface.call("say", "Hello,World")); result_txt.text = temp_str; } Html中代碼:function say(txt){ return txt; }沒錯,就這么簡單,JS函數(shù)定義沒有任何要求,AS中使用call方法直接調(diào)用就可以了。二、JS調(diào)用AS的方法(實例演示)FLASH中代碼://導(dǎo)入包 import flash.external.*; //提供JS訪問的函數(shù)名 var _method:String = "say"; //指定本地函數(shù)中this變量的作用域,可設(shè)置為null留空 var e_area:Object = null; //AS內(nèi)部函數(shù)名 var method:Function = say; //將函數(shù)注冊到容器列表 var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, e_area, method); //查看注冊是否成功 if(wasSuccessful){ result_txt.text = "函數(shù)注冊成功"; } //本地的函數(shù) function say(txt:String) { result_txt.text = txt; } Html中代碼:<div> <form> <input type="button" οnclick="callExternalInterface()" value="JS調(diào)用AS方法" /> </form> <script> function callExternalInterface() { thisMovie("demo").say("Hello,World"); } //瀏覽器兼容訪問DOM function thisMovie(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName] } else { return document[movieName] } } </script> </div> 其中紅色代碼是核心代碼,其作用原理是AS端通過addCallback函數(shù)把AS內(nèi)部定義的方法注冊為可從容器中調(diào)用,允許自定義另外一個方法名供 JS來調(diào)用這個方法,函數(shù)調(diào)用成功返回true,失敗返回flase,在此例中通過wasSuccessful變量來判斷函數(shù)是否注冊成功。函數(shù)注冊成功以后,JS可以通過DOM來訪問SWF對象,然后直接調(diào)用預(yù)定義的方法即可。通過比較可以看出,使用ExternalInterface來完成AS和JS的通信,代碼可以更簡潔,更清晰,功能也更強大,不過還有些細(xì)節(jié)你需要了解,需要使用8.0以上的播放器,對于調(diào)用的JS函數(shù)不能使用遞歸,同時安全域限制也必須在考慮之中。

個人簡介

我是歌謠,歡迎和大家一起交流前后端知識。放棄很容易,
但堅持一定很酷。歡迎大家一起討論

主目錄

與歌謠一起通關(guān)前端面試題

總結(jié)

以上是生活随笔為你收集整理的[js] flash如何与js交互?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。