Пример возможностей: определение возможностей системы

Flash Player 9 или более поздних версий

Пример CapabilitiesExplorer демонстрирует, как с помощью класса flash.system.Capabilities можно определить, какие функции поддерживает пользовательская версия среды выполнения Flash. В этом примере используются следующие приемы:

  • определение возможностей пользовательской версии среды выполнения Flash с помощью класса Capabilities;

  • использование класса ExternalInterface для определения настроек, поддерживаемых обозревателем пользователя;

Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения CapabilitiesExplorer находятся в папке Samples/CapabilitiesExplorer. Приложение состоит из следующих файлов:

File

Описание

CapabilitiesExplorer.fla

или

CapabilitiesExplorer.mxml

Основной файл приложения Flash (FLA) или Flex (MXML).

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

Класс, обеспечивающий основные функции приложения, включая добавление возможностей системы в массив, сортировку элементов и использование класса ExternalInterface для получения данных о возможностях обозревателя.

capabilities.html

HTML-контейнер, содержащий необходимый код JavaScript для взаимодействия с внешним API-интерфейсом.

Обзор файла 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.