1

我正在尝试通过 JSNI 使用谷歌地图,以下代码片段抛出异常:

com.google.gwt.core.client.JavaScriptException: (TypeError): $wnd.google.maps.LatLng 不是 com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:248) 的构造函数。 ……

谁能帮我指出这里出了什么问题?

@Override
public void init(final Point center, final int zl)
{
    ScriptInjector
            .fromUrl(   "http://maps.googleapis.com/maps/api/js?sensor=false&language="
                                + Cookies.getCookie(LocaleInfo.getLocaleCookieName()))
            .setWindow(ScriptInjector.TOP_WINDOW).setCallback(new Callback<Void, Exception>()
            {
                public void onFailure(Exception reason)
                {
                    // I18N
                    Window.alert("load google maps api failed,all map function will not work.");
                }

                public void onSuccess(Void result)
                {
                    map = initMap(getElement(), center.getLatitude(), center.getLongitude(), zoomLevel = zl);
                }
            }).inject();
}

native JavaScriptObject initMap(Element canvas, double latitude, double longitude, int zoomLevel) /*-{
    return new $wnd.google.maps.Map(canvas, {
        zoom : zoomLevel,
        center : new $wnd.google.maps.LatLng(latitude, longitude),
        mapTypeId : $wnd.google.maps.MapTypeId.ROADMAP
    });
}-*/;
4

2 回答 2

0

您可以尝试为 传递第三个可选布尔参数noWrap吗?也许您遇到了 DevMode 的一些错误。部署应用程序后,您是否尝试过运行相同的代码?

于 2012-02-08T10:30:33.393 回答
0

在加载第一个 JavaScript 库后,MAP API 正在注入其他 JavaScript 库。

为了在页面加载后加载 Map API,Google 提供了一个额外的参数回调。回调方法在 API 加载后调用。

要让它工作,你必须注册一个可以从外部 javascript 块调用的 GWT 方法。

   public static native void exportStaticMethod() /*-{
    $wnd.mapInit = $entry(@com.my.test.client.MyProject::init());
   }-*/;

在您的 onModuleLoad 上执行此方法,它可以从外部 java 脚本中执行,如下所示:

function initialize()
{
        window.mapInit();
}

缺少的是在您的 GWT 代码中注入地图 API:

ScriptElement element = Document.get().createScriptElement();
    element.setLang("javascript");
    element.setType("text/javascript");
    element.setSrc("https://maps.googleapis.com/maps/api/js?callback=initialize&sensor=false");
    Document.get().getElementsByTagName("head").getItem(0).appendChild(element);

加载脚本后,将执行 init 方法。

private static void init()
{
    System.out.println("loaded");
}

请参阅此处加载客户端 API

于 2015-07-31T08:58:40.073 回答