谷歌地图加载了Ajax
google maps loaded with ajax
我有一个网站(使用jquery bbq
),当收到响应时,ajax请求被触发,正文中某处的div
被替换。大致如下:
var mainContent = $('#main_content');
if ( cache[ url ] ) {
mainContent.fadeOut(duration, function() {
mainContent.html(cache[ url ]);
mainContent.fadeIn(duration, function() {
$(document).trigger("ajax_loaded");
});
});
} else {
mainContent.fadeOut(duration, function() {
var postAjaxCallback = function() {
cache[ url ] = mainContent.html();
$(document).trigger("ajax_loaded");
};
$('#loading').fadeIn(duration, do_ajax(url, duration, postAjaxCallback));
} );
}
function do_ajax(linkVal, duration, callback) {
$.ajax({
type: "GET",
url: linkVal,
dataType: "html",
success: function(page){
var mainContent = $('#main_content');
mainContent.stop(true, true);
if(parseInt(page)!=0)
{
mainContent.html(page);
$('#loading').fadeOut(duration, function() {
mainContent.fadeIn(duration, callback);
} );
}
}
});
}
现在总的来说,这很好用。主页是这样的:
<html>
<head>
...
</head>
<body>
<div id="main_content");
<p>Hello world!</p>
</div>
/body>
</html>
阿贾克斯对#page2
的回报是这样的
<p>Hello to a different world!</p>
在#page3
它变得有点复杂。返回的 ajax 是:
<script type="text/javascript">
function initialize() {
var mapOptions = {
zoom: 11,
streetViewControlOptions: true,
center: new google.maps.LatLng(26.737792, 49.878273),
mapTypeId: google.maps.MapTypeId.SATELLITE
}
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
}
function loadScript() {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize";
document.body.appendChild(script);
}
loadScript();
$(document).bind("ajax_loaded", function() {
console.log("map resize called");
google.maps.event.trigger(map, 'resize');
});
</script>
现在第一次加载#page3
时,一切正常,控制台日志触发并调整地图大小(由于灰色区域问题需要调整大小)。现在我想发生的是所有其他页面继续正常加载(通过 ajax 调用或从缓存),并且当再次导航到#page3
时(即从缓存设置#("main_content")
,resize 事件再次触发。我想用最简单的术语来说,我正在尝试创建一个在每个 ajax 页面加载后触发的事件,我可以在每个 ajax 检索到的页面上都有一个自定义$(document).bind("ajax_loaded", function() {});
,可以执行我需要的任何后处理。目前表现出的行为是在我加载#page3
之前什么都不会发生(正如我提到的,地图被调整了大小,一切都是肉汁)。之后,每个页面加载都会触发绑定函数并打印到控制台(我想既然我已经将其绑定到$(document)
,是否有更好的办法使其对每个页面都唯一?但是,真正的痛苦是,当我尝试重新加载#page3
时,地图会加载但未调整大小(控制台仍在打印),因此我在地图上有灰色区域。谁能帮助我有限的JavaScript经验来获得正确的工作流程。重申:
- 每个 ajax 加载(或从缓存加载)都会触发一些事件
- 在每个 ajax 页面(
#page1
、#page2
等)中,都会有一个从上述步骤触发的函数,该函数可以为每个 ajax 页面执行唯一的设置。
感谢您的帮助!
编辑我尝试使用以下方法:
mainContent.find("script").each(function(i) {
eval($(this).text());
});
而不是触发ajax_loaded
事件,但无济于事。还有什么我可以尝试的吗?
当第二次添加谷歌地图 API 时,一切都搞砸了(重新加载 #page3
.它会导致一些错误,脚本的其余部分可能会停止工作。尝试将谷歌地图API的加载包装到条件if (typeof google === 'undefined') { ...
中。
但说实话,整个概念可能需要一些重构:)。
- 无法在通过jQuery的ajax加载的页面中执行javascript
- 获取ajax加载的图像的大小
- 分页:如何用AJAX加载第一个页面
- 页面加载之前的jQuery Ajax加载程序
- ajax加载了内容,脚本没有执行
- 如何使用post和ajax加载视图Codeigniter
- $(select).selectmenu('打开')不'如果使用ajax加载页面,则不起作用
- ajax加载()后,包含图表的图像不会重新绘制
- 如果数据为空,Ajax加载不会停止
- 防止用户在jQuery Mobile中ajax加载页面时单击其他位置
- 将内容ajax加载到html弹出窗口中
- 导航栏和AJAX加载
- 用于各个元素的Ajax加载程序
- 通过AJAX加载页面并执行javascript和CSS
- 使用ajax加载页面的一部分
- 从表单中动态生成一个字符串,传递给通过AJAX加载的PHP文件
- 显示全屏Ajax加载程序的最佳方式
- 获取通过AJAX加载的元素
- 如何在rails应用程序中测试AJAX加载的内容
- 如何在Ajax加载新内容时停止JavaScript执行