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

by Peter deHaan on March 11, 2008

in ActionScript, ExternalInterface, JavaScript

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.

{ 8 comments… read them below or add one }

1 MArcio March 21, 2008 at 8:04 am

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

Reply

2 peterd March 21, 2008 at 9:29 am

MArcio,

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

Peter

Reply

3 MArcio March 21, 2008 at 11:55 am

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

Reply

4 peterd March 21, 2008 at 4:38 pm

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

Reply

5 nathan king July 23, 2008 at 8:30 am

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

Reply

6 nathan king July 23, 2008 at 10:38 am

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/

Reply

7 Paul December 10, 2008 at 9:38 am

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

Reply

8 hari May 6, 2009 at 1:36 am

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

great!

Reply

Leave a Comment

Sorry, this blog is terrible at eating HTML comments.
If you're pasting any HTML/XML/MXML code, you need to convert your < characters to &lt; and your > characters to &gt; .

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

Previous post:

Next post: