jquery-mobile – 有没有办法用jquery mobile预加载谷歌地图?

前端之家收集整理的这篇文章主要介绍了jquery-mobile – 有没有办法用jquery mobile预加载谷歌地图?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用jQuery Mobile 1.4和Google Maps JavaScript API v3的Phonegap应用程序.

地图需要几秒钟才能在移动设备上加载,有时会更长.我正在尝试“预加载”地图页面,以便在用户导航到页面时立即显示.

我试过的一些事情都失败了:

$.mobile.pageContainer.enhanceWithin();在app load上创建页面.它会创建地图,但除非在页面显示上触发调整大小,否则不会显示地图.

在app load上创建地图,然后在pageshow上触发地图调整大小,以便刷新地图大小.也许有点快,但仍然需要等待,因为原始地图没有呈现正确的大小,所以你需要调整大小.

手动设置地图容器的css高度/宽度,并在应用启动时加载地图.正确的容器大小,但仍需要触发调整大小.

最佳解决方案是在应用程序加载的后台加载完整的地图页面(加上一些额外的图块以防滚动),然后当用户导航到它时,它已经传播.

解决方法

您可以通过在第一页完全加载并显示后加载地图画布来实现此目的.但是,地图画布应放在当前视口中不可见的div中.使用display:none;在地图画布上将破坏结构,并在将它从div移动到另一个时变得无响应.

另一个重要的注意事项,内容div的高度在创建页面之前和之后始终为0.因此,应该预定义内容div的高度,以便在地图画布加载到后台后容纳地图画布.

>第一步:

在任何页面div之外创建一个地图占位符,并通过更改其位置CSS属性确保它不在视口视图中.在地图占位符内,添加地图画布div.此外,删除内容div填充以填充整个可用区域.

> HTML

  1. <div id="mapPH">
  2. <div id="map-canvas"></div>
  3. </div>

> CSS

  1. #mapPH {
  2. position: absolute;
  3. top:-999;
  4. z-index: -9999;
  5. }
  6.  
  7. .ui-content {
  8. padding: 0;
  9. }

>第二步:

在任何jQM的页面事件上,只能将地图加载到地图画布一次.one().一旦完全加载,移动到其“新父级”.您可以通过收听tilesloaded事件在加载后自动移动它,也可以移动一次以更改为地图页面.

  1. var mapOptions = {
  2. center: new google.maps.LatLng(36.4875,-4.9525),zoom: 16,mapTypeId: google.maps.MapTypeId.HYBRID,mapTypeControl: false,streetViewControl: false,zoomControlOptions: {
  3. position: google.maps.ControlPosition.RIGHT_BOTTOM
  4. }
  5. };
  6. var map = new google.maps.Map($(canvas)[0],mapOptions);
  7. var marker = new google.maps.Marker({
  8. position: new google.maps.LatLng(36.4875,map: map,title: 'Hello World!'
  9. });
  10.  
  11. /* move map once fully loaded
  12. by listening to "tilesloaded".
  13. Remove "placeholder" after moving the map */
  14. google.maps.event.addListener(map,'tilesloaded',function () {
  15. $("#map .ui-content").append($("#mapPH #map-canvas"));
  16. $("#mapPH").remove();
  17. });
  18.  
  19. /* or choose any other method to move it */
  20. $(".selector").on("click",function () {
  21. $("#map .ui-content").append($("#mapPH #map-canvas"));
  22. $("#mapPH").remove();
  23. });

>第三步:

这是棘手的部分,地图画布的尺寸(宽度和高度).正如我之前提到的,内容div的高度应该手动或使用以下函数动态预定义.

  1. function canvasHeight(canvas) { /* canvas = map's canvas ID */
  2. var canvasPage = $(canvas).closest("[data-role=page]").length !== 0 ? $(canvas).closest("[data-role=page]") : $(".ui-page").first(),screen = $.mobile.getScreenHeight(),header = $(".ui-header",canvasPage).hasClass("ui-header-fixed") ? $(".ui-header",canvasPage).outerHeight() - 1 : $(".ui-header",canvasPage).outerHeight(),footer = $(".ui-footer",canvasPage).hasClass("ui-footer-fixed") ? $(".ui-footer",canvasPage).outerHeight() - 1 : $(".ui-footer",newHeight = screen - header - footer;
  3. $(canvas).height(newHeight);
  4. $(canvas).width($(window).width());
  5. }

加载地图画布以及移动地图画布时,应调用函数.但是,要获取实际尺寸,此处需要setTimeout(),因为仍未创建要移动到的页面.如果未创建页面,则不会获得该页面中元素的实际/真实高度.

更新:地图画布的尺寸应在两个事件,throttledresize和orientationchange上更新.

  1. $(window).on("throttledresize orientationchange",function () {
  2. canvasHeight("#map-canvas");
  3. });

以下是完整的代码以获得更多说明.

  1. /* map canvas dimensions */
  2. function canvasHeight(canvas) {
  3. var canvasPage = $(canvas).closest("[data-role=page]").length !== 0 ? $(canvas).closest("[data-role=page]") : $(".ui-page").first(),newHeight = screen - header - footer;
  4. $(canvas).height(newHeight);
  5. $(canvas).width($(window).width());
  6. }
  7.  
  8. /* map canvas loading */
  9. function loadMap(canvas) {
  10. var mapOptions = {
  11. center: new google.maps.LatLng(36.4875,zoomControlOptions: {
  12. position: google.maps.ControlPosition.RIGHT_BOTTOM
  13. }
  14. };
  15. var map = new google.maps.Map($(canvas)[0],mapOptions);
  16. var marker = new google.maps.Marker({
  17. position: new google.maps.LatLng(36.4875,title: 'Hello World!'
  18. });
  19. /* option 1: moving map once loaded */
  20. google.maps.event.addListener(map,function () {
  21. $("#map .ui-content").append($("#mapPH #map-canvas"));
  22. $("#mapPH").remove();
  23. });
  24. }
  25.  
  26. /* load map in background
  27. once first page is shown
  28. and update its' dimensions */
  29. $(document).one("pagecontainershow",function () {
  30. canvasHeight("#map-canvas");
  31. loadMap("#map-canvas");
  32.  
  33. /* option 2: move map on "click"
  34. and update its' dimensions */
  35. $(".showMap").one("click",function () {
  36. $("#map .ui-content").append($("#mapPH #map-canvas"));
  37. setTimeout(function () {
  38. canvasHeight("#map-canvas");
  39. },500);
  40. $("#mapPH").remove();
  41. });
  42. });
  43.  
  44. /* update map canvas dimensions
  45. when window is resized and changing orientation */
  46. $(window).on("throttledresize orientationchange",function () {
  47. canvasHeight("#map-canvas");
  48. });

07000

猜你在找的jQuery相关文章