Проблемы с командами javascript для DJ Native Swing - PullRequest
1 голос
/ 25 октября 2010

Используя DJ Native Swing, можно показать веб-страницу в Java-приложении.Когда вы делаете это, вы также можете обмениваться данными из браузера со средой выполнения Java, используя протокол «command».В документации есть фрагмент кода, который демонстрирует его использование:


function sendCommand( command ){
    var s = 'command://' + encodeURIComponent( command );

    for( var i = 1; i < arguments.length; s+= '&' + encodeURIComponent( arguments[i++] ) );
      window.location = s;
}

Как это выглядит здесь, похоже, что это обычный запрос GET к URL-адресу, использующий протокол команды вместо http.Хотя, когда я создаю и изображение, скрипт-тег или просто и ajax-запрос на получение, ответа нет, и точка останова во время выполнения Java не срабатывает.не хочу уходить со страницы, на которой я сейчас нахожусь.Использование ссылки для перехода к URL-адресу команды работает, но она также перемещается от текущей страницы.На странице используются OpenLayers и Dojo.(Я тоже пробовал dojo.io.script)

1 Ответ

2 голосов
/ 04 ноября 2010

После некоторой работы я нашел изящный способ связи со средой исполнения Java, который не вызывает обновления страницы каждый раз, когда происходит общение. Он вдохновлен тем, как JSONP работает для преодоления междоменного ограничения в большинстве браузеров в наши дни. Поскольку iFrame также будет вызывать URL command://, можно выполнить действие, подобное JSONP, используя эту технику. Код на стороне клиента (браузер):


dojo.provide( "nmpo.io.java" );
dojo.require( "dojo.io.script" );

nmpo.io.java = dojo.delegate( dojo.io.script, { 
    attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){
        //  summary:
        //      creates a new  tag pointing to the specified URL and
        //      adds it to the document.
        //  description:
        //      Attaches the script element to the DOM.  Use this method if you
        //      just want to attach a script to the DOM and do not care when or
        //      if it loads.        
        var frame = dojo.create( "iframe", { 
            id: id,
            frameborder:  0,
            framespacing: 0
        }, dojo.body( ) );

        dojo.style( frame, { display: "none" } );
        dojo.attr( frame, { src: url } );
        return frame;
    },

    _makeScriptDeferred: function(/*Object*/args){
        //summary: 
        //      sets up a Deferred object for an IO request.
        var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError);

        var ioArgs = dfd.ioArgs;
        ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++);
        ioArgs.canDelete = false;

        //Special setup for jsonp case
        ioArgs.jsonp = args.callbackParamName || args.jsonp;

        if(ioArgs.jsonp){
            //Add the jsonp parameter.
            ioArgs.query = ioArgs.query || "";
            if(ioArgs.query.length > 0){
                ioArgs.query += "&";
            }
            ioArgs.query += ioArgs.jsonp
                + "="
                + (args.frameDoc ? "parent." : "")
                + "nmpo.io.java.jsonp_" + ioArgs.id + "._jsonpCallback";

            ioArgs.frameDoc = args.frameDoc;

            //Setup the Deferred to have the jsonp callback.
            ioArgs.canDelete = true;
            dfd._jsonpCallback = this._jsonpCallback;
            this["jsonp_" + ioArgs.id] = dfd;
        }
        return dfd; // dojo.Deferred
    }
});

Когда запрос отправляется во время выполнения Java, будет предоставлен аргумент обратного вызова, и может быть выполнено действие webBrowser.executeJavascript( callbackName + "(" + json + ");" ); для запуска обратного вызова в браузере.

Пример использования клиента:


dojo.require( "nmpo.io.java" );
nmpo.io.java.get({
    // For some reason the first paramater (the one after the '?') is never in the
    // paramater array in the java runtime. As a work around we stick in a dummy.
    url: "command://sum?_",
    callbackParamName: "callback",
    content: {
        numbers: [ 1, 2, 3, 4, 5 ].join( "," )
    },
    load: function( result ){
        console.log( "A result was returned, the sum was [ " + result.result + " ]" );  
    }   
});

Пример использования java:


webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
    @Override
    public void commandReceived(WebBrowserCommandEvent e) {
        // Check if you have the right command here, left out for the example
        // Parse the paramaters into a Hashtable or something, also left out for the example
        int sum = 0;
        for( String number : arguments.get( "numbers" ).split( "," ) ){
            sum += Integer.parseInt( number );
        }

        // Execute the javascript callback like would happen with a regular JSONP call.
        webBrowser.executeJavascript( arguments.get( "callback" ) + "({ result: " + sum + " });" );
    }
});

Также с IE в кадре я настоятельно рекомендую использовать Firebug Lite, инструменты разработки для IE недоступны.

...