jquery ajax因异步设置不当导致页面局部内容(load())刷新不显示的问题总结
需求背景
会议管理系统,页面布局为上左右标准布局,左侧为菜单列表。
开始进入系统时是列表信息,点击列表时,进入某个会议,同时刷新左侧的菜单,把左侧会议的功能列表菜单加载进来。
主页代码:
<div class="header">
<%@ include file="/pages/admin/pri/frames/topFrame.jsp" %>
</div>
<div class="main">
<div name="left_frame" id="left_frame" class="left_nav">
<%@ include file="/pages/admin/pri/frames/leftFrame.jsp" %>
</div>
<div class="pages">
<iframe src="${ctx}/pages/admin/pri/meeting/listMeeting.action" id="mainFrame" name="mainFrame" width="100%"
οnlοad="Javascript:SetCwinHeight(this.id)" marginwidth="0" height="100%"
marginheight="0" scrolling="auto" frameborder="0" hspace="0" vspace="0"></iframe>
</div>
</div>
原实现方式:
点击列表的编辑功能:
触发编辑事件:
function modify(mId){
window.location.href = "${ctx}/pages/admin/pri/meeting/getMeetingById.action? meeting="+ mId;
showEditMenu("${ctx}", mId);
}
每个子页面包含函数:
function showEditMenu(contentPath,meetingId){
$(window.parent.document).contents().find("#left_frame").load(contentPath+
"/admin/pri/basemenu/toManagerMeetingMenu.action",
{
"meetingId": meetingId
},
doCallBack
);
function doCallBack (response,status,xhr){
//alert(response);
}
}
出现的问题的现象:
在IE FIREFOX下显示正常。Chrome safari下怎么点也却显示不了左侧的会议菜单。
问题排查:
1.排查原因后,推测chrome,safari下dom对象解析不一致。排除不是
2.load方法自身或许有问题。重新用$.ajax方法来写,还是大多数时候显示不出来。
最后排查是因为modify方法同时触发了两个动作,而ajax默认设置是异步的,左侧页面就加载不出来了。
知道症结,问题迎刃而解了。两种改写实现方式:
第一种:维持原有代码不变,把ajax的异步设置全局修改为false(默认是true)
$.ajaxSetup({async: false});
第二种:用$ajax()方法重写原功能,把获取的返回结果用.html()方法设置进去即可。
参考代码:
$.ajax({
type: "get",
url: contentPath+"/admin/pri/basemenu/toManagerMeetingMenu.action?meetingId="+meetingId,
dataType: "html",//(可以不写,默认)
timeout: 300,
async : false,
beforeSend: function(XMLHttpRequest){
//alert(contentPath+"/admin/pri/basemenu/toManagerMeetingMenu.action?meetingId="+meetingId);
},
success: function(data, textStatus){
// alert(data);//data是一个字符串对象
$(window.parent.document).contents().find("#left_frame").html(data);
},
complete: function(XMLHttpRequest, textStatus){
},
error: function(){
//请求出错处理
alert("load menu error");
}
});
本来很诡异的问题就出在async : false的设置上!
以后得注意这个属性的设置。