AS代碼2.0:針對Flash Player 7

來源:互聯網
上載者:User
  如果你現有的指令碼是針對Flash 6或更早版本的播放器編寫的,但又想針對 Flash 7播放器發布,你可能需要修改你的指令碼,以便它們符合 Flash 7播放器的執行要求並能按設計思路工作。下面我們就介紹這些相關知識。

  Flash Player 7比以前的Flash播放器支援更多的動作指令碼命令,可以使用這些命令來編寫更穩健的指令碼。不過,如果在現有的指令碼中使用了這些命令,並針對Flash 7播放器發布該指令碼,它也許不能正確工作。例如,如果你有一個指令碼,其中有一個函數名使用了Error,該指令碼也許可以正確編譯,但並不能按照Flash 7播放器的方式運行,因為在現在的動作指令碼語言中Error是一個內建類(因此,Error是一個保留字)。可以通過修改指令碼,把Error函數名改為其它名字來解決,如ErrorCondition。

  Flash 7播放器也有了很多變化,這些變化影響到一個SWF檔案怎樣訪問另一個SWF檔案,怎樣載入外部資料,怎樣訪問本地設定和資料(如隱私權設定和本地永久共用對象)。最後,一些現有的特性也已經改變。

  如果你現有的指令碼是針對Flash 6或更早版本的播放器編寫的,但又想針對Flash 7播放器發布,你可能需要修改你的指令碼,以便它們符合Flash 7播放器的執行要求並能按設計思路工作。下面我們就介紹這些相關知識。

  一、遵從ECMA-262 Edition 4方案

  Flash 7播放器作了一些修改,使之更加符合 ECMA-262 Edition 4方案。在動作指令碼語言2.0中,除了可以使用基於類的編程技術外,也增加了其它特性,某些行為也已修改。當你針對Flash 7播放器發布且使用動作指令碼語言2.0時,你可以不把一種物件類型指派給另一個。這些功能不要求你更新現有的指令碼,但是,如果你針對 Flash 7播放器發布發布你的指令碼,你可以使用這些功能,然後繼續修訂和改進。

  與上面提到的變化不同,下表列出的變化(其中也有一些不完全遵從ECMA 方案)可能導致現有指令碼的執行結果與以前不同。如果你在針對 Flash 7播放器發布的現有指令碼中使用了這些特性,請查看一下這些變化,確保你的代碼能夠按照設計計劃運行,或確定是否需要重寫代碼。特別是,計算 undefined(未定義)項的結果在某些情況下是不同的,你應該在針對Flash 7播放器發布的指令碼中初始化所有的變數。

針對Flash 7播放器發布的SWF檔案 針對早期Flash播放器發布的SWF檔案
支援區分大小寫(只是大小寫不同的變數名被解釋為不同的變數)。這種變化也影響用#include指令載入的檔案和使用 LoadVars.load()命令載入的外部變數。 不區分大小寫(只是大小寫不同的變數名被解釋為相同的變數)。
   
在數值上下文中計算undefined項的返回結果是NaN。 在數值上下文中計算undefined項的返回結果是0。
myCount +=1;
trace(myCount); // NaN
myCount +=1;
trace(myCount); // 1
   
當undefined項被轉換為字串時,其結果是undefined。 當undefined項被轉換為字串時,其結果是""(Null 字元串)。
firstname = "Joan ";
lastname = "Flender";
trace(firstname + middlename + lastname);
// Joan undefinedFlender
firstname = "Joan ";
lastname = "Flender";
trace(firstname + middlename + lastname);
// Joan Flender
   
