我在ahref链接上使用以下函数作为onclick事件:
function checkOrgSaved() {
var orgName = $.trim($("#orgName").val());
var orgNames = new Array();
$.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token, function (result) {
for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
var org = result.Orgs[i].name;
orgNames.push(org);
}
});
if ($.inArray(orgName, orgNames) == -1 || orgName == 0){
alert("Foobar.");
$("#editLink").attr("href", "javascript:void(0);");
}
}
像这样,orgNames
语句中的if
数组始终为空。为什么呢?
但是,如果我在orgNames
调用中声明getJSON
数组并将if
语句也放在getJSON()
调用中,则数组会正确填充,但该行$("#editLink").attr("href", "javascript:void(0);");
不起作用,只需单击ahref元素即可执行重定向。
我想要实现的目标是:如果orgName数组中的orgName为空或NOT,则应抛出JS警报 - 在另一页上没有重定向。
答案 0 :(得分:1)
这是因为$.getJSON
调用是异步的,这意味着{<1}}语句将在收到JSON数据之前执行并执行回调并{{1}填充。
您可能想要在点击发生之前获取JSON并填充数组,然后再次检查值:
if
这也有助于避免对相同JSON数据的其他请求。
答案 1 :(得分:0)
尝试将代码更改为:
function checkOrgSaved() {
var orgName = $.trim($("#orgName").val());
var orgNames = new Array();
$.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token, function (result) {
for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
var org = result.Orgs[i].name;
orgNames.push(org);
}
if ($.inArray(orgName, orgNames) == -1 || orgName == 0){
alert("Foobar.");
$("#editLink").attr("href", "javascript:void(0);");
}
});
}
答案 2 :(得分:0)
作为第二个参数传递给$.getJSON
的函数是一个回调,它将在异步HTTP调用完成后执行。
$.getJSON
之后的代码会立即执行,这意味着当您尝试通过数组访问结果时,回调很可能还没有运行。
您必须将更新UI的逻辑移动到回调函数中,以确保HTTP调用在执行时已完成。
function checkOrgSaved() {
var orgName = $.trim($("#orgName").val());
var orgNames = new Array();
$.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token, function (result) {
for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
var org = result.Orgs[i].name;
orgNames.push(org);
}
if ($.inArray(orgName, orgNames) == -1 || orgName == 0){
alert("Foobar.");
$("#editLink").attr("href", "javascript:void(0);");
}
});
}
有关详细信息,请查看at jQuery's docs。
答案 3 :(得分:0)
Javascript是一种asynchronous语言,对吗?发生的事情是你的if语句在get函数的回调返回结果之前运行。
您应该将if check移动到这样的回调中:
$.getJSON("organizations?action=getOrganizations&onlyName=true&CSRFToken=" + csrf_token, function(result) {
for (var i = 0; i < Object.keys(result.Orgs).length; i++) {
var org = result.Orgs[i].name;
orgNames.push(org);
}
if ($.inArray(orgName, orgNames) == -1 || orgName == 0) {
alert("Foobar.");
$("#editLink").attr("href", "javascript:void(0);");
}
});