如何把ajax返回的responseText赋值给外部变量

[code="java"]
function setHtml(){
var html = "";
$.getJSON("ajax!getList",function(data){
html = data.section;
alert(html);//这里就能取到html,但是外部html变量没有改变
});
alert(html);//这里答应就是空字符串
}
[/code]
请问有没有什么方法把$.getJSON("ajax!getList",function(data){});内的变量的值赋值给外部的html

4个回答

这种情况最好是把处理响应的逻辑写到匿名名方法里面:

function setHtml(){

$.getJSON("ajax!getList",function(data){

html = data.section;

alert(html);
//处理响应的逻辑写在这
});

}

如果处理逻辑很长,你写一个函数在外面就好了:
function setHtml(){

$.getJSON("ajax!getList",function(data){

html = data.section;

afterGetList(html);
});

}

function afterGetList(html){
alert(html);
//处理响应的逻辑写在这
}

同步方法最好不用,网络出点小状态IE下就会有假死的情况,多来两次用户就得有反应了

NCS123456
NCS123456 太感谢你了,这个方法很好
7 年多之前 回复
iteye_1767
iteye_1767 addQuestionConfirm(pid,qid,qtype,function(html){ $.prompt(html,{callback:addQuestionCallback,buttons: { ok: true, cancel: false }}); }); function addQuestionConfirm(pid,qid,qtype,func){ var sections = "<select id='sectionid' name='sectionid' >"; $.getJSON("ajax!getSectionList",{id:pid},function(data){ var html = ""; if(data.datalist.length<1 || data.datalist==null){ html = "请先创建章节"; } $(data.datalist).each(function(i){ sections += "<option value='"+this.ID+"'>"+this.SECTION_NAME+"</option>"; }); sections += "</select>"; html += '请选择需要添加到的章节?<br/>'; html += '目标章节:' + sections + '<br/>'; html += '本题分值:<input type="text" class="txtfree" name="cqscore" id="cqscore" value="0" size="5" style="margin-top:5px" /> 分<br/>'; html += '<input type="hidden" name="cqid" id="cqid" value="'+qid+'" />'; func(html); }); } 这样就可以了,你得理解透什么是异步和回调。
7 年多之前 回复
NCS123456
NCS123456 我是使用了jquery impromptu $.prompt(addQuestionConfirm(pid,qid,qtype),{callback:addQuestionCallback,buttons: { ok: true, cancel: false }}); //这里的addQuestionConfirm(pid,qid,qtype)必须返回html,不然无法弹出prompt function addQuestionConfirm(pid,qid,qtype){ var html = ''; var sections = "<select id='sectionid' name='sectionid' >"; $.ajaxSetup({//设置同步 async:false }); $.getJSON("ajax!getSectionList",{id:pid},function(data){ if(data.datalist.length<1 || data.datalist==null){ html = "请先创建章节"; return; } $(data.datalist).each(function(i){ sections += "<option value='"+this.ID+"'>"+this.SECTION_NAME+"</option>"; }); sections += "</select>"; html += '请选择需要添加到的章节?<br/>'; html += '目标章节:' + sections + '<br/>'; html += '本题分值:<input type="text" class="txtfree" name="cqscore" id="cqscore" value="0" size="5" style="margin-top:5px" /> 分<br/>'; html += '<input type="hidden" name="cqid" id="cqid" value="'+qid+'" />'; }); return html;//返回的html必须在这里返回 } 请问如果用异步,有好的方法吗?如果用$.ajaxSetup({//设置同步 async:false });他是设置全局属性的,整个页面的ajax全是同步了
7 年多之前 回复
iteye_1767
iteye_1767 所有调用的地方都得改成回调的,假设你用同步的方式是这么写的: function A(){ var html = setHtml(); $("#id").setInnerHtml(html); } function setHtml(){ var html = ""; $.getJSON("ajax!getList",{async:false},function(data){ html = data.section; }); return html; } 你改成异步回调的方式就是这样的: function A(){ setHtml(function(){ $("#id").setInnerHtml(html); }); } function setHtml(func){ $.getJSON("ajax!getList",function(data){ html = data.section; func(html); }); } 感觉你可能接触JS不久,所以会感觉有点绕,习惯了就好。
7 年多之前 回复
NCS123456
NCS123456 但是我的setHtml(){}必须返回一个字符串html,我把return html写在 $.getJSON("ajax!getList",function(data){ });的function里,返回不了
7 年多之前 回复

getJSON缺省是异步的,所以最后一条alert(html);语句会在回调函数调用之前执行,所以此时你得到的是空串。

解决方法是让getJSON同步执行,这样,只有回调函数执行完以后,才会执行最后一条alert(html);

[code="js"]function setHtml(){
var html = "";
$.getJSON("ajax!getList",{async:false},function(data){
html = data.section;
alert(html);//这里就能取到html,但是外部html变量没有改变
});
alert(html);//这里答应就是空字符串
}[/code]

blogzhoubo
blogzhoubo $.getJSON是简写的$.ajax函数,无法指定async参数。可以直接用$.ajax。 $.ajax({ async: false, url: url, data: data, success: callback, dataType: json });
7 年多之前 回复
NCS123456
NCS123456 $.ajaxSetup({ async:false });这是正确哦
7 年多之前 回复
blogzhoubo
blogzhoubo id:pid是做什么用的?你这个:好像是全角的吧?改成半角。id不是有效的参数,好像不能放到{}中。即使放到{}里,也应该写成id:"pid",你可以试试看,感觉id不应该放到{}里面,如果是普通参数的话,应该加到url后面,比如ajax!getList?id=pid
7 年多之前 回复
NCS123456
NCS123456 我在访问action的时候传了参数,请问是这样添async吗,$.getJSON("ajax!getList",{id:pid,async:false},function(data){})这样不行哦
7 年多之前 回复

貌似是这样的,LZ可以试一下

:D 很简单,只要把 async 这个属性 设置成 false 就好了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问