It calls DojoExternalInterface.call.apply(), which is a file from Dojo. Based on the comment in that file it's a wrapper around Flash8 ExternalInterface, but I guess the comment is not up to date. Max?

http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzBrowserKernel.lzs
/**
  * Runs a Javascript method in the browser, returning the result
  * @keywords flashspecific
  */
static function callJS (...args) :* {
var js:String = args[0];// String js: Browser javascript to execute
    var callback:* = args[1];
    //DojoExternalInterface.call.apply(null, args);
    if (LzBrowserKernel.jsready != true) {
        LzBrowserKernel.__jslocked = true;
    }
    if (LzBrowserKernel.__jslocked == true) {
        if (callback != false) {
            var o:Array = [];
            for (var i:int = 0; i < args.length; i++) {
                o[i] = args[i];
            }
            LzBrowserKernel.__jscallq.push(o);
//Debug.write('queued', LzBrowserKernel.__jscallq.length, o);
        }
        return null;
    }

    LzBrowserKernel.__jscallback = callback;

    args[1] = LzBrowserKernel.callJSReturn;

    //LzBrowserKernel.__jslocked = true;
    //Debug.write('calling with args real', args);
    DojoExternalInterface.call.apply(null, args);

    if (callback == false) {
        LzBrowserKernel._dequeueJS();
    }
    return null;
}

http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/DojoExternalInterface.as
    function call(...args) :void {
        var methodName:String = args[0];
        var resultsCallback:Function = args[1];

        var parameters:Array = [];
        for(var i:int = 0; i < args.length; i++){
            if(i != 1){ // skip the callback
                parameters.push(args[i]);
            }
        }

// we might have any number of optional arguments, so we have to
        // pass them in dynamically; strip out the results callback
        //Debug.write('Calling', parameters);
var results:* = ExternalInterface.call.apply(null, parameters);

// immediately give the results back, since ExternalInterface is
        // synchronous
if(resultsCallback != null && typeof resultsCallback != "undefined"){
            resultsCallback.call(null, results);
        }
    }



On Nov 10, 2009, at 4:39 AM, Henry Minsky wrote:

Did you try the callJS method? I believe it uses the ExternalInterface calls.

On Mon, Nov 9, 2009 at 10:12 PM, Chris Kohlhardt <chr...@gliffy.com> wrote:
Hey there.  It's been a while.   :)

We're migrating our massive laszlo application to SWF9. We do several javascript calls in our app, and I was having issues calling lz.Browser.loadJS() several times in a row. Basically, not all the calls were making it through to the browser's javascript.

Anyway, after much trial and error, I discovered that as3 has ExternalInterface.call() for this purpose, and sure enough, using this native call directly works.

So.... not sure if this is the right place to suggest this, but you might consider updating loadJS() in kernel/swf9/LzBrowserKernel.lzs with ExternalInterface.call().

-chris



--
Henry Minsky
Software Architect
hmin...@laszlosystems.com



Reply via email to