这两天被一个问题缠住了,JS原生Ajax返回的数据不能正常被js其它地方调用以及调用后页面在F12开发者模式下能正常显示,关闭F12就不正常。关于问题说明如下:
1、JS原生Ajax返回的数据不能正常被js其它地方调用:
因为Ajax默认是异步返回,所以走完Ajax其它地方的JS早已加载完毕,其它地方是引用不到该处的值的(包括你自己设置一个全局变量,想通过这个全局变量来赋值获取,同样不行),还有一个原因就是“异步”,但是你改为同步仍然不行,切记。
2、调用后页面在F12开发者模式下能正常显示,关闭F12就不正常:
这里面原因是因为我在js代码里用了console的缘故,console在IE浏览器中兼容性很差,导致F12模式下智能识别console不报错,但是关闭F12就不识别console(其实这么说不怎么准确,只是个人这么理解,详见https://developer.mozilla.org/zh-CN/docs/Web/API/Console)。IE想用console的解决方法就是在js开始加入如下代码:
window.console = window.console || (function () {
var c ={};
c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile= c.clear = c.exception = c.trace = c.assert = function(){};
return c;
})();
综上,本次开发过程中问题解决后的代码如下:
window.console = window.console || (function () {
var c ={};
c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile= c.clear = c.exception = c.trace = c.assert = function(){};
return c;
})();
var gettime = function(obj) { //本页面其他方法都是为本方法服务的
var t1 = obj.time; //此处就是需要Ajax返回结果的地方(流程接收时间),
var t2 = (new Date()).getTime(); //当前时间
var t3 = document.getElementById("Ins_CD1TB1R15C1FD196").value; //限时天数
var days = t3 - Math.floor((t2 - t1) / (1000 * 60 * 60 * 24)); //计算时间差
document.getElementById("Ins_CD1TB1R13C3FD346").value = '';
if (days > 0) {
document.getElementById("Ins_CD1TB1R13C3FD346").value = 0;
} else {
document.getElementById("Ins_CD1TB1R13C3FD346").value = days;
}
}
function getQueryString(name) { //从地址栏获取需要的参数的方法
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]);
return null;
}
function getLastSegmentTime(gettimeCallback) {
var processid = getQueryString("processId"); //从地址栏获取流程id
if (processid !== null) { //Ajax获取后台数据
var xhr = new XMLHttpRequest(); //创建
xhr.open("get", "../archivestask/searchProcessId.do?processid=" + processid, true); //连接
xhr.send(null); //发送
xhr.onreadystatechange = function () { //监听状态、处理数据
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
console.log(0); //关闭F12会异常的罪魁祸首
var return_obj = eval('(' + xhr.responseText + ')'); //后台返回数据
gettimeCallback(return_obj);
} else {
alert("Request was unsuccessful: " + xhr.status);
}
}
};
}
}
// 页面完成加载处理
function loadFinishDeal() {
getLastSegmentTime(gettime);
}
loadFinishDeal();
补充:后台往前台Ajax返回数据时代码片段如下:
JSONObject json = new JSONObject();
json.put("time", time); //time为从数据库已经获取到的值
//解决前台乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//取得流向JSP传递数据
response.getWriter().println(json.toString());
return null;