从 html 输入文本和标签获取 JSON 对象中的值

Posted

技术标签:

【中文标题】从 html 输入文本和标签获取 JSON 对象中的值【英文标题】:Get values in JSON object from html input text and label 【发布时间】:2018-05-24 15:04:31 【问题描述】:

我有一个 html,目前通过它获取数组中循环中 input 元素的值。

但现在我想在带有标签的 json 对象中使用它。

下面是我的html:-

<div class="vendorDaterow">
    <div class="vendorName" id="dvVendorNameData">
        <label>SP Vender Name</label><span><input type="text" value="" name="nmVendorData" id="txtVendorName"/></span>
    </div>
    <div class="vendorFromDate">
        <label>From Date</label>
        <span class="datepicker">
        <input type="text" value="" name="spFromDate" id="spFromDate" class="dateClass"/>
        <i class="fa fa-calendar" aria-hidden="true"></i>
        </span>
    </div>
    <div class="vendorToDate">
        <label>To Date</label>
        <span class="datepicker">
            <input type="text" value="" name="spToDate" id="spToDate" class="dateClass1"/>
            <i class="fa fa-calendar" aria-hidden="true"></i>
        </span>
    </div>
</div>

和我的 js 一样

var arrVendorValues;
    arrVendorValues = []
    $(".vendorDaterow input").each(function () 
        var text = $(this).val();
        if (text) 
            arrVendorValues.push(text);
        
    )

我想要的输出是这样的

供应商名称:ABC,ToDate:10/10/2010,FromDate:11/11/2017 供应商名称:XYZ,ToDate:10/10/2010,FromDate:11/11/2017 供应商名称:AAA,ToDate:10/10/2010,FromDate:11/11/2017

【问题讨论】:

您可能需要一个对象(注意,不是 JSON 对象,因为这样的东西不存在),而不是一个数组 - 然后您在对象上使用 JSON.stringify 来制作它转换成 JSON - 这是一个字符串 @JaromandaX:是的,你说得对。那我该怎么做。我还希望labelinput 值也在循环中。我应该如何进行 【参考方案1】:

请在标签中添加for 属性并对其进行迭代

HTML

<div class="vendorDaterow">
  <div class="vendorName" id="dvVendorNameData">
    <label for="txtVendorName" class="text-label">SP Vender Name</label><span><input type="text" value="" name="nmVendorData" id="txtVendorName"/></span>
  </div>
  <div class="vendorFromDate">
    <label class="text-label" for="spFromDate">From Date</label>
    <span class="datepicker">
        <input type="text" value="" name="spFromDate" id="spFromDate" class="dateClass"/>
        <i class="fa fa-calendar" aria-hidden="true"></i>
        </span>
  </div>
  <div class="vendorToDate">
    <label class="text-label" for="spToDate">To Date</label>
    <span class="datepicker">
            <input type="text" value="" name="spToDate" id="spToDate" class="dateClass1"/>
            <i class="fa fa-calendar" aria-hidden="true"></i>
        </span>
  </div>
</div>

JS

$(document).ready(function() 
  var arrVendorValues = [];

  $(".text-label").each(function() 

    var key = $(this).text();
    var value = $("#" + $(this).attr('for')).val();
    arrVendorValues.push(
      key: key,
      value: value
    )
  )

  console.log(arrVendorValues)
);

如果你需要它作为独立功能

function getInputsAsJSON() 
  var arrVendorValues = [];
  $(".text-label").each(function() 

    var key = $(this).text();
    var value = $("#" + $(this).attr('for')).val();
    arrVendorValues.push(
      key: key,
      value: value
    )
  );
  return arrVendorValues;

您可以根据您的要求在一些click 中触发它。

【讨论】:

【参考方案2】:

您需要创建 JSON 对象数组。然后检查输入元素的类。

var arrVendorValues = [];
function generateData()
  $(".vendorDaterow").each(function () 
    var allInputs = $(this).find("input");
    var objectToAdd = ;
    for(var i = 0; i < allInputs.length; i++)
      if(allInputs[i].name == "nmVendorData")
        objectToAdd["VendorName"] = allInputs[i].value; 
      
      else if(allInputs[i].name == "spFromDate")
        objectToAdd["ToDate"] = allInputs[i].value;
      
      else if(allInputs[i].name == "spToDate")
        objectToAdd["FromDate"] = allInputs[i].value;
      
    
    arrVendorValues.push(objectToAdd);
  );
  console.log(arrVendorValues);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="vendorDaterow">
                                        <div class="vendorName" id="dvVendorNameData">
                                            <label>SP Vender Name</label><span><input type="text" value="" name="nmVendorData" id="txtVendorName" /></span>
                                        </div>
                                        <div class="vendorFromDate">
                                            <label>From Date</label><span class="datepicker"><input type="text" value="" name="spFromDate" id="spFromDate" class="dateClass" /><i class="fa fa-calendar" aria-hidden="true"></i></span>
                                        </div>
                                        <div class="vendorToDate">
                                            <label>To Date</label><span class="datepicker"><input type="text" value="" name="spToDate" id="spToDate" class="dateClass1" /><i class="fa fa-calendar" aria-hidden="true"></i></span>
                                        </div>
                                    </div>
                                    
