1

我已经查看了很多关于 SO 的“类似”问答线程,但老实说,由于我对 js 编程没有太多了解,我发现很难理解很多答案(只要它们可能适用于我自己的情况)。

上下文是这样的,我有两个 php 脚本,一个在一段时间内返回 customer_ids 列表(json 编码),另一个返回他们对新闻提要的偏好(json 编码)。

我写了以下内容,在 google 上搜索了一下以基本了解如何在 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 函数中,我得到一个链接列表,我希望能够单击以启动第二个 ajax 函数并将客户 ID 传递给它,以便它可以获取他们配置的新闻源列表他们的页面。警报和硬编码的客户 ID 都表明这些功能正在“工作”,但是当我尝试调整第一个功能时:...

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

...正在调用第二个函数的修改版本,如下所示:...

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

在这一点上,一切似乎都失败了。第二个函数似乎没有“接收”变量,我不确定它是否是我忽略的基本内容(比如一些混乱的“和”位置),或者我想要完成的实际上不是jQuery ajax 函数相互交互的方式。

正如你所看到的,我已经从许多 SO q&a 线程中蚕食了一些代码和想法,但是在没有太多理解的情况下进行复制会导致令人沮丧的依赖生活。

我将不胜感激 - 广泛 - 您可以提供的评论,以及一两个解决方案(自然)。

编辑:不要让任何人进一步混淆,我一直在修改上述内容并纠正我的(许多)错误和拼写错误。目前,代码如下所示:

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

...声明并设置您从不使用的变量newsnfor测试表达式中增加但n在循环中使用似乎不正确。你从来没有设置item任何东西,但你在你的.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+")',请确保您可以访问该功能getCustomerNP。尝试定义getCustomerNP

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 回答