1

私はSOに関する多くの「類似の」q&aスレッドを見てきましたが、正直なところ、私はjsプログラミングをあまり把握していないため、多くの回答を理解するのが難しいと感じています. (私自身の状況に当てはまる限り)。

コンテキストはこれです。2 つの php スクリプトがあり、1 つは設定された期間の customer_ids (json エンコード) のリストを返し、もう 1 つはニュース フィードの設定を返します (json エンコード)。

jQuery で ajax 関数をセットアップする方法の基本的な理解を得るために少しググって、次のように書きました。

$('document').ready(function() {
    $.ajax({
        type:'GET', url: 'cust_selection.php', data: '',
        succes:function(cstmrid) {
            var clistlen = cstmrid.length;
            var i=0;
            var cstmr;
            for( ;cstmr=cstmrid[i++]; ) {
            $('#adminPanel>ul>li').append("<a href='' onclick='alert("+cstmr+")' class='lst_admin basic'>"+cstmr+"</a>"); //alert to be replaced with a function call which passes customerid to the function below.
            }
        },
        dataType:'json'
    });

    var cstmrid = "483972258"; //hardcoded for testing purposes
    $.ajax({
        type:'GET', url:'newsfpref.php?', data:'cref='+cstmrid,
        success:function(npfdata) {
            var item;
            var n=0;
            for( ;item=npfdata[n++]; ) {
                var news = npfdata[n].nsource;
                $('#adminMain>table>tbody').append("<tr><td>"+item+"</td></tr>");
            }
         },
         dataType:'json'
    });
});

最初の ajax 関数から、クリックして 2 番目の ajax 関数を起動し、顧客 ID を渡して、構成されたニュース ソースのリストを取得できるようにするリンクのリストを取得します。彼らのページ。アラートとハードコードされた顧客 ID はどちらも機能が「機能している」ことを示していますが、最初の機能を次のように調整しようとすると、...

$('#adminPanel>ul>li').append("<a href='' onclick='getCustomerNP("+cstmr+")' class='lst_admin basic'>"+cstmr+"</a>");

... 以下のように、2 番目の関数の変更されたバージョンを呼び出しています: ...

function getCustomerNP(cstmrid) {
    $.ajax({
        type:'GET', url:'newsfpref.php?', data:'cref='+cstmrid,
        success:function(nprfdata) {
            var item;
            var n=0;
            for( ;item=npfdata[n++]; ) {
                var news = npfdata[n].nsource;
                $('#adminMain>table>tbody').append("<tr><td>"+item+"</td></tr>");
            }
         },
         dataType:'json'
    });
}

この時点ですべてが失敗しているようです。2 番目の関数は変数を「受け取っていないようです」 jQuery ajax 関数が相互に対話する方法。

ご覧のとおり、私は多くの SO Q&A スレッドから少しのコードとアイデアを共食いしましたが、あまり理解せずにコピーすると、イライラするほど依存した生活になります。

あなたが提供できる限り多くの - 広範な - コメントと、解決策または 2 つ (当然のことながら) をいただければ幸いです。

編集:これ以上混乱しないように、私は上記を変更し、途中で(多くの)エラーとタイプミスを修正しました。現時点では、コードは次のようになります。

$('document').ready(function () {
    $.ajax({
        type: 'GET', url: 'cust_selection.php', data: '',
        succes: function (cstmrid) {
            var clistlen = cstmrid.length;
            var i = 0;
            var cstmr;
            for (; cstmr = cstmrid[i++]; ) {
                var a = $("<a href='' class='lst_admin basic'>" + cstmr + "</a>").click(function () {
                    getCustomerNP(cstmr)
                })
                $('#adminPanel>ul>li').append(a); //alert to be replaced with a function call which passes customerid to the function below.
            }
        },
        dataType: 'json'
    });
    function getCustomerNP(cstmr) {
        alert(cstmr);
    }
});
4

2 に答える 2

0

$.ajax()内の成功関数にタイプミスがありますgetCustomerNP()。関数宣言:

success:function(nprfdata) {

...パラメータがありますnprfdataが、使用する関数内にありますnpfdata(欠落していますr)。

また、このコード:

        var item;
        var n=0;
        for( ;item=npfdata[n++]; ) {
            var news = npfdata[n].nsource;
            $('#adminMain>table>tbody').append("<tr><td>"+item+"</td></tr>");
        }

news...決して使用しない変数を宣言して設定します。そして、テスト式でインクリメントnしてからループ内で使用するのは正しくないようです。何にも設定することはありませんが、.fornitem.append()

(また、JS にはブロック スコープがなく、関数スコープしかないため、if または for ループ内で変数を宣言しても、if または for ブロックに制限されないことに注意してください。)

onclickそのようなインライン ハンドラは作成しません。私はおそらく次のようなことをするでしょう:

$('#adminPanel>ul>li').append("<a href='' data-cstmr='"+cstmr+"' class='lst_admin basic'>"+cstmr+"</a>");

...そして、ドキュメントの準備が整った状態で、これらのアンカーのクリックをキャッチする委任されたイベント ハンドラーをセットアップします。

$('#adminPanel>ul>li').on('click', 'a.lst_admin', function() {
    $.ajax({
        type:'GET', url:'newsfpref.php?', data:'cref='+ $(this).attr('data-cstmr'),
        success:function(npfdata) {
            var item,
                n=0,
                // cache the jQuery object rather than reselecting on every iteration
                $table = $('#adminMain>table>tbody'); 
            // increment n only after the current iteration of the loop               
            for( ;item=npfdata[n]; n++) {
                // change to use item
                $table.append("<tr><td>"+item.nsource+"</td></tr>");
            }
         },
         dataType:'json'
    });
});
于 2012-07-24T03:46:07.013 に答える
0

好きなように を追加する<a href='' onclick='getCustomerNP("+cstmr+")'ときは、関数にアクセスできることを確認してくださいgetCustomerNPgetCustomerNPとして定義してみてください。

window.getCustomerNP = function(cstmrid) {
    ...

$(document).ready(function(){ ... })ブロックで定義した場合は、これを試してください

    $('document').ready(function () {
        $.ajax({
            type: 'GET', url: 'cust_selection.php', data: '',
            succes: function (cstmrid) {
                var clistlen = cstmrid.length;
                var i = 0;
                var cstmr;
                for (; cstmr = cstmrid[i++]; ) {
                    var a = $("<a href='' class='lst_admin basic'>" + cstmr + "</a>").click(function () {
                        getCustomerNP(cstmr)
                    })
                    $('#adminPanel>ul>li').append(a); //alert to be replaced with a function call which passes customerid to the function below.
                }
            },
            dataType: 'json'
        });

        function getCustomerNP(cstmrid) {
            $.ajax({
                type: 'GET', url: 'newsfpref.php?', data: 'cref=' + cstmrid,
                success: function (nprfdata) {
                    var item;
                    var n = 0;
                    for (; item = npfdata[n++]; ) {
                        var news = npfdata[n].nsource;
                        $('#adminMain>table>tbody').append("<tr><td>" + item + "</td></tr>");
                    }
                },
                dataType: 'json'
            });
        }
    });
于 2012-07-24T03:46:39.930 に答える