0

なぜこれがうまくいかないのか完全にはわかりません。Jクエリ初心者。私が見たすべての例によれば、うまくいくはずですが、そうではありません。

次のスクリプトでは、関数は変数に新しい値を設定しますが、新しい値は関数の外では保持されません。(コンソールログはこれを示しています)

$(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');
    }
}
4

3 に答える 3

1

$.post リクエストは非同期呼び出しであるため、明らかにコードの残りの行に移動し、$.post のコールバックを待機しません。

$.ajax代わりに使用してみてasync=false、同じコードを使用するようにしてください

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

また

コードを成功コールバック内に移動します。

于 2013-01-28T12:10:38.633 に答える
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")
    }
})
于 2013-01-28T12:10:53.123 に答える
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");
    }
});
于 2013-01-28T12:08:12.317 に答える