2017-01-06 11 views
1

json形式で値を返すPHPデータベース呼び出しから構成されたドロップダウンリストを作成しようとしています。最初の関数jsonloadは、このjsonの2つのフィールドをフィールドにラップして返します。 私はこれを変数として関数subfunction、formload、formに渡します。どこに文字列として追加されますか。これにより、その行のドロップダウンリストが表示されます。さらに行を追加すると、ドロップダウンリストは既に完成しています。2つのドキュメントJavaScript間で変数を渡す

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"> 
    </script> 
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> 
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet"> 
<title>Form</title> 
</head> 

<body> 
<form name="codexworld_frm" id="form1" method="post"> 
<div class="field_wrapper"> 
<div> 
    <h3><a href="javascript:void(0);" class="add_button" title="Add Field">Add POS Item</a> </h3> 
</div> 
</div> 
<input type="submit" value="Submit"> 
</form> 
</body> 
<script type="text/javascript"> 
    // JavaScript Document 
    var globalVariable; 
$(document).ready(function jsonload(data){ 
    $.getJSON("http://localhost/test/php/psql.php", function(data) 
      { 
     var options = ""; 
     for (var i = 0; i < data.length; i++) 
      { 
       options +="<option value=\"" + data[i].POSID + "\">" + data[i].Product + "</option>"; 
       //console.log(data[i].POSID + " " + data[i].Product); 
      } 

     var globalVariable=options; 
     console.log(globalVariable); 
    }); 
}); 


$(document).ready(function forms(){ 
     var maxField = 50; //Input fields increment limitation 
     var addButton = $('.add_button'); //Add button selector 
     var wrapper = $('.field_wrapper'); //Input field wrapper 
     //var fieldHTML = {row :function(f){ 
         //return '<h3><div>Item <input type="text" name="field_name['+f+'][]" value=""/>Material <input type="text" name="field_name['+f+'][]" value=""/><a href="javascript:void(0);" class="remove_button" title="Remove Field"><i class="material-icons" style="font-size:24px; color:blue">remove_circle</i></a></div></h3>'; 
         //}}; 
     var fieldHTML = {row :function optionload(f){ 
      var local = globalVariable; 
      console.log(local); 
      //event.preventDefault(); 
         return '<div>Item<input type="text" name="field_name['+f+'][]" value=""/>Material <select name="field_name['+f+'][]"><option value=""></option>' + local + '</select><a href="javascript:void(0);" class="remove_button" title="Remove Field"><i class="material-icons" style="font-size:24px; color:blue">remove_circle</i></a></div>'; 
     }}; 
     var x = 1; //initial field counter is 1 
     $(addButton).click(function(){ //Once add button is clicked 
      if(x < maxField){ 
       x++; 
       $(wrapper).append(fieldHTML.row(x)); //Add field html 
      } 
      }); 
     $(wrapper).on('click', '.remove_button', function(e){ //Once remove button is clicked 
         e.preventDefault(); 
     $(this).parent('div').remove(); //remove field html 
     x--; 
     }); 
}); 
    </script> 

    </html> 

これは

[ 
    { 
    "POSID": "104", 
    "Product": "10 Case Header" 
    }, 
    { 
    "POSID": "105", 
    "Product": "10 Case Header" 
    } 
] 

をテストするために、私は初心者です、と私は得ることができます任意の助けに感謝、私のJSONファイルです。

答えて

0

いくつか問題があります。

まず、あなたは別の関数からデータを転送するために、グローバルスコープで変数globalVariableを作成している:

//JavaScript Document 
var globalVariable; 

しかし、あなたはその後、varキーワードを使用して(別の変数を宣言しています

:)グローバルスコープでない変数...あなたの $.getJSON()コールバック関数のスコープ内 globalVariableと呼ばれ、この変数 optionsの値を割り当てます10
var globalVariable=options; 

あなたのグローバルglobalVariableには、実際に何も割り当てられていません。

セカンドコードが十分$.getJSON()あれば戻りが速く動作するかもしれないが、$.getJSON()$.getJSON()が呼び出された後、あなたの$(document).ready()コールバックのような他のコードは、実行し続けることを意味し、非同期関数です。 http://localhost/test/php/psql.phpへのリクエストが返されるのに数秒かかる場合、ユーザーは既に追加ボタンをクリックしている可能性がありますが、オプションはまだ使用できません。

クリックハンドラをボタンにバインドする前に、jsonデータが返されるまで待機する必要があります。

これ

も、グローバル変数を使用せずに行うことができます。

  • forms()機能にあなたの$.getJSON()コールバック関数にロジックを入れ$(document).ready()
  • のあなたforms()機能を移動
  • forms()にパラメータを取ることを許可するdata
  • make forms$.getJSON()コールバック関数
  • globalVariablelocalを取り除き、代わりに

$(document).ready(function jsonload(){ 
    $.getJSON("http://localhost/test/php/psql.php", forms); 
}); 

