功能範例:偵測系統功能Flash Player 9 和更新的版本 CapabilitiesExplorer 範例會示範如何使用 flash.system.Capabilities 類別,以判斷使用者的 Flash 執行階段版本所支援的功能。此範例將教導您下列技巧:
若要取得此樣本的應用程式檔案,請參閱 www.adobe.com/go/learn_programmingAS3samples_flash_tw。您可以在 Samples/CapabilitiesExplorer 檔案夾中找到 CapabilitiesExplorer 應用程式檔案,它是由下列檔案組成:
CapabilitiesExplorer 概觀CapabilitiesExplorer.mxml 檔案的作用是負責設定 CapabilitiesExplorer 應用程式的使用者介面。使用者的 Flash 執行階段版本的功能,會顯示在「舞台」上的 DataGrid 組件實體中。如果使用者是透過 HTML 容器執行應用程式,並且能使用外部 API 的話,則他們的瀏覽器功能也會顯示出來。 傳送主應用程式檔案的 creationComplete 事件時,便會叫用 initApp() 方法。initApp() 方法會從 com.example.programmingas3.capabilities.CapabilitiesGrabber 類別中呼叫 getCapabilities() 方法。initApp() 方法的程式碼如下: private function initApp():void { var dp:Array = CapabilitiesGrabber.getCapabilities(); capabilitiesGrid.dataProvider = dp; } CapabilitiesGrabber.getCapabilities() 方法會傳回經過排序的 Flash 執行階段及瀏覽器功能陣列,然後這個陣列再設定給「舞台」上 capabilitiesGrid DataGrid 組件實體的 dataProvider 屬性。 CapabilitiesGrabber 類別概觀CapabilitiesGrabber 類別的靜態 getCapabilities() 方法會將來自 flash.system.Capabilities 類別的每個屬性都加入陣列中 (capDP)。接著,它會呼叫 CapabilitiesGrabber 類別中的靜態 getBrowserObjects() 方法。getBrowserObjects() 方法會使用外部 API,以循環執行瀏覽器的 navigator 物件,此物件中包含瀏覽器的功能。getCapabilities() 方法如下所示: public static function getCapabilities():Array { var capDP:Array = new Array(); capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable}); capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility}); capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio}); ... capDP.push({name:"Capabilities.version", value:Capabilities.version}); var navArr:Array = CapabilitiesGrabber.getBrowserObjects(); if (navArr.length > 0) { capDP = capDP.concat(navArr); } capDP.sortOn("name", Array.CASEINSENSITIVE); return capDP; } getBrowserObjects() 方法會傳回瀏覽器之 navigator 物件中每一個屬性的陣列。如果這個陣列的長度為一個或多個項目,則瀏覽器功能陣列 (navArr) 就會附加至 Flash Player 功能陣列 (capDP),然後整個陣列再依照字母進行排序。最後,經過排序的陣列會傳回至主應用程式檔案,再將這個檔案填入資料格點。getBrowserObjects() 方法的程式碼如下: private static function getBrowserObjects():Array { var itemArr:Array = new Array(); var itemVars:URLVariables; if (ExternalInterface.available) { try { var tempStr:String = ExternalInterface.call("JS_getBrowserObjects"); itemVars = new URLVariables(tempStr); for (var i:String in itemVars) { itemArr.push({name:i, value:itemVars[i]}); } } catch (error:SecurityError) { // ignore } } return itemArr; } 如果目前的使用者環境中可以使用外部 API,Flash 執行階段便會呼叫 JavaScript 的 JS_getBrowserObjects() 方法,循環執行瀏覽器的 navigator 物件,並將經過 URL 編碼的字串值傳回至 ActionScript。然後這個字串便會轉換為 URLVariables 物件 (itemVars),並加入 itemArr 陣列中,而此陣列會傳回至呼叫端指令碼。 與 JavaScript 進行通訊建立 CapabilitiesExplorer 應用程式的最後一部分是撰寫必要的 JavaScript,以循環執行瀏覽器之 navigator 物件中的每一個項目,並將名稱/值配對附加到暫存陣列中。container.html 檔案中之 JavaScript JS_getBrowserObjects() 方法的程式碼如下所示: <script language="JavaScript"> function JS_getBrowserObjects() { // Create an array to hold each of the browser's items. var tempArr = new Array(); // Loop over each item in the browser's navigator object. for (var name in navigator) { var value = navigator[name]; // If the current value is a string or Boolean object, add it to the // array, otherwise ignore the item. switch (typeof(value)) { case "string": case "boolean": // Create a temporary string which will be added to the array. // Make sure that we URL-encode the values using JavaScript's // escape() function. var tempStr = "navigator." + name + "=" + escape(value); // Push the URL-encoded name/value pair onto the array. tempArr.push(tempStr); break; } } // Loop over each item in the browser's screen object. for (var name in screen) { var value = screen[name]; // If the current value is a number, add it to the array, otherwise // ignore the item. switch (typeof(value)) { case "number": var tempStr = "screen." + name + "=" + escape(value); tempArr.push(tempStr); break; } } // Return the array as a URL-encoded string of name-value pairs. return tempArr.join("&"); } </script> 程式碼是從建立暫存陣列開始,該陣列會保存 navigator 物件中的所有名稱/值配對。接著再使用 for..in 迴圈循環執行 navigator 物件,然後評估目前值的資料類型,以篩選出不想要的值。在此應用程式中,我們只要類型為 String 或 Boolean 的值,而其它類型 (例如函數或陣列) 則加以忽略。將 navigator 物件中的每一個 String 或 Boolean 值都附加到 tempArr 陣列,然後再使用 for..in 迴圈循環執行瀏覽器的 screen 物件,並將每一個數值加入至 tempArr 陣列。最後會使用 Array.join() 方法,將該暫存陣列轉換為字串。這個陣列會使用 & (and 符號) 做為分隔符號,讓 ActionScript 能夠使用 URLVariables 類別輕易剖析資料。 |
|