3

我有一个要求,我必须从 javascript 调用 java GWT 方法,但它不起作用。没有抛出异常,但应用程序挂在某个地方并且代码没有运行。当我不拨打该电话时,该应用程序运行良好。我的 GWT 编译成功。我正在 Firefox 的开发模式下进行测试。

我的代码是这样的 -

class CPClass {

    public native void jsCallViewDocument(String objectId)/*-{
        $wnd.jsCallViewDocument = 
            $entry(this.@com.srre.g0a.client.presenter.impl.viewdoc.CPClass::testJS(Ljava/lang/String;)(objectId));
    }-*/;

    private void testJS(String objectId) {
        SC.say("Call successfull" + objectId);
    }

    private void setDocName(ListGridRecord newRecord, someDTO currDocInfo) {

        String anchorTag = "<a href ='#' onclick = \"javascript:jsCallViewDocument('" 
            +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

        newRecord.setAttribute(Display.GRID_FIELD_DOC_NAME, anchorTag);
    }

}

到目前为止,我已经使用 JSNI 进行简单的调用,例如 $wnd.close() 或 $wnd.alert(),所以我可能会遗漏一些东西。我的类(定义了 Native 方法和要调用的方法)是否需要扩展 JavaScriptObject 或者该本地方法是否需要先注册?

4

2 回答 2

3

我想你在这里有点困惑。

只有在单击链接之前您已经jsCallViewDocument()从 Java 代码中调用了您的代码,否则该$wnd.jsCallViewDocument函数将不存在。

在这种情况下,将字符串传递给函数是没有意义的。

您可能想要的是这样的函数:

public static native void setupJsCallViewDocument(CPClass p) /*-{
    var fn = function(objectId) {
        // invoke our (Java) testJS function, passing objectId as a parameter
        $entry(
           p.@com.srre.g0a.client.presenter.impl.viewdoc.CPClass::testJS(Ljava/lang/String;)(objectId)
        );
    };

    // assign this function to the global jsCallViewDocument
    $wnd.jsCallViewDocument = fn;
}-*/;

现在在您的setDocName功能中:

private void setDocName(ListGridRecord newRecord, someDTO currDocInfo) {
    // set up the native function call
    setupJsCallViewDocument(this);

    String anchorTag = "<a href ='#' onclick = \"javascript:jsCallViewDocument('" 
        +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

    newRecord.setAttribute(Display.GRID_FIELD_DOC_NAME, anchorTag);
}
于 2012-08-29T13:50:12.663 回答
0

您不需要javascript:inonClick属性(与href属性相反)

切换到:

String anchorTag = "<a href ='#' onclick = \"jsCallViewDocument('" 
        +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

或者:

String anchorTag = "<a href = \"javascript:jsCallViewDocument('" 
        +  currDocInfo.getDocName() + "')\">" + currDocInfo.getDocName() + "</a>";

顺便说一句,为什么不在 java gwt 代码中分配事件监听器?

于 2012-08-29T09:18:33.953 回答