Пример возможностей: определение возможностей системыFlash Player 9 или более поздних версий Пример CapabilitiesExplorer демонстрирует, как с помощью класса flash.system.Capabilities можно определить, какие функции поддерживает пользовательская версия среды выполнения Flash. В этом примере используются следующие приемы:
Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения CapabilitiesExplorer находятся в папке Samples/CapabilitiesExplorer. Приложение состоит из следующих файлов:
Обзор файла CapabilitiesExplorerФайл CapabilitiesExplorer.mxml отвечает за настройку пользовательского интерфейса для приложения CapabilitiesExplorer. Возможности пользовательской версии среды выполнения Flash будут отображаться в экземпляре компонента DataGrid в рабочей области. Также будут отображаться их возможности взаимодействия с обозревателем, если приложение запущено из HTML-контейнера и если доступен внешний API-интерфейс. После отправки события creationComplete основного файла приложения вызывается метод initApp(). Метод initApp() вызывает метод getCapabilities() класса com.example.programmingas3.capabilities.CapabilitiesGrabber. Ниже приводится код для метода initApp(). private function initApp():void
{
var dp:Array = CapabilitiesGrabber.getCapabilities();
capabilitiesGrid.dataProvider = dp;
}
Метод CapabilitiesGrabber.getCapabilities() возвращает упорядоченный массив возможностей среды выполнения Flash и браузера, который затем назначается в качестве свойства dataProvider для экземпляра компонента DataGrid с именем capabilitiesGrid в рабочей области. Обзор класса CapabilitiesGrabberСтатический метод getCapabilities() класса CapabilitiesGrabber добавляет каждое свойство класса flash.system.Capabilities в массив (capDP). Затем он вызывает статический метод getBrowserObjects() класса CapabilitiesGrabber. Метод 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 вызывает метод JS_getBrowserObjects() кода JavaScript, который циклически обрабатывает объект navigator браузера и возвращает строку значений в кодировке URL коду ActionScript. Затем эта строка преобразуется в объект URLVariables (itemVars) и добавляется в массив itemArr, который передается вызывающему сценарию. Взаимодействие с JavaScriptНа последнем этапе разработки приложения CapabilitiesExplorer создается сценарий JavaScript, необходимый для циклической обработки всех элементов в объекте navigator обозревателя и добавления пары «имя-значение» во временный массив. Ниже приводится код для метода JavaScript JS_getBrowserObjects() в файле container.html. <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. Затем объект navigator проходит цикл for..in, в котором тип данных текущего значения оценивается для отсеивания нежелательных результатов. В этом приложении нас интересуют только строковые или логические значения, остальные типы данных (такие как функции или массивы) игнорируются. Все строковые или логические значения в объекте navigator добавляются в массив tempArr. Затем объект screen обозревателя проходит цикл for..in, и все числовые значения добавляются в массив tempArr. В завершение, временный массив преобразуется в строку с помощью метода Array.join(). В этом массиве в качестве разделителя используется амперсанд (&), что облегчает для кода ActionScript анализ данных с помощью класса URLVariables. |
|