javascript - 如何将 JSON 数据显示到动态输入文本字段中?

标签 javascript jquery html json ajax

我有一个通过 AJAX GET 方法传入的 JSON 数据是:JsonData 存储在 var trDataSecondTable 中当我这样做时显示 console.log(trDataSecondTable) .

{  
   "assessCatAmount":[  
      {  
         "assessmentNo":1,
         "assessmentType":"PRE",
         "assessCatId":1,
         "assessReason":"A",
         "assessAmount":1,
         "assessPenalty":2,
         "entryBy":"PCS",
         "rStatus":"1"
      },
      {  
         "assessmentNo":1,
         "assessmentType":"PRE",
         "assessCatId":1,
         "assessReason":"D",
         "assessAmount":3,
         "assessPenalty":4,
         "entryBy":"PCS",
         "rStatus":"1"
      },
      {  
         "assessmentNo":1,
         "assessmentType":"PRE",
         "assessCatId":2,
         "assessReason":"B",
         "assessAmount":5,
         "assessPenalty":6,
         "entryBy":"PCS",
         "rStatus":"1"
      },
      {  
         "assessmentNo":1,
         "assessmentType":"PRE",
         "assessCatId":2,
         "assessReason":"E",
         "assessAmount":7,
         "assessPenalty":8,
         "entryBy":"PCS",
         "rStatus":"1"
      },
      {  
         "assessmentNo":1,
         "assessmentType":"PRE",
         "assessCatId":3,
         "assessReason":"C",
         "assessAmount":9,
         "assessPenalty":10,
         "entryBy":"PCS",
         "rStatus":"1"
      },
      {  
         "assessmentNo":1,
         "assessmentType":"PRE",
         "assessCatId":3,
         "assessReason":"F",
         "assessAmount":10,
         "assessPenalty":10,
         "entryBy":"PCS",
         "rStatus":"1"
      }
   ]
}

我的表单是这样的,是动态类型的(可以通过单击“+”添加或可以通过按“-”删除)

首次加载页面时我的表单如下所示:

enter image description here

我需要将这六个 JSON 数据显示到此表单中。如果有 3 个 JSON 数据,则总共应该有 3 行数据。如果有 12 个 json 数据,则需要显示 12 行数据。在输入字段中。

	function sumIt() {
  $("#formContainer [type=number]").each(function() {
    var $row = $(this).closest(".row");
    var $fields = $row.find("[type=number]");
    var val1 = $fields.eq(0).val();
    var val2 = $fields.eq(1).val();
    var tot = (isNaN(val1) ? 0 : +val1) + (isNaN(val2) ? 0 : +val2)
    $row.find(".sum").text(tot);
  });
  var total = 0;
  $(".sum").each(function() {
    total += isNaN($(this).text()) ? 0 : +$(this).text()
  });
  $("#tot").text(total);
  return total;
}

$(".customs-table .remove:lt(1)").hide();  
$(".vat-table     .remove:lt(1)").hide();  
$(".excise-table  .remove:lt(1)").hide();  

$("#formContainer").on("click", "button", function() {
  var selector = "div.row";
  var $div = $(this).closest(selector);
  if ($(this).is(".add")) {
    var $newDiv = $div.clone();
    $newDiv.find(":input").val(""); // clear all
    $newDiv.find("[type=number]").val(0); // clear numbers
    $newDiv.find(".sum").text(0); // clear total
    $newDiv.insertAfter($div)
  }
  else {
    $div.remove();
     sumIt(); 
  }
  $(".customs-table .remove:gt(0)").show();  
  $(".vat-table     .remove:gt(0)").show();  
  $(".excise-table  .remove:gt(0)").show();  
});


$("#formContainer").on("input", "[type=number]", sumIt);