當把字串轉換為邏輯值時,如果該字串的長度>0,其結果為true;如果該字串為空白串,其結果為false。 當把字串轉換為邏輯值時,首先把它轉換為數值,如果該數值非0,其結果為true,否則為false。
當設定數組的長度時,只有有效數字字串可設定長度。例如,"6"起作用,但" 6"或"6xyz"不起作用。 當設定數組的長度時,即使是一個畸形的數字字串也可設定長度:
my_array=new Array();
my_array[" 6"] ="x";
trace(my_array.length); // 0
my_array["6xyz"] ="x";
trace(my_array.length); // 0
my_array["6"] ="x";
trace(my_array.length); // 7
my_array=new Array();
my_array[" 6"] ="x";
trace(my_array.length); // 7
my_array["6xyz"] ="x";
trace(my_array.length); // 7
my_array["6"] ="x";
trace(my_array.length); // 7

  二、設定和本機資料的網域名稱規則

  在Flash 6播放器中,當訪問本地設定(如攝像機或麥克風訪問許可)或本地永久資料(共用對象)時,預設使用超域匹配規則。也就是說,存放在 here.xyz.com、 there.xyz.com和 xyz.com的SWF檔案的設定和資料是共用的,且都儲存在xyz.com中。

  在Flash 7播放器中,預設使用精確域匹配規則。也就是說,存放在 here.xyz.com的檔案的設定和資料存放區在 here.xyz.com中,存放在 there.xyz.com的檔案的設定和資料存放區在 there.xyz.com中,等等。

  新的屬性System.exactSettings讓你指定使用哪種規則。這個屬性支援針對在Flash 6或更高版本播放器發布的檔案。對於針對Flash 6播放器發布的檔案,本屬性的預設值是false,這意味著使用超域匹配規則。對於針對Flash 7播放器發布的檔案,本屬性的預設值是true,這意味著使用精確域匹配規則。

  如果你使用設定和永久本機資料,且想要針對Flash 7播放器發布一個Flash 6播放器的SWF檔案,你可能需要在發布的檔案中把本屬性值設定為 false。

  三、SWF檔案之間的跨域和子域訪問

  當你開發一系列互相通訊的SWF檔案時,例如,當使用 loadMovie()、 MovieClip.loadMovie()、 MovieClipLoader.LoadClip() 命令或本地連線物件時,你可能把這些動畫檔案存放在不同的域或一個超域的不同的子域中。

  在針對Flash 5或更早版本的播放器發布的檔案中,跨域或子域訪問不受限制。

  在針對Flash 6播放器發布的檔案中,你可以使用 LocalConnection.allowDomain事件處理函數或 System.security.allowDomain()方法來指定允許跨域訪問(例如,讓在 someOtherSite.com域的檔案訪問在 someSite.com域的檔案),且無需用命令來允許子域訪問(例如,在 store.someSite.com子域的檔案可以訪問在 www.someSite.com子域的檔案)。

  在針對Flash 7播放器發布的檔案中,SWF檔案之間的訪問與早期版本有兩個方面的不同。首先,Flash 7播放器執行精確域匹配而不是超域匹配規則。因此,被訪問的檔案(即使是針對早期的Flash播放器版本而不是Flash 7播放器發布的檔案)必須顯式指定允許跨域或子域訪問。其次,存放在使用安全性通訊協定(HTTPS)網站中的檔案,必須顯式指定允許來自使用不安全性通訊協定(HTTP或FTP)的網站的檔案的訪問。

  因為Flash 7播放器執行精確域匹配而不是超域匹配規則,如果你想要針對Flash 7播放器發布的檔案能夠訪問你現有的指令碼,你可能需要修改這些指令碼。(你仍然可以針對Flash 6播放器發布修改過的檔案。)

  如果你在檔案中使用 LocalConnection.allowDomain()或 System.security.allowDomain()語句,並指定允許訪問超域網站,你必須修改你的參數來指定準確的域。下面的代碼說明你可能需要進行的修改:

