0

そのため、innerHTMLを使用して一連のjson結果を取得して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を見つけたときにのみ機能しますが、2回目はすべてのスレッドの後に同じ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)補足として、配列をウォークオーバーするために使用する場合は、コンストラクトを便利なものに置き換えることを強くお勧めしfor(;;)ます(または、代わりに、$.each便利なjQueryメソッドの使用を検討してください)。

于 2012-09-25T16:48:13.493 に答える
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 に答える
0

まず、Muthが言ったように、文字列ではなく配列を使用する必要があります

var createdThreadIds = [123123, 12312312, 1231222]

次に、コードが非同期であり、ajaxからのコールバックがどのように呼び出されるかがわからないため、すべてが混同される可能性があります。

第三に、ajax呼び出しによって返されるDefferedオブジェクトを使用し、すべての呼び出しが実行された場合にのみDOMを更新することをお勧めします。

于 2012-09-25T16:40:49.373 に答える