1

在尝试 jQuery 时,我有一个可能是新手错误的问题,但我似乎找不到解决方案。这是代码:

$.get("index.html", function() {
    var i = 0;
    for (; i < 3; i++)
    {
        var lDiv = document.createElement('div');
        lDiv.id = 'body-' + i;
        document.getElementById('body').appendChild(lDiv);
        $.get('index.html', function(data) {
            lDiv.innerHTML = "<p>Hello World " + i + "</p>";
        });
    }
});

输出似乎是

<div id='body-0'></div>
<div id='body-1'></div>
<div id='body-2'>
    <p>Hello World 3</p>
</div>

我希望lDiv.innerHTML=为每个 i 执行代码,但显然它只为最后一个 i 执行?我在看什么?

4

2 回答 2

2

由于$.get()是异步的,因此您需要在$.get()success()回调函数中执行 append 和 next 调用。

var i = 0;
function recursiveLoad() {
       if(i == 3) return;
       var lDiv = document.createElement('div');
       lDiv.id = 'body-' + i;
       document.getElementById('body').appendChild(lDiv);
       $.get('index.html', function(data) {
            lDiv.innerHTML = "<p>Hello World " + i + "</p>";
            i++;
            recursiveLoad();
       });
}
// initial call
recursiveLoad();
于 2012-06-11T16:33:35.450 回答
2

发生这种情况是因为循环在任何回调被触发之前i完成 ( is 2) 。

@thecodeparadox 的解决方案有效,但它序列化了 HTTP 请求。(使它们一次触发一个。)这允许请求并行执行,因此更快:

for (var i = 0; i < 3; i++)
{
    var lDiv = document.createElement('div');
    lDiv.id = 'body-' + i;
    document.getElementById('body').appendChild(lDiv);
    $.get('index.html', function(i,lDiv) { // the current iteration's `i` and `lDiv` are captured...
        return function(data) {
            lDiv.innerHTML = "<p>Hello World " + i + "</p>";
        }
    }(i,lDiv)); // ...by passing them as an argument to the self-executing function
}
于 2012-06-11T17:24:38.010 回答