从 GWT 中的 jsni 调用外部函数

Invoke external function from jsni in GWT

我在 .js 文件中定义了一个函数,它包含在主 .html 文件中,代码如下:

<script type="text/javascript" language="javascript" 
    src="js/script.js"></script>

我还有一个调用 js 文件中定义的函数的 JSNI 方法:

public native void addJsModule(String name) /*-{
        addNewSection(name);
    }-*/;

当我调用 java 方法时,我得到这个异常:

com.google.gwt.event.shared.UmbrellaException: Exception caught: Exception caught: (ReferenceError) @client.registros.home.RegistyHome::addJsModule(Ljava/lang/String;)([string: 'acercade']): addNewSection is not defined

谢谢!!

您必须通过将 javascript 方法存储在共享对象中来使它可用。

一个常用的构造是将方法存储在$doc中。在 JavaScript 中,像这样保存您的方法:

document.addNewSection = new function(name) {addNewSection(name);};

然后像这样在 GWT 本机方法的 jsni-body 中使用它:

$doc.addNewSection(name);

(如果需要,您也可以将 JSNI $wnd 与 JS window 一起使用)

另请参阅:

GWT 代码(默认情况下)在隐藏的 iframe 中运行,您的脚本在该框架中不可用。有一个 $wnd 变量引用封闭浏览上下文(您的脚本已加载的位置)的 Window 对象。因此,您必须在函数前加上 $wnd 前缀,以引用在外部浏览上下文中定义的函数:

public native void addJsModule(String name) /*-{
    $wnd.addNewSection(name);
}-*/;

http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#writing

Note that the code did not reference the JavaScript window object directly inside the method. When accessing the browser’s window and document objects from JSNI, you must reference them as $wnd and $doc, respectively. Your compiled script runs in a nested frame, and $wnd and $doc are automatically initialized to correctly refer to the host page’s window and document.