在GWT中从jsni调用外部函数

时间:2015-07-22 15:06:07

标签: gwt jsni

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

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

  

请注意,代码没有直接在方法中引用JavaScript window对象。从JSNI访问浏览器的窗口和文档对象时,必须分别将它们引用为$wnd$doc。编译后的脚本在嵌套框架中运行,$wnd$doc会自动初始化,以正确引用主页的窗口和文档。

答案 1 :(得分:1)

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

常用的构造是将方法存储在$doc中。在JavaScript中保存您的方法:

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

然后在你的GWT原生方法的jsni体中使用它,如下所示:

$doc.addNewSection(name);

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

另见: