Ajax设置变量在不同范围内不起作用
Ajax setting variable not working in different scopes
我正在尝试使用ajax调用设置js变量。然后将var值输入到表单元素中。它工作得很好,直到我尝试使用var的方式如下所示。
我用来获取val 的函数function ajaxFetch(query) {
var val;
$.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
val=data;
});
return val;
}
我将跳过crude .php代码,因为它可以为其他脚本工作,并且它只查询MySQL,并回显值。
然后我调用ajaxFetch函数触发点击
$(document).on("click",".btnCall",function(){
id=$(this).data("id")//gets an id from a data tag
q1 = "SELECT NAME FROM user WHERE ID="+id;
userName = ajaxFetch(q1);
$("#form_userName").val(userName);
});
我不明白,但我猜这是一个范围的问题,是以下
如果我按照所示的方式操作,表单仍然为空
如果我做一个直接的ajax调用,在点击触发(不调用函数),则用用户名填充表单。
如果我做的事情如上所示,但我添加一个"alert(val)"到ajaxFetch函数(我用它来测试函数),警报将是
我遇到了这样的问题:我首先在"click"事件中进行ajax调用。然后我创建了ajaxFetch函数,因为会有几个调用。我在函数和"点击"事件中都添加了一个"警报",这样我就可以看到获取是否正常工作。我注意到的第一件事是,第一个警报(在ajaxFetch内部)是空的,但点击事件内部的警报显示的值。
提前感谢。抱歉有任何错误
EDIT -工作方式(使用不需要的警报)
function ajaxFetch(query) {
var val;
$.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
val=data;
alert(data);
});
return val;
}
$(document).on("click",".btnCall",function(){
id=$(this).data("id")//gets an id from a data tag
q1 = "SELECT NAME FROM user WHERE ID="+id;
userName = ajaxFetch(q1);
alert(userName)
$("#form_userName").val(userName);
});
这样表单值将被归档。第一个警报将显示一个空字符串,第二个警报将显示正确的值。
FINAL EDIT - working Ajax request
function ajaxFetch(query) {
var r;
$.ajax({
type:'POST',
url:'/ajax/crud.php',
async:false,
data:{mode:"fetch",query:query},
success: function(response){
r=response;
}
});
return r;
}
这样(添加选项"async:false")var将只在ajax完成它的请求时被填充。这不是一个专业的技巧,但可能对其他初学者有帮助。
返回$.post
函数中的val
function ajaxFetch(query) {
var val;
$.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
val=data;
//return statement should be here and not out side the ajax function
return val;
});
}
}
答案是,你使用val
是undefined
在那一刻,当你返回它。你应该在回调函数中执行所有使用val
的逻辑,在其他情况下,你只是不知道请求何时完成。我建议你这样使用:
function ajaxFetch(query) {
return $.post( "/ajax/crud.php",{mode:"fetch",query:query});
}
//and where you call ajaxFetch()
ajaxFetch().then(function(data) {
val=data;
//do something with val here
});
您正在执行异步Ajax调用。因此,您必须对代码进行如下修改:
function ajaxFetch(query) {
var val;
$.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
val=data;
$("#form_userName").val(val); //set the value right in success handler of Ajax
});
}
$(document).on("click",".btnCall",function(){
id=$(this).data("id")//gets an id from a data tag
q1 = "SELECT NAME FROM user WHERE ID="+id;
ajaxFetch(q1); //just call the function; you don't know how much time Ajax will take to get back the result.
});
请尝试此代码
var val,id,q1,userName;
function returnData(param)
{
$("#form_userName").val(param);
}
function ajaxFetch(query, callback)
{
var x = $.post( "/ajax/crud.php",{mode:"fetch",query:query},function(data) {
callback(data);
})
}
$(document).on("click",".btnCall",
function(){
id=$(this).data("id")//gets an id from a data tag
q1 = "SELECT NAME FROM user WHERE ID="+id;
ajaxFetch(q1,returnData);
}
);
因为是异步的,所以使用回调函数
- Angular$scope在模式窗口内不起作用
- 输入类型范围在angularjs重复内不起作用
- 剑道UI下拉列表在剑道窗口内不起作用
- AngularJs的$cookies在过期时间内不起作用
- Angularjs 更新 setTimeout 中的范围变量不起作用
- ng-class 在 angularJs 中由 ng-include 包含的文件内不起作用
- AngularJS-ng显示范围变量不起作用
- document.ready函数在iframe内不起作用
- JQuery 在模态内不起作用
- jQuery Ajax - 在循环内不起作用
- 下拉菜单溢出在引导导航栏内不起作用
- 应用程序.js在部分内不起作用
- 角度“这个”在指令控制器内不起作用
- Javascript字符串替换在循环内不起作用
- Javascript 三元运算符在输入标签内不起作用
- MeteorJS包装异步在铁路由器内不起作用
- 高图表导航器和范围刻度不起作用
- 角度 JS 范围变量不起作用
- 正则表达式在引号内不起作用
- Ajax设置变量在不同范围内不起作用