Voorbeeld van mogelijkheden: systeemmogelijkheden bepalen

Flash Player 9 of hoger

Het voorbeeld CapabilitiesExplorer toont hoe u met de klasse flash.system.Capabilities kunt bepalen welke eigenschappen door de Flash-runtimeversie van de gebruiker worden ondersteund. In dit voorbeeld worden de volgende technieken toegepast:

  • Bepalen welke mogelijkheden door de Flash-runtimeversie van de gebruiker worden ondersteund met de klasse Capabilities.

  • Bepalen welke browserinstellingen door de browser van de gebruiker worden ondersteund met de klasse ExternalInterface.

Zie www.adobe.com/go/learn_programmingAS3samples_flash_nl als u de toepassingsbestanden voor dit voorbeeld wilt downloaden. De toepassingsbestanden van CapabilitiesExplorer vindt u in de map Samples/CapabilitiesExplorer. Deze toepassing bestaat uit de volgende bestanden:

Bestand

Beschrijving

CapabilitiesExplorer.fla

of

CapabilitiesExplorer.mxml

Het hoofdtoepassingsbestand in Flash (FLA) of Flex (MXML).

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

De klasse die de hoofdfunctionaliteit van de toepassing biedt, zoals het toevoegen van systeemmogelijkheden aan een array, het sorteren van items en het ophalen van de browsermogelijkheden met de klasse ExternalInterface.

capabilities.html

Een HTML-container die het JavaScript bevat dat is vereist voor communicatie met de externe API.

Overzicht CapabilitiesExplorer

Het bestand CapabilitiesExplorer.mxml stelt de gebruikersinterface in voor de toepassing CapabilitiesExplorer. De mogelijkheden van de Flash-runtimeversie van de gebruiker worden weergegeven in een componentinstantie DataGrid in het werkgebied. De browsermogelijkheden worden ook weergegeven als de toepassing wordt uitgevoerd vanuit een HTML-container en als de externe API beschikbaar is.

Wanneer de gebeurtenis creationComplete van het hoofdtoepassingsbestand is verzonden, wordt de methode initApp() aangeroepen. De methode initApp() roept de methode getCapabilities() aan vanuit de klasse com.example.programmingas3.capabilities.CapabilitiesGrabber. De code voor de methode initApp() ziet er als volgt uit:

private function initApp():void 
{ 
    var dp:Array = CapabilitiesGrabber.getCapabilities(); 
    capabilitiesGrid.dataProvider = dp; 
}

De methode CapabilitiesGrabber.getCapabilities() retourneert een gesorteerde array van de mogelijkheden van Flash-runtime en de browser, die vervolgens worden ingesteld op de eigenschap dataProvider van de DataGrid-componentinstantie capabilitiesGrid in het werkgebied.

Overzicht van de klasse CapabilitiesGrabber

De statische methode getCapabilities() van de klasse CapabilitiesGrabber voegt elke eigenschap van de klasse flash.system.Capabilities toe aan een array (capDP). Vervolgens roept de methode de statische methode getBrowserObjects() in de klasse CapabilitiesGrabber aan. De methode getBrowserObjects() gebruikt de externe API om het navigatorobject van de browser dat de mogelijkheden van de browser bevat, met een lus te doorlopen. De methode getCapabilities() ziet er als volgt uit:

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; 
}

De methode getBrowserObjects() retourneert een array van alle eigenschappen in het navigatorobject van de browser. Als deze array een lengte heeft van een of meer items, wordt de array van browsermogelijkheden (navArr) toegevoegd aan de array van Flash Player-mogelijkheden (capDP) en wordt de hele array alfabetisch gesorteerd. Ten slotte wordt de gesorteerde array geretourneerd aan het hoofdtoepassingsbestand. Hiermee wordt vervolgens het gegevensraster gevuld. De code voor de methode getBrowserObjects() ziet er als volgt uit:

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; 
}

Als de externe API beschikbaar is in de huidige gebruikersomgeving, roept Flash-runtime de JavaScript-methode JS_getBrowserObjects() aan, die het navigatorobject van de browser met een lus doorloopt en een tekenreeks van URL-gecodeerde waarden aan ActionScript retourneert. Deze tekenreeks wordt vervolgens omgezet in een object URLVariables (itemVars) en toegevoegd aan de array itemArr, die wordt geretourneerd aan het aanroepende script.

Communiceren met JavaScript

Het sluitstuk van het bouwen van de toepassing CapabilitiesExplorer is het schrijven van het JavaScript dat nodig is om elk item in het navigator-object van de browser met een lus te doorlopen en een naam/waarde-paar toe te voegen aan een tijdelijke array. De code voor de JavaScript-methode JS_getBrowserObjects() in het bestand container.html ziet er als volgt uit:

<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>

De code maakt eerst een tijdelijke array, die alle naam/waarde-paren in het navigatorobject bevat. Vervolgens wordt het navigatorobject doorlopen met een lus for..in en wordt het gegevenstype van de huidige waarde geëvalueerd om ongewenste waarden uit te filteren. In deze toepassing zijn we alleen geïnteresseerd in tekenreekswaarden of Booleaanse waarden. Andere gegevenstypen (zoals functies en arrays) worden genegeerd. Elke tekenreekswaarde of Booleaanse waarde in het navigatorobject wordt toegevoegd aan de array tempArr. Vervolgens wordt het schermobject van de browser doorlopen met een lus for..in en wordt elke numerieke waarde toegevoegd aan de array tempArr. Ten slotte wordt de tijdelijke array omgezet in een tekenreeks met de methode Array.join(). In deze array wordt de ampersand (&) gebruikt als scheidingsteken, zodat ActionScript de gegevens gemakkelijk kan parseren met de klasse URLVariables.