2017-07-27 11 views
0

私のPHP生成の選択/オプションリストが動的に生成されたすべてのブロック/コンテナに適用されない問題があります。各コンテナに対して呼び出されたにもかかわらず、最後のコンテナ/ブロックインスタンスにのみPHP選択を追加します。ページ - アラートのトラブルシューティングを行う場合、常に、だから、最後のオンリーPHPが最初に生成したAjax動的生成コンテナにのみ表示されるオプションリスト

n = -1 
function addDiv() { 
      n++; 

上の簡単な概要を表示されますので、なぜ、選択した容器/ブロックを追加して生成する前に、すべての反復を介して実行するようですコードを初期化すると、特定の条件内でデータベースに登録されているエントリの数が取得され、その数値が 'length'に適用され、addDiv()関数が何度も実行されます。通常、ボタンを使用して一度に1つのブロックを追加すると、addDiv()関数のphpを使用して、作成されたブロックにオプションの選択/リストが設定されますが、これをループ(initialize()関数)問題が発生します。

$(document).ready(function() { 
    initialize(); 
}); 

function initialize() { 
$.ajax({ 
      url: 'get-entries.php', 
      type: 'POST', 
      dataType: 'text', 
      cache: false, 
      success: function(data) { 
       result = data; 
       var arrayJson = JSON.parse(data); 

       console.log(arrayJson); 
       length = arrayJson.length; 
       console.log(length); 

       for(var i = 0; i < length; i++) { 
       addDiv(); 
       }; 

        }, 
        error: function(jqXHR) { 
         alert("Error while fetching data"); 
         console.log("Error while fetching data: " + jqXHR.status + " " + jqXHR.statusText + " " + jqXHR.responseText); //improved error logging 
        } 
      }); 
    }; 

ここでは、読みやすくするためにいくつかの改訂を加えたaddDiv関連のコードです。

var n = -1; 

    function addDiv() { 
     n++; 

    $.post( 
      "json-option-generator.php", 
     {}        
     ).done(       
      function(data) 
      { 
     $('#selectedcoin' + n).html(data); 
      }); 

    $("<div class='coinmarketcap fill' id='container" 
    + n + 
    "'><form id='" 
    + n + 
    "' name='" 
    + n + 
    "' class='formClass' method='post' action=''><select onchange='mySelect(this)' type='text' class='coinname' id='selectedcoin" 
    + n + 
    "' name='selectedcoin" 
    + n + 
    //.etc..... 
    "' autocomplete='off' value=''><select></select>").appendTo(".main-container"); 

} 

、最終的にここにJSONデータのオフに基づいてオプションリストを生成するためのPHPファイルの内容がある -

<?php 
$json = file_get_contents("../ticker/full.json"); 

$decode = json_decode($json, true); 
sort($decode); 

echo '<select name="coinname">'; 
    foreach($decode as $a){ 
     echo "<option value='{$a['id']}'>{$a['name']}</option>"; 
    } 
echo '</select>'; 
?> 

私は、これは厄介で、深さの読み取りのビットを必要とするかもしれない知っていますそれで、私は見て時間を割いている人に感謝します。

私は正しい方向に私を振るのを助けることができる明らかな何かがありますか?私は 'addDiv()'をsetTimeout関数で 'addDiv()'をラップすることによってinitialize()内で 'addDiv()'呼び出しを中断しようとしました。

+0

あなたはaddDiv' 'で非同期呼び出しを使用しているので、そこにあります全てのforループが最初の結果が到着したときに終了する非常に大きなチャンスです。そして、 'n'は(関数のために)「グローバル」なので、すでに最終値を持っています。あなたができることは '$。post '呼び出しをラップする関数を書くことです。これは' n'を引数にとり、それをローカル変数として保存するので、値は失われません。 – Kaddath

+0

この簡単な例を書くことができますか?あなたが私の選択した '$。post'を説明したものをうまく実装するのに問題があります。 – Nexus1234

答えて

1

それはこれで動作するはずです(私は理解のために、異なる引数の名前が、indexindex_tはすべてn名前を付けることができます):

var n = -1; 

function sendToGenerator(index){ 
    var index_t = index; 
    $.post( 
     "json-option-generator.php", 
     {}        
    ).done(       
     function(data) 
     { 
      $('#selectedcoin' + index_t).html(data); 
     } 
    ); 
} 

function addDiv() { 
    n++; 

    sendToGenerator(n); 

    $("<div class='coinmarketcap fill' id='container" 
    + n + 
    "'><form id='" 
    + n + 
    "' name='" 
    + n + 
    "' class='formClass' method='post' action=''><select onchange='mySelect(this)' type='text' class='coinname' id='selectedcoin" 
    + n + 
    "' name='selectedcoin" 
    + n + 
    //.etc..... 
    "' autocomplete='off' value=''><select></select>").appendTo(".main-container"); 

} 
+0

は完璧に動作します、ありがとう! – Nexus1234

+0

いつでも喜んでお手伝いします。 – Kaddath

関連する問題