0

如上所述,在我的 .each 函数之后不会执行任何代码。我以为每个函数都准备好后会执行每个代码?!

这是我的js文件:

function onUploadLoad() {
    $.ajax({
        type: "POST",
        url: "headlines_getter.php",
        dataType: 'json',
        cache: false,
        success: function (data1) {
            console.log("debug 2");
            var i = 0;
            var $element = "";
            $.each(data1[i].main, function () {
                console.log("debug 3 ");
                $element += '<div data-role="collapsible"><h3>' + data1[i].main + '</h3>';
                var j = 0;
                $.each(data1[i].sub, function () {
                    console.log("debug 4");
                    $element += '<span><input type="checkbox" name="headlines" data-mini="true" value="blub" /> ' + data1[i].sub[j] + ' </span>';
                    j++;
                });
                $element += '</div>';
                i++;
                var $elements = $($element).appendTo($('#headlinesgroup'));
                $elements.collapsible();
            });
    alert("ok"); // <- this alert is not shown!!
    console.log("debug 12"); // <- also not this console.log!
        }
    });
}

如果我在每个功能之前发出警报,一切正常吗?!

提前致谢。最好的问候,约翰。

4

3 回答 3

1

您的代码中的这一行:

$.each(data1[i].main, function () {

说要遍历data1[i].main. 也就是说,假设i此时为 0,它期望 的.main属性data1[0]是一个数组或一个对象。鉴于您尝试data1[i].main在循环内继续使用并且您正在增加i自己的方式,我怀疑这.main根本不是一个数组或对象,所以您的两个$.each()循环都没有像您认为的那样工作。

只是在这里猜测,但您的data1数据结构实际上是这样的:

[
   { "main" : "some heading 1", "sub" : [ "item1", "item2", "item3" ] },
   { "main" : "some heading 2", "sub" : [ "item1", "item2", "item3" ] },
   { "main" : "some heading 3", "sub" : [ "item1", "item2", "item3" ] }
]

该结构与您似乎在循环中尝试执行的操作相对应,但是尝试同时使用单独管理自己的计数器和循环计数器时$.each()出错了。您想使用其中一个传统的循环,但这就像您试图同时进行两者一样。假设上述结构与您的结构相似,您需要执行以下操作:$.each()ij$.each() for

    success: function (data1) {
        console.log("debug 2");
        var $element = "";
        $.each(data1, function (i, currentObj) {
            console.log("debug 3 ");
            $element += '<div data-role="collapsible"><h3>' + currentObj.main+ '</h3>';
            $.each(currentObj.sub, function (j, currentSub) {
                console.log("debug 4");
                $element += '<span><input type="checkbox" name="headlines" data-mini="true" value="blub" /> ' +currentSub + ' </span>';
            });
            $element += '</div>';
            var $elements = $($element).appendTo($('#headlinesgroup'));
            $elements.collapsible();
        });
        alert("ok"); 
        console.log("debug 12");
    }

请注意,在这两个$.each()循环中,我实际上都没有使用iandj变量,因为 jQuery 设置为currentObj等于data1[i]并且它设置currentSub为等于currentObj.sub[j](也是data1[i].sub[j])。

于 2012-05-20T12:05:16.837 回答
0

尝试将error参数添加到$.ajax请求中,例如:

function onUploadLoad()
{
    console.log("debug start");
    $.ajax({
        type: "POST",
        url: "headlines_getter.php",
        dataType: 'json',
        cache: false,
        success: function (data1) {
            console.log("debug success");
        },
        error: function() {
            console.log("debug error");
        }
    });
    console.log("debug end");
}​

由于问题已经改变......

你能在这里发布你的 php 的响应吗?看看你是否正在操纵data1它必须被操纵的方式......

于 2012-05-20T11:40:58.097 回答
0

如果你去 .each() 的文档你可以看到回调函数的原型需要两个参数

jQuery.each(集合,回调(indexInArray,valueOfElement))

因此你可以这样做:

$.each(data1[i].main, function (index, element) {

//code inside each

});
于 2012-05-20T11:44:34.033 回答