我正在尝试在我的GWT应用程序中使用谷歌的JavaScript API(使用谷歌可视化),而我在JSNI中引用谷歌对象时遇到了麻烦。我收到了一个javascript错误:“google未定义”。
我知道有一个GWT包装器API,但它没有我需要的功能。我按照这里的所有建议:use visualization api of google in GWT但我仍然收到此错误。
我已将此行添加到我的gwt.xml文件中:
<script src="https://www.google.com/jsapi"></script>
我不确定把它放在哪里所以我把它添加到我的主标签下面。其他堆栈问题说添加它以将其添加到我的HTML中,所以我假设这是他们的意思。
这是我正在调用的被剥离的本机方法,它产生了“google is not defined”错误:
public static native void nativeJavaScriptFunction() /*-{
google.load('visualization', '1.0', {
'packages' : [ 'corechart' ]
});
}-*/;
我还尝试将Google引用为“$ wnd.google”和“$ doc.google”。我正在使用最新版本的GWT 2.5.1。是否有其他人在JSNI方法中有任何javascript api工作和引用?
答案 0 :(得分:2)
您可以使用ScriptInjector代替在主机页面中添加该脚本标记,而不是:
ScriptInjector.fromUrl("http://api.elsevier.com/javascript/scopussearch.jsp").setCallback(new Callback<Void, Exception>() {
@Override
public void onFailure(Exception reason) {
throw new UnsupportedOperationException("FAILURE to inject Scopus API !!!");
}
@Override
public void onSuccess(Void result) {
System.out.println("Elsevier scopus search API successfully injected...");
}
}).setWindow(ScriptInjector.TOP_WINDOW).inject();
然后您应该能够通过JSNI成功使用注入的API。
答案 1 :(得分:0)
我找到了解决方案。首先,我不想将该脚本标记添加到gwt.xml文件中。我没有意识到我的应用程序有一个主HTML文件。我把它添加到那里的head标签。
<script type="text/javascript" src="https://www.google.com/jsapi" ></script>
然后,我可以通过$ wnd.google在JNSI中引用google对象。虽然我仍然遇到实际负载调用问题。它导致页面清晰,只是挂起。我决定尝试使用从GWT包装器API中从VisualationUtils中提取的代码来加载API。
AjaxLoaderOptions options = AjaxLoaderOptions.newInstance();
options.setPackages("corechart");
AjaxLoader.loadApi("visualization", "1", new Runnable() {
@Override
public void run() {
jsniCall();
}
这就是诀窍。我仍然想知道为什么我不能在JSNI方法中加载API,但这对我有用。