我有一个要求,我必须从javascript调用java GWT方法,但它不起作用。没有异常被抛出,但应用程序挂起了某个地方并且代码没有运行。当我不打电话时,应用程序正常工作。我的GWT-Compile是成功的。我正在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或者首先注册该本机方法还是什么?
答案 0 :(得分:3)
我觉得你在这里有点困惑。
只有在单击链接之前已从Java代码调用jsCallViewDocument()
时,您的代码才会起作用 - 否则$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);
}
答案 1 :(得分:0)
javascript:
属性中不需要onClick
(与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代码中分配事件监听器?