我正在构建一个使用Web SQL本地存储的GWT应用程序( http://dev.w3.org/html5/webdatabase/).问题是Web SQL API使用回调函数作为参数.
是否可以将"Java"回调传递给JSNI?
我正在托管模式下运行GWT应用程序.偶尔我会HostedModeException抱怨从JSNI返回的JS值的类型.有时它是在反序列化期间:
com.google.gwt.dev.shell.HostedModeException: Something other than an int was returned from JSNI method '@com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader::readInt()': JS value of type boolean, expected int
at com.google.gwt.dev.shell.JsValueGlue.getIntRange(JsValueGlue.java:266)
at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:144)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeInt(ModuleSpace.java:247)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeInt(JavaScriptHost.java:75)
at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.readInt(ClientSerializationStreamReader.java)
Run Code Online (Sandbox Code Playgroud)
有时在:
com.google.gwt.dev.shell.HostedModeException: Something other than an int was returned from JSNI method '@com.google.gwt.user.client.impl.DOMImpl::eventGetTypeInt(Ljava/lang/String;)': JS value of type null, expected int
at com.google.gwt.dev.shell.JsValueGlue.getIntRange(JsValueGlue.java:266)
at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:144)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeInt(ModuleSpace.java:247)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeInt(JavaScriptHost.java:75)
at com.google.gwt.user.client.impl.DOMImpl.eventGetTypeInt(DOMImpl.java)
at com.google.gwt.user.client.impl.DOMImpl.eventGetTypeInt(DOMImpl.java:62)
at com.google.gwt.user.client.DOM.eventGetType(DOM.java:602)
at com.google.gwt.user.client.Event$.getTypeInt$(Event.java:695)
at com.extjs.gxt.ui.client.util.BaseEventPreview.onPreviewNativeEvent(BaseEventPreview.java:139)
Run Code Online (Sandbox Code Playgroud)
再一次
com.google.gwt.dev.shell.HostedModeException: Something other than a float was returned from …Run Code Online (Sandbox Code Playgroud) 我是GWT和JavaScript的新手.我试图遵循这种类型的类似问题,但我一直都在失败.
我有一个GWT应用程序,我需要从Javascript调用Java函数(尤其是在href标签的onclick上.)以下是我所做的.
public class JSNITest {
public static void handleAnchorClick(int a , int b) {
Window.alert("Current row and Column is " + a + " " + b);
}
public static native void exportMyFunction()/*-{
$wnd.handleAnchorClick = function(param1,param2){
@company.package.class.JSNITest::handleAnchorClick(*)(param1,param2);
}-*/;
}
Run Code Online (Sandbox Code Playgroud)
在HTML中,
<a href="javascript:handleAnchorClick(a1,a2);">link</a>
Run Code Online (Sandbox Code Playgroud)
(a1 , a2)是我的代码中的两个整数变量.我还在入口点函数中调用了EnclosingClass.exportMyFunction().我一直遇到各种异常(No Such class exception).有人可以纠正我吗?
问候
我有一个GWT项目,我想在GWT项目的主html文件中添加一个脚本标记,该文件调用位于我的客户端代码中的Java函数.
根据文档,我应该添加类似下面的html标记:
<script type='text/javascript'>
this.@com.myCompany.myProject.client.myClass::myFunction();
</script>
Run Code Online (Sandbox Code Playgroud)
其中com.myCompany.myProject.client.myClass是类路径,myFunction是我想调用的java函数.
当我尝试使用myFunction的以下实现时,没有任何反应:
public void myFunction() {
HTMLPanel panel = new HTMLPanel("I have been called");
RootPanel.get().add(panel);
}
Run Code Online (Sandbox Code Playgroud)
也就是说,myFunction没有被调用.
但是当我从JSNI方法进行相同的调用时,它就可以工作了.
是否可能无法通过html脚本进行调用,或者我做错了什么?
谢谢!
找不到有关此功能的任何开发人员信息.我只知道建议用这个$entry函数将JSNI JavaScript调用包装到Java方法中.我发现它捕获了异常,因此Java代码可以处理它们.这就是它的全部吗?
我无法使用
$("#"+profileId).offset().top
Run Code Online (Sandbox Code Playgroud)
从我的gwt jsni函数里面.我试过这个
$wnd.$("#"+profileId).offset().top
Run Code Online (Sandbox Code Playgroud)
但这也行不通.我觉得我在这里缺少语法.可以有人帮忙吗
(仅此标题应该让人们从木制品中走出来用棍棒打击我,但是听我说话).
我有一个用例,我需要从异步调用返回一个值.(我正在使用GWT-Platform,但概念是相同的.)我声明了最终的JavaScriptObject数组,然后在AsyncCallback中分配了值.但是,我需要返回值,并且该方法在AsyncCallback完成之前返回.因此,我需要以某种方式阻止,直到AsyncCallback完成.我需要在另一个方法中返回值,或者我只是在onSuccess()中执行我需要的操作.
我已经尝试过循环,定时器和其他一些没有运气的方法.有人可以帮忙吗?
@Override
public JavaScriptObject doGetWhereAmIMarker(final double lng, final double lat) {
final JavaScriptObject[] markerArray = new JavaScriptObject[1]; // ugly hack, I know
dispatch.execute(new GetLocationDescriptionsAction(lng, lat), new AsyncCallback<GetLocationDescriptionsResult>() {
@Override
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
@Override
public void onSuccess(GetLocationDescriptionsResult result) {
Map<String, Location> resultMap = result.getResult();
StringBuffer message = new StringBuffer();
for (String key : resultMap.keySet()) {
message.append(key).append(": ").append(resultMap.get(key)).append("\n");
}
Map tempMap = new HashMap();
tempMap.put("TITLE","Location Information");
tempMap.put("LAT", lat);
tempMap.put("LNG", lng);
tempMap.put("CONTENTS", message.toString());
JavaScriptObject marker = GoogleMapUtil.createMarker(tempMap); …Run Code Online (Sandbox Code Playgroud) 是否可以从Javascript调用Java(GWT)方法?从文档中还不清楚.此处的所有示例http://code.google.com/intl/ru/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html演示了如何从JSNI(非JS)函数调用java函数.
更新1
这是一个Java代码:
public class Test_GoogleWeb_JSNI_02 implements EntryPoint {
/**
* This is the entry point method.
*/
public void onModuleLoad() {
}
public static void Callee() {
Window.alert("Callee");
}
}
Run Code Online (Sandbox Code Playgroud)
这是html中的调用者按钮示例:
<input type='button' value='Call' onclick='Test02()'>
Run Code Online (Sandbox Code Playgroud)
这里有一些我尝试过但没有用过的功能:
<script type="text/javascript">
function Test01() {
@com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee()();
}
function Test02() {
com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee()();
}
</script>
Run Code Online (Sandbox Code Playgroud)
更新2
以下工作.
Java准备:
public void onModuleLoad() {
Prepare();
}
public static native void Prepare() /*-{
$doc.calleeRunner = @com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee();
}-*/;
public static void Callee() {
Window.alert("Callee");
}
Run Code Online (Sandbox Code Playgroud)
呼叫者:
function …Run Code Online (Sandbox Code Playgroud) 从手册中无法理解:如何从Java运行JS函数?
例如,我的html页面中有一个函数:
<script type="text/javascript" language="javascript">
function foo() {
alert('Foo!');
}
</script>
Run Code Online (Sandbox Code Playgroud)
以下模块显示了两个按钮,其中只有第二个按钮有效:
public class Test_GoogleWeb_JSNI_01 implements EntryPoint {
public void onModuleLoad() {
Button fooButton = new Button("Foo!");
fooButton.addClickHandler(new ClickHandler(){
public void onClick(ClickEvent event) {
fooRunner();
};
});
HTML fooButtonNative = new HTML();
fooButtonNative.setHTML("<input type='button' value='Foo Native' onclick='foo()'>");
RootPanel rootPanel = RootPanel.get();
rootPanel.add(fooButton);
rootPanel.add(fooButtonNative);
}
public static native void fooRunner() /*-{
foo();
}-*/;
}
Run Code Online (Sandbox Code Playgroud)
在手册中说,在嵌套框架中实现本机函数,这解释了这种情况.但是如何运行JS函数呢?
更新1 以下工作.
Java的:
public static native void fooRunner() /*-{
$doc.fooRunner();
}-*/;
Run Code Online (Sandbox Code Playgroud)
JS:
<script type="text/javascript" language="javascript">
document.fooRunner …Run Code Online (Sandbox Code Playgroud) 我有一个gwt应用程序,我想使用此方法滚动到页面顶部:
public static native void scrollTop() /*-{
$wnd.scroll(0, 0);
}-*/;
Run Code Online (Sandbox Code Playgroud)
该方法在TreeNodeListenerAdapter的onClick方法中调用:
new TreeNodeListenerAdapter() {
@Override
public void onClick(Node node, EventObject e) {
scrollTop();
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,我不知道为什么.当我在我的方法中放入警报时:
$wnd.alert("Treenode clicked");
Run Code Online (Sandbox Code Playgroud)
我看到了警报,但页面没有滚动.我在这里错过了什么?