function forms(data){ 
// Previously in getJSON callback   
    var options = ""; 
    for (var i = 0; i < data.length; i++) 
     { 
      options +="<option value='" + data[i].POSID + "'>" + data[i].Product + "</option>"; 
      //console.log(data[i].POSID + " " + data[i].Product); 
     } 
    // no need for globalVariable/local anymore, just use options 
    //var globalVariable=options 

    // Original Forms function 
    var maxField = 50; //Input fields increment limitation 
    var addButton = $('.add_button'); //Add button selector 
    var wrapper = $('.field_wrapper'); //Input field wrapper 
    var fieldHTML = { 
     row: function optionload(f){ 
      console.log(options); 
      return '<div>Item<input type="text" name="field_name['+f+'][]" value=""/>Material <select name="field_name['+f+'][]"><option value=""></option>' + options + '</select><a href="javascript:void(0);" class="remove_button" title="Remove Field"><i class="material-icons" style="font-size:24px; color:blue">remove_circle</i></a></div>'; 
    }}; 
    var x = 1; //initial field counter is 1 
    $(addButton).click(function(){ //Once add button is clicked 
     if(x < maxField){ 
      x++; 
      $(wrapper).append(fieldHTML.row(x)); //Add field html 
     } 
    }); 
    $(wrapper).on('click', '.remove_button', function(e){ //Once remove button is clicked 
     e.preventDefault(); 
     $(this).parent('div').remove(); //remove field html 
     x--; 
    }); 
}; 
+0

optionsを使用取得は、あなたの答えのチェスターいただきありがとうございます。私は非常にjavascriptに新しいと私のコードであなたの助けと問題の説明を感謝します。 –

+0

私のページでこの機能を実行すると、追加ボタンが機能しなくなったことがわかります。私のコードの不具合について説明してくれてありがとう。 –

0

<!doctype html> 
 
<html> 
 
<head> 
 
<meta charset="UTF-8"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"> 
 
    </script> 
 
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> 
 
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet"> 
 
<title>Form</title> 
 
</head> 
 

 
<body> 
 
<form name="codexworld_frm" id="form1" method="post"> 
 
<div class="field_wrapper"> 
 
<div> 
 
    <h3><a href="javascript:void(0);" class="add_button" title="Add Field">Add POS Item</a> </h3> 
 
</div> 
 
</div> 
 
<input type="submit" value="Submit"> 
 
</form> 
 
</body> 
 
<script type="text/javascript"> 
 
    // JavaScript Document 
 
    var globalVariable; 
 
$(document).ready(function jsonload(data){ 
 
    // $.getJSON("http://localhost/test/php/psql.php", function(data) 
 
      //{ 
 
     var options = ""; 
 
       var data =[ 
 
    { 
 
    "POSID": "104", 
 
    "Product": "10 Case Header" 
 
    }, 
 
    { 
 
    "POSID": "105", 
 
    "Product": "10 Case Header" 
 
    } 
 
]; 
 
     for (var i = 0; i < data.length; i++) 
 
      { 
 
       options +="<option value=\"" + data[i].POSID + "\">" + data[i].Product + "</option>"; 
 
       //console.log(data[i].POSID + " " + data[i].Product); 
 
      } 
 

 
     var globalVariable=options; 
 
     console.log(globalVariable); 
 
    //}); 
 

 
     var maxField = 50; //Input fields increment limitation 
 
     var addButton = $('.add_button'); //Add button selector 
 
     var wrapper = $('.field_wrapper'); //Input field wrapper 
 
     //var fieldHTML = {row :function(f){ 
 
         //return '<h3><div>Item <input type="text" name="field_name['+f+'][]" value=""/>Material <input type="text" name="field_name['+f+'][]" value=""/><a href="javascript:void(0);" class="remove_button" title="Remove Field"><i class="material-icons" style="font-size:24px; color:blue">remove_circle</i></a></div></h3>'; 
 
         //}}; 
 
     var fieldHTML = {row :function optionload(f){ 
 
      var local = globalVariable; 
 
      console.log(local); 
 
      //event.preventDefault(); 
 
         return '<div>Item<input type="text" name="field_name['+f+'][]" value=""/>Material <select name="field_name['+f+'][]"><option value=""></option>' + local + '</select><a href="javascript:void(0);" class="remove_button" title="Remove Field"><i class="material-icons" style="font-size:24px; color:blue">remove_circle</i></a></div>'; 
 
     }}; 
 
     var x = 1; //initial field counter is 1 
 
     $(addButton).click(function(){ //Once add button is clicked 
 
      if(x < maxField){ 
 
       x++; 
 
       $(wrapper).append(fieldHTML.row(x)); //Add field html 
 
      } 
 
      }); 
 
     $(wrapper).on('click', '.remove_button', function(e){ //Once remove button is clicked 
 
         e.preventDefault(); 
 
     $(this).parent('div').remove(); //remove field html 
 
     x--; 
 
     }); 
 
}); 
 
    </script> 
 

 
    </html>

関連する問題