// 允許存放在www.someSite.com或store.someSite.com域的SWF檔案訪問System.security.allowDomain("someSite.com");// 存放在www.anyOldSite.com域的SWF檔案中的Flash 6播放器命令my_lc.allowDomain = function(sendingDomain){  return(sendingDomain=="someSite.com");}// 允許針對Flash 7播放器發布的SWF檔案訪問的對應命令System.security.allowDomain("www.someSite.com", "store.someSite.com");my_lc.allowDomain = function(sendingDomain) { return(sendingDomain=="www.someSite.com" || sendingDomain=="store.someSite.com");}

  如果你當前還沒有使用這些語句,你也可能需要添加這樣的語句。

  例如,如果你的SWF檔案存放在 www.someSite.com域,且你想允許存放在 store.someSite.com域針對 Flash 7播放器發布的SWF檔案訪問,你必須給存放在 www.someSite.com域的檔案添加下列語句(你仍然可以針對Flash 6播放器發布存放在 www.someSite.com的檔案):

System.security.allowDomain("store.someSite.com");my_lc.allowDomain = function(sendingDomain) { return(sendingDomain=="store.someSite.com");}

  總的來說,如果你針對Flash 7播放器發布檔案且符合以下條件,你可能要修改你的檔案,添加或修改allowDomain語句:

  ①你編寫跨SWF檔案的指令碼
使用loadMovie()、MovieClip.loadMovie()、 MovieClipLoader.LoadClip()或本地連線物件。

  ②被調用的SWF檔案(任何版本)不是存放在使用安全性通訊協定(HTTPS)的網站,或調用的和被調用的SWF檔案都存放在使用安全性通訊協定(HTTPS)的網站。

③SWF檔案不在相同的域
例如,一個檔案在www.domain.com,另一個在 store.domain.com。

為此你需要做以下修改:

①如果被調用的SWF檔案是針對Flash 7播放器發布的,在被調用的SWF檔案中包含 System.security.allowDomain或 LocalConnection.allowDomain語句,使用精確網域名稱匹配。

②如果被調用的SWF檔案是針對Flash 6播放器發布的,修改被調用的SWF檔案,添加或修改 System.security.allowDomain或 LocalConnection.allowDomain語句,使用精確網域名稱匹配(如本節前面的代碼所示)。你可以針對Flash 6或7播放器發布修改過的檔案。

③如果被調用的SWF檔案是針對Flash 5 或以前的播放器版本發布的,針對Flash 6或7播放器發布被調用的SWF檔案,添加 System.security. allowDomain語句,使用精確網域名稱匹配(如本節前面的代碼所示)。(Flash 5及以前的播放器版本不支援本地連線物件。)

  四、SWF檔案之間從HTTP到HTTPS協議的訪問

  正如前一節所討論的,在Flash 7播放器中,跨域和子域訪問的規則已經修改。除了現在執行精確域匹配規則外,你必須顯式說明允許存放在使用不安全性通訊協定的網站的檔案訪問存放在使用安全性通訊協定(HTTPS)的網站的檔案。根據被調用的檔案是針對Flash 7播放器還是針對Flash 6播放器發布的,你必須執行一個 allowDomain語句,或使用新的 LocalConnection.allowInsecureDomain事件處理函數或System.security.allowInsecureDomain()語句。

警告:執行allowInsecureDomain()語句危及HTTPS協議提供的安全。只有在你不能重新組織你的網站以便所有的SWF檔案都能接受 HTTPS協議的服務時才做這樣的修改。

下面的代碼說明你可能需要做的修改:

