无法通过 JSNI 调用注入的谷歌地图 v3 api:$wnd.google.maps.LatLng 不是构造函数

发布于 2025-01-02 21:57:19 字数 1427 浏览 1 评论 0原文

我正在尝试使用 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
    });
}-*/;

I am trying use google maps by JSNI,Following code snippet throws out an exception:

com.google.gwt.core.client.JavaScriptException: (TypeError): $wnd.google.maps.LatLng is not a constructor at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:248)
.....

can anybody help me to point out what's wrong here?

@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
    });
}-*/;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北座城市 2025-01-09 21:57:19

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

Can you try passing the third optional boolean parameter for noWrap? Maybe you are running into some bug with DevMode. Have you tried running the same code once the app is deployed?

墨落画卷 2025-01-09 21:57:19

在加载第一个 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

The MAP API is injecting other JavaScript library, after the first is loaded.

For loading the Map API after the page load Google provides an additional parameter callback. The callback method is call after the API is loaded.

To get it work youo have to register a GWT Method that can be called from a outside javascript block.

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

Excecute this method on you onModuleLoad and it can be excecuted from outside java script like this:

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

What is missing is the injection of the map API in your GWT code:

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);

After the script is load the init method is excuted.

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

See here Loading Client-side APIs

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文