In a previous example, “Calling JavaScript functions from your Flex applications using the ExternalInterface API”, we saw how we could call JavaScript functions from our Flex application.

The following example shows us how we can return a value from a JavaScript function call and use the data in our Flex application.

Full code after the jump.

View MXML

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2008/03/11/returning-values-from-javascript-in-your-flex-applications-using-the-externalinterface-api/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white">

    <mx:Script>
        <![CDATA[
            import mx.utils.ObjectUtil;

            private function callJavaScript():void {
                var keys:Array = "appCodeName,appName,appVersion,cookieEnabled,language,platform,systemLanguage,userAgent,userLanguage".split(",");
                var arr:Array = ExternalInterface.call("getNavigatorObject", keys);
                dataGrid.dataProvider = arr;
            }
        ]]>
    </mx:Script>

    <mx:ApplicationControlBar dock="true">
        <mx:Button label="Get browser navigator object"
                click="callJavaScript();" />
    </mx:ApplicationControlBar>

    <mx:DataGrid id="dataGrid"
            variableRowHeight="true"
            width="100%"
            height="100%" >
        <mx:columns>
            <mx:DataGridColumn dataField="key"
                    width="120" />
            <mx:DataGridColumn dataField="value"
                    wordWrap="true" />
        </mx:columns>
    </mx:DataGrid>

</mx:Application>

/src/externalInterface.js

// JavaScript
/** http://blog.flexexamples.com/2008/03/11/returning-values-from-javascript-in-your-flex-applications-using-the-externalinterface-api/ */
function getNavigatorObject(keys) {
    var arr = [];
    var i;
    var len = keys.length;
    var key;
    var value;
    for (i=0; i<len; i++) {
        key = keys[i];
        value = navigator[key];
        arr.push({key:key, value:value});
    }

    return arr;
}

/html-template/index.template.html

<head>
...
<script language="JavaScript" src="externalInterface.js"></script>
</head>

View source is enabled in the following example.

 
Tagged with:
 
About The Author

Peter deHaan

Peter deHaan currently works for Adobe on the Flex SDK QA team. While not working on Flex, Flash, and ColdFusion applications, Peter enjoys making up bios and writing in 3rd person. Peter's rarely updated blog can be found at blogs.adobe.com/pdehaan/, actionscriptexamples.com, airexamples.com, and coldfusionexamples.com.

0 Responses to Returning values from JavaScript in your Flex applications using the ExternalInterface API

  1. MArcio says:

    How to trace a value returned for example

    private function callJavaScript():void {
    var keys:Array = "appCodeName,appName,appVersion,cookieEnabled,language,platform,systemLanguage,userAgent,userLanguage".split(",");
    var arr:Array = ExternalInterface.call("getNavigatorObject", keys);
    for (var i:int = 0; i
    
  2. peterd says:

    MArcio,

    Does calling trace(arr.appVersion); work after calling ExternalInterface.call()?

    Peter

  3. MArcio says:

    arr.appVersion: undefined

    I’m usign on creationComplete of my mx:Application

    private function callJavaScript_BrowserInfo():void {
    var keys:Array = "appCodeName,appName,appVersion,cookieEnabled,language,platform,systemLanguage,userAgent,userLanguage".split(",");
    var arr:Array = ExternalInterface.call("getNavigatorObject", keys);
    trace("arr.appVersion: " + arr.appVersion);
    dataGrid.dataProvider = arr;
    if (arr){
    for (var i:int = 0; i
    
  4. peterd says:

    MArcio,

    If you’re using the creationComplete event, it may be a timing issue. With the ExternalInterface API there is never really a guarantee that the Flex app will complete before/after the HTML container its in.

    What if you try using a timer and putting a delay of say, 2 seconds? (or 4 seconds).
    If the code works in that scenario, I would guess its a simple timing issue and the HTML just isn’t fully initialized yet.

    Peter

  5. nathan king says:

    poking around to find out if JS can make a call to a function inside a flex app without flex initiating the interaction. Thoughts?
    Thank you so much forthe code examples,
    -Nathan

  6. nathan king says:

    found it – for anyone else looking – you have to register the javascript function and associate it with the internal flex function you wish to call using the following syntax within your flex app:

    ExternalInterface.addCallback(“jsFunctionName”, flexFunctionName);

    or just try searching this blog (duh), apologies.
    http://blog.flexexamples.com/2008/03/11/calling-actionscript-functions-from-your-html-templates-using-the-externalinterface-api/

  7. Paul says:

    I have downloaded the source and imported into Flex. How do I get it to run?

  8. hari says:

    hi peter, this is realy what im looking for.
    simple example, just simple example that explains everything.

    great!

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Anti-Spam Protection by WP-SpamFree