$("form").submit(function() {
  event.preventDefault();
  var user_profile = [];
  $(".row").each(function() {
    var $fields = $(this).find(":input");
    if ($fields.length > 0) {
      var cat = $(this).find("div>label").eq(0).text(); // use the label of the row
      var catId = ["","Customs","VAT","Excise"].indexOf(cat)
      user_profile.push({
        assessmentType: "PRE",
        assessCatID : catId, 
        assessReason: $fields.eq(0).val(),
        assessAmount: $fields.eq(1).val(),
        assessPenalty: $fields.eq(2).val(),
        assessTotal: +$fields.eq(1).val() + +$fields.eq(2).val() // the leading + makes it a number
      });
    }
  });
  console.log(user_profile);
  
});
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
</head>
<body>
<form id="myForm">
  <div id="formContainer" class="col-md-12" style="float: none;">
    <!--  <button onclick="myFunction()" class="pull-right">+</button> -->
    <div style="margin-bottom: 30px;">
      <div class="form-group row">
        <div class="col-md-1"></div>
        <div class="col-md-4">
          <label>Reason</label>
        </div>
        <div class="col-md-2">
          <label>Amount</label>
        </div>
        <div class="col-md-2">
          <label>Penalty</label>
        </div>
        <div class="col-md-1">Total</div>
        <div class="col-md-2">Action</div>
      </div>
      <div class="customs-table row">
        <div class="col-md-1">
          <label>Customs</label>
        </div>
        <div class="col-md-4">
          <input type="text" class="form-control customReason" />
        </div>
        <div class="col-md-2">
          <input type="number" class="form-control txt customAmount" value="0" name="abc" min="0" />
        </div>
        <div class="col-md-2">
          <input type="number" class="form-control txt customPenalty" value="0" name="abc" min="0" />
        </div>
        <div class="col-md-1">
          <span class="sum">0</span>
        </div>
        <div class="col-md-2">
          <button type="button" class="add">+</button>
          <button type="button" class="remove">-</button>
        </div>
      </div>
      <div class="vat-table row">
        <div class="col-md-1">
          <label>VAT</label>
        </div>
        <div class="col-md-4">
          <input type="text" class="form-control vatReason" name="vatReason" />
        </div>
        <div class="col-md-2">
          <input type="number" class="form-control txt1 vatAmount" value="0" name="vatAmount" min="0" />
        </div>
        <div class="col-md-2">
          <input type="number" class="form-control txt1 vatPenalty" value="0" name="vatPenalty" min="0" />
        </div>
        <div class="col-md-1">
          <span class="sum">0</span>
        </div>
        <div class="col-md-2">
          <button type="button" class="add">+</button>
          <button type="button" class="remove">-</button>
        </div>
      </div>
      <div class="excise-table row">
        <div class="col-md-1">
          <label>Excise</label>
        </div>
        <div class="col-md-4">
          <input type="text" class="form-control exciseReason" name="exciseReason" />
        </div>
        <div class="col-md-2">
          <input type="number" class="form-control txt2 exciseAmount" value="0" name="exciseAmount" min="0" />
        </div>
        <div class="col-md-2">
          <input type="number" class="form-control txt2 excisePenalty" value="0" name="excisePenalty" min="0" />
        </div>
        <div class="col-md-1">
          <span class="sum">0</span>
        </div>
        <div class="col-md-2">
          <button type="button" class="add">+</button>
          <button type="button" class="remove">-</button>
        </div>
      </div>
      <div class="col-md-12 pull-right">
        <label>Total:</label>&nbsp;<b><span id="tot">0</span></b>
      </div>
    </div>
    <button type="submit" class="btn btn-success pull-right">Submit</button>
  </div>
</form>
</body>
</html>

我尝试使用 for 循环进行操作,但无法将它们显示到那些动态字段中。我怎样才能实现这一点?

更新的代码:

由于有海关、增值税、消费税,我需要它们的每个数字,例如 1,2。每个数字都以 1,2,3 等开头。 enter image description here

所以这就是我尝试的: 我添加了customNo类。

<div class="col-md-1 customNo">
            <label>Customs</label>
          </div>

为了显示 1,2,3,我声明了 3 个不同的变量。

