GWT:getElementById()的JSNI函数调用返回Null
我正在尝试使用JSNI在应用程序中显示Google地图。我已经在index.html页面中定义了脚本 以下是uibinder的定义(简而言之): 不幸的是,mapDiv为null。有人帮忙吗GWT:getElementById()的JSNI函数调用返回Null,gwt,jsni,Gwt,Jsni,我正在尝试使用JSNI在应用程序中显示Google地图。我已经在index.html页面中定义了脚本 以下是uibinder的定义(简而言之): 不幸的是,mapDiv为null。有人帮忙吗 我知道gwt地图和gwt-maps-v3项目。第一个只支持API的v2,gwt-maps-v3对我来说不起作用,因此采用JSNI方法。原则上,您的代码应该可以工作,我已经很快对其进行了测试(顺便说一句,它不应该与Google maps API有任何关系) 唯一重要的是,在调用initializeMap()之
我知道gwt地图和gwt-maps-v3项目。第一个只支持API的v2,gwt-maps-v3对我来说不起作用,因此采用JSNI方法。原则上,您的代码应该可以工作,我已经很快对其进行了测试(顺便说一句,它不应该与Google maps API有任何关系) 唯一重要的是,在调用
initializeMap()
之前,将添加到文档中
请尝试以下操作:
@覆盖
moduleload()上的公共void{
RootPanel.get().add(new MyUiBinderWidget());//使用map div创建小部件
初始化映射();
}
特别要注意的是,您不能从MyUiBinderWidget
的构造函数内部调用initializeMap()
,因为此时小部件还没有附加到文档。@Jason:将initializeMap()
直接放在initWidget(…)
后面太早,无法工作。(请看我在回答中添加的最后一段。)好的,我读得太快了,删除了我的其他评论。如果我不能在构造函数中完成,那么最好的地方是哪里?@Jason:在我看来,最好的地方是在调用构造函数之后,并且小部件已经添加到文档中-就像上面的例子一样。好的,重载widget.onLoad()似乎至少填充了div,不再抛出异常。谢谢,克里斯。@Jason:将调用放入onLoad()
一方面很好,但另一方面,它可能会引入一个棘手的错误:如果您将UiBinder小部件重新连接(即移动)到另一个父级(这是完全允许的),那么onLoad()
将再次被调用-我想,这可能不是您想要的。
<g:HTMLPanel ui:field="mapboxV3ContentPanel">
<!-- div for display of the actual map -->
<div id="map"><!-- --></div>
</g:HTMLPanel>
private native void initializeMap() /*-{
var latLng = new $wnd.google.maps.LatLng(-34.397, 150.644);
var mapOptions = {
zoom: 8,
center: latLng,
mapTypeId: $wnd.google.maps.MapTypeId.ROADMAP
};
var mapDiv = $doc.getElementById('map');
if (mapDiv==null) {
alert("MapDiv is null!");
}
var map = new $wnd.google.maps.Map(mapDiv, mapOptions);
}-*/;