今天在做一个项目时,遇到了一个问题。我用的是ajax,要在$.ajax({})
里面给一个全局变量赋值,结果死活赋值不上,(就是给变量赋值是,外部始终拿不到该值,即无法当成全局变量)纠结了好半天,后来在网上查了很多,才知道,ajax默认是异步请求,如果要在$.ajax({})里面给全局变量赋值,需要改为同步操作,即加上async : false,除此之外在变量前还需要加上window
,就可以了。
代码如下:
$.ajax({
url:'一个域名',
type:'post',
async : false,
data:{
imei: $imei,
page: $page
},
dataType:"json",
success:function(result){
var $totalPages=result.totalPages
window.totalPages= result.totalPages //足以说明这个才是把局部变量升级为全局变量啊
$('#wei').text('总共'+result.totalPages+'页')
var data=result.content
$('#userBox').html(template('userTpl',data));
var html=template("userTpl",data)
// console.log(html)
}
});
console.log($totalPages) //结果是undefined
console.log(window.totalPages) //终于拿到我想要的数值了。。。。。哭唧唧
在函数中,传进window这个最高对象,把局部变量赋值给window中的一个属性,即可成为全局变量。
见如下例子
(function(win){
var num = 10;
win.number = num;
})(window);
console.log("num:"+num);
//结果:报错,因为num是局部变量,在全局变量中没有声明过
console.log("number:"+window.number);
//结果:number:10 ,window.number是一个全局变量
复制代码注意:(function(){})();这是函数自调用,函数只调用一次的写法
以下是网上看到的demo
$.ajax({
type:"post",
url:"a.action",
data: {},
dataType: 'text',
async : false,//设置为同步操作就可以给全局变量赋值成功
success:function(data){
usersname = data;//usersname为前面声明的全局变量
}
});
以下是自己写的异步验证用户名是否存在的代码
var results;
$.ajax({
type: "POST",
url: "ajax/checkfor1.php?action=reg_checkEmail",
data: {email:email},
dataType: 'text',
async: false,
success: function(data){
results=data;
return false;
},
error: function() {
alert("异常!");
}
});
if(results==0){
ShowTips("用户名已经存在");
return false;}
var coordinates = (function() {
var result;
$.ajax({
type:'POST',
url:'/json',
dataType:'json',
data:{cmd:'coordinates'},
async:false,
success:function(data){
result = data;
}
});
return result;
})();
$(document).ready(function(){
if(coordinates.length) {//初始化页面,把所有坐标列一个列表
$.each(coordinates, function(index,term) {
var $item = $('<li class="item"></li>').text('坐标:'+term[0] + ',' + term[1]).appendTo('#list');
})
}
}