3

我正在尝试在我的 GWT 应用程序中使用 Google 的 javascript API(以使用 google 可视化),并且在我的 JSNI 中引用 google 对象时遇到了麻烦。我收到一个 javascript 错误:“未定义谷歌”。

我知道有一个 GWT 包装 API,但它没有我需要的功能。我遵循了这里的所有建议:在 GWT 中使用谷歌的可视化 api,但我仍然收到此错误。

我已将此行添加到我的 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 的工作和引用?

4

2 回答 2

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。

于 2013-09-04T16:08:52.363 回答
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,但这对我有用。

于 2013-09-03T18:42:49.183 回答