在GWT应用中加载Google jsapi

时间:2013-09-03 15:37:50

标签: java gwt jsni jsapi

我正在尝试在我的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工作和引用?

2 个答案:

答案 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,但这对我有用。