var showEmpty=true;
  var i=1,j=1,k=1;
  $.each(data.assessCatAmount, function(_,cat) {
    showEmpty = false; // there was data
    var type = types[cat.assessCatId];
    var $newDiv = $("#formContainer").find("."+type+"-table").eq(0).clone(); 
    $.each(cat,function(key,value) {
    $(".customNo").append("<div><label for="name"> i </label></div>");
       var fieldName = key.replace("assess",type);
       var $field = $newDiv.find("."+fieldName);
       if ($field) $field.val(value);
       i=i+1;
    });
    $("#formContainer").append($newDiv)

所以我尝试了$(".customNo").append("<div><label for="name"> i </label></div>");它没有向我显示 1,2。我怎样才能得到这个?

最佳答案

您需要复制克隆部分

var types = ["","customs","vat","excise"]; // 1,2,3 must match class names
$.each(data.assessCatAmount, function(_,cat) {
  var type = types[cat.assessCatId];
  var $newDiv = $("#formContainer").find("."+type+"-table").eq(0).clone(); // clone the FIRST one
  $.each(cat,function(key,value) {
     var fieldName = key.replace("assess",type);
     var $field = $newDiv.find("."+fieldName);
     if ($field) $field.val(value);
  });
  $("#formContainer").append($newDiv)
});

您可能需要隐藏或填充前 3 个 div,因为我没有填充它们,我只用它们来克隆

还将总计移至底部,就像我在提交时所做的那样

var types = ["", "customs", "vat", "excise"]; // 1,2,3
function getText(str) {
  return $.trim(/\s/.test(str)?str.split(/\s+/)[1]:str);

}
var data = {
  "assessCatAmount": [{
      "assessmentNo": 1,
      "assessmentType": "PRE",
      "assessCatId": 1,
      "assessReason": "A",
      "assessAmount": 1,
      "assessPenalty": 2,
      "entryBy": "PCS",
      "rStatus": "1"
    },
    {
      "assessmentNo": 1,
      "assessmentType": "PRE",
      "assessCatId": 1,
      "assessReason": "D",
      "assessAmount": 3,
      "assessPenalty": 4,
      "entryBy": "PCS",
      "rStatus": "1"
    },
    {
      "assessmentNo": 1,
      "assessmentType": "PRE",
      "assessCatId": 2,
      "assessReason": "B",
      "assessAmount": 5,
      "assessPenalty": 6,
      "entryBy": "PCS",
      "rStatus": "1"
    },
    {
      "assessmentNo": 1,
      "assessmentType": "PRE",
      "assessCatId": 2,
      "assessReason": "E",
      "assessAmount": 7,
      "assessPenalty": 8,
      "entryBy": "PCS",
      "rStatus": "1"
    },
    {
      "assessmentNo": 1,
      "assessmentType": "PRE",
      "assessCatId": 3,
      "assessReason": "C",
      "assessAmount": 9,
      "assessPenalty": 10,
      "entryBy": "PCS",
      "rStatus": "1"
    },
    {
      "assessmentNo": 1,
      "assessmentType": "PRE",
      "assessCatId": 3,
      "assessReason": "F",
      "assessAmount": 10,
      "assessPenalty": 10,
      "entryBy": "PCS",
      "rStatus": "1"
    }
  ]
}


function sumIt() {
  $("#formContainer [type=number]").each(function() {
    var $row = $(this).closest(".row");
    var $fields = $row.find("[type=number]");
    var val1 = $fields.eq(0).val();
    var val2 = $fields.eq(1).val();
    var tot = (isNaN(val1) ? 0 : +val1) + (isNaN(val2) ? 0 : +val2)
    $row.find(".sum").text(tot);
  });
  var total = 0;
  $(".sum").each(function() {
    total += isNaN($(this).text()) ? 0 : +$(this).text()
  });
  $("#tot").text(total);
  return total;
}

// data={} // test no data
function addNums(i) {
  $(this).html(function() {
    var text = $(this).text();
    // Get the text without leading number - fake a space in case there are none yet
    var type = getText(text);
    var length = $("."+type.toLowerCase()+"-table").length;
    return (length===1?"":i+ "&nbsp;") + type; // only show numbers if more than one
  });
}


function cleanUp() {
  $(".customs-table .remove:gt(0)").show();
  $(".vat-table     .remove:gt(0)").show();
  $(".excise-table  .remove:gt(0)").show();

  $(".customs-table.row > div > label").each(addNums);
  $(".vat-table.row > div > label").each(addNums);
  $(".excise-table.row > div > label").each(addNums);

}


$(function() {

  $(".customs-table .remove:lt(1)").hide();
  $(".vat-table     .remove:lt(1)").hide();
  $(".excise-table  .remove:lt(1)").hide();

  $("#formContainer").on("click", "button", function() {
    var selector = "div.row";
    var $div = $(this).closest(selector);
    if ($(this).is(".add")) {
      var $newDiv = $div.clone();
      $newDiv.find(":input").val(""); // clear all
      $newDiv.find("[type=number]").val(0); // clear numbers
      $newDiv.find(".sum").text(0); // clear total
      $newDiv.insertAfter($div)
    } else {
      $div.remove();
      sumIt();
    }
    cleanUp();
  });


  $("#formContainer").on("input", "[type=number]", sumIt);

  $("form").submit(function() {
    event.preventDefault();
    var user_profile = [];
    $(".row:visible").each(function() {
      var $fields = $(this).find(":input");
      if ($fields.length > 0) {
        var cat = getText($(this).find("div>label").eq(0).text()); // use the label of the row
        var catId = types.indexOf(cat.toLowerCase())
        user_profile.push({
          assessmentType: "PRE",
          assessCatID: catId,
          assessReason: $fields.eq(0).val(),
          assessAmount: $fields.eq(1).val(),
          assessPenalty: $fields.eq(2).val(),
          assessTotal: +$fields.eq(1).val() + +$fields.eq(2).val() // the leading + makes it a number
        });
      }
    });
    console.log(user_profile);
  });

  var showEmpty = true;
  $.each(data.assessCatAmount, function(_, cat) {
    showEmpty = false; // there was data
    var type = types[cat.assessCatId];
    var $newDiv = $("#formContainer").find("." + type + "-table").eq(0).clone();
    $.each(cat, function(key, value) {
      var fieldName = key.replace("assess", type);
      var $field = $newDiv.find("." + fieldName);
      if ($field) $field.val(value);
    });
    $("#formContainer").append($newDiv)
  });
  $(".customs-table").eq(0).toggle(showEmpty);
  $(".vat-table").eq(0).toggle(showEmpty);
  $(".excise-table").eq(0).toggle(showEmpty);
  cleanUp();
});
<!DOCTYPE html>
<html>

<head>
  <title></title>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
</head>

<body>
  <form id="myForm">
    <div id="formContainer" class="col-md-12" style="float: none;">
      <!--  <button onclick="myFunction()" class="pull-right">+</button> -->
      <div style="margin-bottom: 30px;">
        <div class="form-group row">
          <div class="col-md-1"></div>
          <div class="col-md-4">
            <label>Reason</label>
          </div>
          <div class="col-md-2">
            <label>Amount</label>
          </div>
          <div class="col-md-2">
            <label>Penalty</label>
          </div>
          <div class="col-md-1">Total</div>
          <div class="col-md-2">Action</div>
        </div>
        <div class="customs-table row">
          <div class="col-md-1">
            <label>Customs</label>
          </div>
          <div class="col-md-4">
            <input type="text" class="form-control customsReason" />
          </div>
          <div class="col-md-2">
            <input type="number" class="form-control txt customsAmount" value="0" name="abc" min="0" />
          </div>
          <div class="col-md-2">
            <input type="number" class="form-control txt customsPenalty" value="0" name="abc" min="0" />
          </div>
          <div class="col-md-1">
            <span class="sum">0</span>
          </div>
          <div class="col-md-2">
            <button type="button" class="add">+</button>
            <button type="button" class="remove">-</button>
          </div>
        </div>
        <div class="vat-table row">
          <div class="col-md-1">
            <label>VAT</label>
          </div>
          <div class="col-md-4">
            <input type="text" class="form-control vatReason" name="vatReason" />
          </div>
          <div class="col-md-2">
            <input type="number" class="form-control txt1 vatAmount" value="0" name="vatAmount" min="0" />
          </div>
          <div class="col-md-2">
            <input type="number" class="form-control txt1 vatPenalty" value="0" name="vatPenalty" min="0" />
          </div>
          <div class="col-md-1">
            <span class="sum">0</span>
          </div>
          <div class="col-md-2">
            <button type="button" class="add">+</button>
            <button type="button" class="remove">-</button>
          </div>
        </div>
        <div class="excise-table row">
          <div class="col-md-1">
            <label>Excise</label>
          </div>
          <div class="col-md-4">
            <input type="text" class="form-control exciseReason" name="exciseReason" />
          </div>
          <div class="col-md-2">
            <input type="number" class="form-control txt2 exciseAmount" value="0" name="exciseAmount" min="0" />
          </div>
          <div class="col-md-2">
            <input type="number" class="form-control txt2 excisePenalty" value="0" name="excisePenalty" min="0" />
          </div>
          <div class="col-md-1">
            <span class="sum">0</span>
          </div>
          <div class="col-md-2">
            <button type="button" class="add">+</button>
            <button type="button" class="remove">-</button>
          </div>
        </div>
      </div>
    </div>
    <div class="col-md-12 pull-right">
      <label>Total:</label>&nbsp;<b><span id="tot">0</span></b>
    </div>
    <button type="submit" class="btn btn-success pull-right">Submit</button>
  </form>
</body>

</html>

关于javascript - 如何将 JSON 数据显示到动态输入文本字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53690082/

相关文章:

Javascript appendChild onload 事件

javascript - 将一组 DIV 滑动或淡入淡出

javascript - 上下文菜单事件后未注册 Keyup 事件

javascript - jQuery向文本添加数字

jquery - 内容添加了两次,但只循环一次

html - 彩色元素顶部的水平滚动阴影

javascript - 按元素位置显示大 div 的一小部分

javascript - 正则表达式接受格式为 00.00 的数字

javascript - Jquery加载部分外部HTML

javascript - 根据类名显示/隐藏 div