<button onclick="generateData();">Generate Data</button>                                    

【讨论】:

得到 object object 。如何获取值 最初所有的输入都是空的。要么在代码中设置值,要么将上面的代码包装在函数中,然后在单击按钮或填充输入框值后调用它。【参考方案3】:

使用 filter() 从集合中删除空对象,使用 map() 创建数组

var data = $('.vendorDaterow input').filter(function()
  return this.value;// filter out empty values
).map(function()
  var label = $(this).closest('div').find('label').text(),
        o =;
  o[label] = this.value;
  return o;
).get()

console.log(data)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="vendorDaterow">
  <div class="vendorName" id="dvVendorNameData">
    <label>SP Vender Name</label><span><input type="text" value="123" name="nmVendorData" id="txtVendorName" /></span>
  </div>
  <div class="vendorFromDate">
    <label>From Date</label><span class="datepicker"><input type="text" value="" name="spFromDate" id="spFromDate" class="dateClass" /><i class="fa fa-calendar" aria-hidden="true"></i></span>
  </div>
  <div class="vendorToDate">
    <label>To Date</label><span class="datepicker"><input type="text" value="456" name="spToDate" id="spToDate" class="dateClass1" /><i class="fa fa-calendar" aria-hidden="true"></i></span>
  </div>
</div>

【讨论】:

[label]: this.value; 出现一些语法问题 @VVVV 实际上是动态属性名称的 es6 语法...运行它会看到它工作正常 不,它给我错误javascript critical error at line 309, column 21 in https://localhost:44300/Scripts/App/FiberEngineer.js\n\nSCRIPT1028: Expected identifier, string or number ok...将使用 es5 语法修复。点击运行代码 sn -p 可以看到它在现代浏览器中运行【参考方案4】:

只需创建一个映射来保存显示名称和相应的name html 属性的映射。在迭代器中,将结果推送到 JSON 对象而不是数组中。像这样的,

<div class="vendorDaterow">
<div class="vendorName" id="dvVendorNameData">
    <label>SP Vender Name</label><span><input type="text" value="" name="nmVendorData" id="txtVendorName"/></span>
</div>
<div class="vendorFromDate">
    <label>From Date</label>
    <span class="datepicker">

    <input type="text" value="" name="spFromDate" id="spFromDate" class="dateClass"/>
    <i class="fa fa-calendar" aria-hidden="true"></i>
    </span>
</div>
<div class="vendorToDate">
    <label>To Date</label>
    <span class="datepicker">
        <input type="text" value="" name="spToDate" id="spToDate" class="dateClass1"/>
        <i class="fa fa-calendar" aria-hidden="true"></i>
    </span>
</div>

var map=nmVendorData:'Vendor Name', spFromDate:'FromDate', spToDate:'ToDate', 
result=;
$(".vendorDaterow input").each(function (a,b) 
    var text = $(this).val();
  result[map[$(b)[0].name]] = text;

)

您的result 对象将保存您的预期结果。

如果您确实想从用户那里收集多个输入,只需添加一些click 处理程序以提交表单并将result 对象推送到某个数组中。

【讨论】:

【参考方案5】:
$(document).ready(function() 
    $('#btnSubmit').click(function() 
        var arrVendorValues = []
        var vendorDaterowObject = $(".vendorDaterow input");

        vendorDaterowObject.each(function() 
            var text = $(this).val();
            if (text) 
                arrVendorValues.push($(this).parents('.label-input').find('label').text() + ': ' + text);
            
        );

        $('h3').text(arrVendorValues.join(', '));
    );
);

Demo

【讨论】:

以上是关于从 html 输入文本和标签获取 JSON 对象中的值的主要内容,如果未能解决你的问题,请参考以下文章

从对象标签上的数据属性获取文本时,文本对齐不起作用

javascript 怎样获取节点文本值?

如何从 JSON 响应中删除不需要的标签

innerHTML innerText的使用和区别

从 html 文档中的合格 span 标签获取类值和文本

从 UITableViewController 中的选定行获取选定的标签文本