从javascript到java(一个GWT故事)

noe*_*arr 5 javascript java events gwt jsni

所以,我正在GWT中为嵌入式Web浏览器(Sketchup)设计一个应用程序.我可以通过将window.location值更改为"skp :: myFunciton @ myParams"来控制Sketchup.Sketchup可以在浏览器中执行javascript.我想做的是让sketchup给我模型的内容.

public static native void getModel() /*-{
    $wnd.location = "skp:getModel@";
}-*/;
Run Code Online (Sandbox Code Playgroud)

在第二个草图后有一个结果.但是我们如何将它归还给gwt?问题是入口点实例启动了请求,而JSNI只能将静态方法映射到javascript.

我以为我有一个事件和元素的解决方案......

//Sketchup javascript
var gwtwidget = document.getElementById("myTextArea")
gwtwidget.value = "blahblah";
gwtwidget.onchange();
Run Code Online (Sandbox Code Playgroud)

然后听取GWT的变化.唉,它不起作用.Gwt自己的事件系统覆盖,汇集,阻止(或其他)事件.我应该采取什么方法?我已经通过网络搜索信息,但我当然无法理解它.我猜的答案是......

1从javascript(以某种方式)调用入口点实例方法
2从gwt中拾取一个事件,将由gwt(以某种方式)拾取
3设置排序的异步回调接口机制(不知何故)

jus*_*sio 7

界面应该非常简单.

例如,假设我们在GWT中有一些对象.假设我们在JS中有一些函数接受一些回调作为参数.所以在gwt中我们会有这样的东西:

    public static native void executeFunctionWithCallBack(MyCallback callback)/*-{
           var callBackWrapper =function(param) {
              callback.@com.package.MyObject::onSuccess(*)(param);
           } 
           $wnd.invokeFunctionWithCallback(callbackWrapper)  
     }-*/;
Run Code Online (Sandbox Code Playgroud)

如果要调用实例方法,则不仅要公开方法,还要公开应该调用它的实例.例如,您必须将实例作为参数传递给JSNI方法(或以其他方式从JSNI获取).然后创建一个JS函数,它将在实例上调用方法.就这样.没有更多的魔力=)