// 允許存放在http://www.someSite.com或http://www.someOtherSite.com// 針對Flash 7播放器發布的SWF檔案訪問的存放在https://www.someSite.com// 針對Flash 6播放器發布的SWF檔案中的命令my_lc.allowDomain = function(sendingDomain) { return(sendingDomain=="someOtherSite.com");}// 允許針對Flash 7播放器發布的// 存放在http://www.someSite.com或http://www.someOtherSite.com的// 針對Flash 7播放器發布的SWF檔案訪問的對應命令System.security.allowInsecureDomain("www.someSite.com","www.someOtherSite.com");my_lc.allowInsecureDomain = function(sendingDomain) { return(sendingDomain=="www.someSite.com" || sendingDomain=="www.someOtherSite.com");}

  如果你當前還沒有使用這些語句,你也可能需要添加這樣的語句。

  即使兩個檔案都在相同的域也可能需要修改(例如,存放 http://www.domain.com的檔案調用存放在 https://www.domain.com的檔案)。

  總的來說,如果你針對Flash 7播放器發布檔案且符合以下條件,你可能要修改你的檔案,添加或修改語句:

  ①你編寫跨SWF檔案的指令碼(使用loadMovie()、 MovieClip.loadMovie()、 MovieClipLoader.LoadClip()或本地連線物件)。

  ②調用檔案沒有存放在使用 HTTPS協議的網站和被調用的SWF檔案存放在使用安全性通訊協定(HTTPS)的網站。

  你必須做以下修改:

  ①如果被調用的SWF檔案是針對Flash 7播放器發布的,在被調用的SWF檔案中包含 System.security.allowDomain或 LocalConnection.allowDomain語句,使用精確網域名稱匹配(如本節前面的代碼執行個體所示)。即使調用的和被調用的 SWF檔案存放在相同的域,也需要這個語句。

  ②如果被調用的SWF檔案是針對Flash 6或以前的播放器版本發布的,且調用的和被調用的檔案都存放在相同的域(例如,存放http://www.domain.com的檔案調用存放在 https://www.domain.com的檔案),不需要修改。

  ③如果被調用的SWF檔案是針對Flash 6播放器版本發布的,調用的和被調用的檔案不在相同的域,而你又不想針對Flash 7播放器匯出被調用檔案,就要修改被調用檔案,添加或修改 System.security.allowDomain或 LocalConnection.allowDomain 語句,使用精確網域名稱匹配(如本節前面的代碼執行個體所示)。

  ④如果被調用的SWF檔案是針對Flash 6播放器版本發布的,而你又想針對Flash 7播放器發布被調用檔案,就在被調用檔案中包含 System. security.allowDomain或 LocalConnection.allowDomain語句,使用精確網域名稱匹配(如本節前面的代碼執行個體所示)。即使兩個檔案都存放在相同的域,也需要這個語句。

  ⑤如果被調用的SWF檔案是針對Flash 5或以前的播放器版本發布的,且兩個檔案不在相同的域,你可以做兩件事情。你可以針對 Flash 6播放器發布被調用檔案或修改 System.security.allowDomain 語句,使用精確網域名稱匹配(如本節前面的代碼所示);或者你可以針對Flash 7播放器發布被調用檔案,使用精確網域名稱匹配(如本節前面的代碼執行個體所示)。

  五、允許訪問資料的伺服器端策略檔案

  使用這些資料裝載調用,Flash文檔可以從外部源載入資料: XML.load()、XML.sendAndLoad()、 LoadVars.load()、LoadVars. sendAndLoad()、loadVariables()、 loadVariablesNum()、 MovieClip.loadVariables()、 XMLSocket.connect()和 Macromedia Flash Remoting (NetServices.createGatewayConnection)。SWF檔案也可以在運行期匯入運行期共用庫(RSL)或其它SWf檔案中定義的資源。在預設情況下,被匯入的資料或 RSL必須儲存在與裝載這些外部資料或媒體的SWF檔案相同的域。

要使來自不同域的SWF檔案能夠使用資料和運行期共用庫中的資源,你應該使用跨域策略檔案。跨域策略檔案是一個XML檔案,它為伺服器提供一種方法來指明它的資料和文檔對來自某些域或所有域的 SWF檔案是可用的。任何一個來自伺服器策略檔案中指定的域的SWF檔案都允許訪問該伺服器的資料或RSL。

如果你在裝載外部資料,即使你不打算針對 Flash 7播放器發布任何檔案,你也應該建立策略檔案。如果你正在使用 RSL,且針對 Flash 7播放器發布調用的和被調用的檔案,你應該建立策略檔案。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。