我正在使用Google Maps JavaScript API在我的移动网站中加载地图。当我从上一页导航时,地图将无法加载,但如果我按预期刷新页面地图加载。如果我在体内使用JavaScript,即使页面没有加载。我无法弄清楚这个问题。它与上一页代码有关吗?
这是我在Head标签中的代码。
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="css/jquery.mobile-1.1.0.min.css" />
<link href="css/site.css" rel="stylesheet" type="text/css" />
<script src="./js/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
<script type="text/javascript"
src="http://maps.googleapis.com/maps/api/js?key=xxxxxxxx&sensor=false">
</script>
<script type="text/javascript">
function initialize() {
var myLatlng = new google.maps.LatLng(<?php echo $longtitude ?>, <?php echo $latitude ?>);
var mapOptions = {
zoom: 10,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title: 'Location'
});
}
google.maps.event.addDomListener(window, 'load', initialize);
$(document).delegate('#content', 'pageinit', function () {
navigator.geolocation.getCurrentPosition(initialize);
});
</script>
</head>
这是我的身体标签
<body >
<div id="wrapper">
<div class="header">
<a href="index.html"><img src="images/logo-small.png" alt="logo"/></a>
</div>
<div class="back">
<a data-rel="back"><img src="images/back.png"/></a>
</div>
<div id="content">
<div class="list">
<div class="list-items" id="info">
<?php echo "<h3>$sa1<span>$postcode<span>$sa2</span></span></h3><h2>$price</h2>";?>
<br class="clear" />
<br class="clear" />
</div>
</div>
<br class="clear" />
<div id="map-canvas">
</div>
</div>
</div>
</body>
答案 0 :(得分:8)
首先,你为什么要使用jQuery Mobile?我在你当前的例子中没有看到这一点。
在这种情况下,jQuery Mobile是主要问题。因为使用了jQuery Mobile,所有内容都将被加载到DOM中。当您“从上一页导航”页面未刷新且此行:
google.maps.event.addDomListener(window, 'load', initialize);
无法触发。只有在您手动刷新页面时才会触发。
第二件事,你无法使用jQuery Mobile页面事件而没有任何页面。在你的代码中你有这个部分:
$(document).delegate('#content', 'pageinit', function () {
navigator.geolocation.getCurrentPosition(initialize);
});
要成功初始化具有id内容的div,必须有另一个名为data-role =“page”的属性,如下所示:
<div id="content" data-role="page">
</div>
第三件事。让我们假设其他一切都没问题。 Pageinit不会从HEAD触发。当jQuery Mobile加载页面时,它会将它们加载到DOM中,并且只加载BODY部分。因此,为了使您的地图工作,您需要将我们的javascript移动到BODY(包括css)。在你的第一个例子中它没有用,因为你甚至在非页面div容器上触发了页面。
最后一点,如果你想正确使用jQuery Mobile,你需要注意正确版本的jQuery与正确版本的jQuery Mobile一起使用。如果你想安全使用jQ 1.8.3和jQM 1.2
这是一个有效的解决方案:
<!DOCTYPE html>
<html>
<head>
<title>jQM Complex Demo</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi"/>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<script src="http://www.dragan-gaic.info/js/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
</head>
<body>
<style>
#map-canvas {
width: 300px;
height: 300px;
}
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
<script type="text/javascript">
function initialize() {
var myLatlng = new google.maps.LatLng(33.89342, -84.30715);
var mapOptions = {
zoom: 10,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title: 'Location'
});
}
//google.maps.event.addDomListener(window, 'load', initialize);
$(document).on('pageshow', '#wrapper', function(e, data){
initialize();
});
</script>
<div id="wrapper" data-role="page">
<div class="header">
<h3>Test</h3>
<a href="index.html"><img src="images/logo-small.png" alt="logo"/></a>
</div>
<div id="content">
<div id="map-canvas"></div>
</div>
</div>
</body>
</html>
可以在 ARTICLE 中找到有关此主题的工作示例和更多信息。
答案 1 :(得分:2)
只需将data-ajax="false"
添加到链接标记即可重定向到包含地图的网页。例如,如果map.aspx包含您的地图,您可以像这样链接到它:
<a href="map.aspx" data-ajax="false">
&#13;
答案 2 :(得分:1)
我遇到了同样的问题,但我没有任何jquery-mobile libraray或任何其他会与地图冲突的内容。苦苦挣扎,我为我的项目找到了解决方案:
不起作用:
<script src="http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY" async defer>
</script>
Works(删除异步和延迟属性):
<script src="http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
希望!如果其他解决方案不起作用,这可以帮助某人。只有当其他解决方案都无法正常工作时才尝试这一点,因为我们知道google网页速度指南或谷歌地图api指南说使用它是不好的建议。
答案 3 :(得分:1)
I have also same problem with
google.maps.event.addDomListener(window, 'load', initialize);
where initialize is my method .
I just add few line of code before google.maps.event.addDomListener(window, 'load', initialize);
Code is
$(document).ready( function () {
initialize();
});
and this code is working for me
答案 4 :(得分:0)
您应该使用pageload
事件加载所有内容。这样,一旦jquery Mobile完成了所需的所有DOM更改,就会加载所有内容。我遇到了同样的问题,这就是有帮助的。
$(document).on('pageload', function() {
initialize();
});
它位于文档中:http://api.jquerymobile.com/pageload/
编辑:有时它还有助于将标记加载到一个单独的函数中,而不是加载地图的函数。