不完全确定为什么会出错。 Jquery新手。根据我见过的所有例子,它应该有效,但事实并非如此。
在以下脚本中,该函数为变量设置新值,但新值不会在函数外部保留。 (控制台日志显示此内容)
$(document).ready(function() {
// url
var path = location.pathname.split("/"),
pos1_path = path[1] != undefined ? path[1] : false,
pos2_path = path[2] != undefined ? path[2] : false,
pos3_path = path[3] != undefined ? path[3] : false;
//console.log('before: ' + pos2_path);
if (pos1_path = 'article') {
$.post("/js/ajax/article_crumbs.php", { func: "getArticleCrumbs" },
function(data){
pos2_path = data.category;
//console.log('during: ' + pos2_path);
return pos2_path}, "json");
}
//console.log('after: ' + pos2_path);
// navigation
// set category nav to current category
if ( path[2] ) {
$('#category_nav a[class$="' + pos2_path + '"]').toggleClass('current');
}
else {
$('#category_nav a:first').toggleClass('current');
}
});
PHP:
<?php echo json_encode(["category"=>"arts-and-culture"]);
另外,根据控制台打印输出,“after”打印出现在“during”之前,是否意味着该功能在脚本其余部分结束之前不会运行?
编辑:为了澄清,我需要保留 {if(path [1]) setcurrent } 部分脚本 {if(pos1_path ='article')} 部分,这样如果pos1_path不是文章,它会将值设置为URI中的任何内容。
根据以下答案解决方案:
$(document).ready(function() {
// url
var path = location.pathname.split("/"),
pos1_path = path[1] != undefined ? path[1] : false,
pos2_path = path[2] != undefined ? path[2] : false,
pos3_path = path[3] != undefined ? path[3] : false;
if (pos1_path = 'article') {
//console.log('before: ' + pos2_path);
var data = {id: pos2_path}
$.ajax({
type: 'POST',
url: "/js/ajax/article_crumbs.php",
data: data,
success: function(data){
pos2_path = data.category;
//console.log('during: ' + pos2_path);},
dataType: "json",
async: false
});
}
//console.log('after: ' + pos2_path);
// navigation
// set category nav to current category
if ( path[2] ) {
$('#category_nav a[class$="' + pos2_path + '"]').toggleClass('current');
}
else {
$('#category_nav a:first').toggleClass('current');
}
}
答案 0 :(得分:1)
$。发布请求是异步调用,所以很明显它会转移到其余的代码行而不是等待$ .post的回调
尝试使用$.ajax
代替async=false
使用相同的代码
$.ajax({
type: 'POST',
url: url,
data: data,
success: success,
dataType: dataType,
async:false
});
OR
将您的代码移到成功回调中。
答案 1 :(得分:0)
试试这个:
$(document).ready(function() {
// url
var path = location.pathname.split("/"),
pos1_path = path[1] != undefined ? path[1] : false,
pos2_path = path[2] != undefined ? path[2] : false,
pos3_path = path[3] != undefined ? path[3] : false;
if (pos1_path = 'article') {
var data = {id: pos2_path}
$.post("/js/ajax/article_crumbs.php", { func: "getArticleCrumbs" },
function(data){
pos2_path = data.category;
// navigation
// set category nav to current category
if ( path[1] ) {
$('#category_nav a[class$="' + pos2_path + '"]').toggleClass('current');
}
else {
$('#category_nav a:first').toggleClass('current');
}
}, "json");
}
});
答案 2 :(得分:0)
这是一个异步调用...所以当控制到达if ( path[2] ) {
语句时,你无法确定服务器是否有响应......
您可以success callback
$.post
$(document).ready(function() {
// url
var path = location.pathname.split("/"),
pos1_path = path[1] != undefined ? path[1] : false,
pos2_path = path[2] != undefined ? path[2] : false,
pos3_path = path[3] != undefined ? path[3] : false;
//console.log('before: ' + pos2_path);
if (pos1_path = 'article') {
$.post("/js/ajax/article_crumbs.php", { func: "getArticleCrumbs" },
function(data){
pos2_path = data.category;
if ( path[2] ) {
$('#category_nav a[class$="' + pos2_path +'"]').toggleClass('current');
} else {
$('#category_nav a:first').toggleClass('current');
}
},"json")
}
})