0

因此,我试图获得一系列 json 结果,以使用 innerHTML 在 div 标记中呈现自身。

   <script>
    $(document).ready(function() {
        var html2 = '';
        var thread_id = '';
        var created_thread_ids = new Array(123123, 12312312, 1231222);
        for (var i in created_thread_ids)
        {
            thread_id = created_thread_ids[i];
            $.getJSON(ravenUrl + '/docs/threads/' + thread_id, function(thread){
                html2 += '<div class="result">' + thread.Title + thread_id + '</div>';
                document.getElementById("showit").innerHTML = html2;
            });
        }
    });
    </script>

    <div id="showit"></div>

我的问题是变量 thread.Title 工作正常,但变量 thread_id 仅在第一次访问 url 并找到正确的 url 时有效,但第二次在每个线程之后显示相同的 id。像这样:

<div id="showit">
<div class="result">This is the first title123123</div>
<div class="result">This is the second title123123</div>
<div class="result">This is the third title123123</div>
</div>
4

3 回答 3

1

您传递给$.getJSON方法的回调函数是一个闭包,并且由于该方法是异步的,thread_id因此将使用执行时间的值。这是一个常见的问题,并且有几种解决方法,最常见的是使用包装函数:

for (var i in created_thread_ids)
  (function(i){
  ...
  var thread_id = created_thread_ids[i];
  $.getJSON(ravenUrl + '/docs/threads/' + thread_id, function(thread){
    html2 += '<div class="result">' + thread.Title + thread_id + '</div>';
    document.getElementById("showit").innerHTML = html2;
  });
  ...
  }(i));
}

... 要不就 ...

for (var i in created_thread_ids) {
  var thread_id = created_thread_ids[i];
  $.getJSON(ravenUrl + '/docs/threads/' + thread_id, 
     ( function(thread_id) {
           return function(thread) {
               html2 += '<div class="result">' + thread.Title + thread_id + '</div>';
               document.getElementById("showit").innerHTML = html2;
           };
     }(thread_id) ) 
  );
}

作为旁注,我强烈建议在用于遍历数组时将(for..in)结构替换为方便(或者,作为替代方案,考虑使用有用的 jQuery 方法)。for(;;)$.each

于 2012-09-25T16:48:13.493 回答
0

首先,正如 Muth 所说,您应该使用数组而不是字符串

var createdThreadIds = [123123, 12312312, 1231222]

其次,你的代码是异步的,你不知道你的 ajax 调用是如何回调的,它们都可能混在一起。

第三,我建议您使用 ajax 调用返回的 Defered 对象,并且仅在执行所有调用时才更新 DOM。

于 2012-09-25T16:40:49.373 回答
0

created_thread_ids是一个字符串,它应该是一个数组。

改变

var created_thread_ids = '123123, 12312312, 1231222';

var created_thread_ids = new Array(123123, 12312312, 1231222);
于 2012-09-25T16:33:29.643 回答