【问题标题】:Grab an element's value within each of the dynamic div在每个动态 div 中获取元素的值
【发布时间】:2017-05-16 07:31:21
【问题描述】:

我有一个数组 ob 对象,我正在使用它创建动态 div。我的每个对象都有一个属性“logoColor”,其值为 1 或 2。

现在,在我的每个动态 div 中,我都有一个下拉菜单“徽标颜色”,其值为 1 或 2。但是,它显示为“红色”或“蓝色”。

用户可以选择更改下拉菜单中的任何 logoColor 值。

如何在单击“发送数据”按钮时调用的同一函数 sendData() 中从动态生成的 div 中获取每个下拉列表的值?

代码片段:

var myData =[{
  "company" : "ABC",
  "logoColor": "1"
},{
  "company" : "BCD",
  "logoColor": "2"
},{
  "company" : "CDE", 
  "logoColor": "1"
},{
  "company" : "DEF", 
  "logoColor": "2"
}];

		
function createDisplay() {
  myData.forEach(function(obj) {
	$('.container').append(
	  $('<div>').addClass('box').append(
		$('<label>').text('Company Website: '),
		$('<span>').text(obj.company),
		$('<br /><label>').text('Logo Colour: '),
		$('<select>').addClass('selectLogo').append(
		  $('<option>').val('1').text('Red').prop('selected', true),
		  $('<option>').val('2').text('Blue')
		).val(obj.logoColor)
	  )
	)
  });
}

function sendData(){
	
  myData.forEach(function(obj){
	var logoColor = $('.selectLogo').val();
  });
  var myJSON = JSON.stringify(myData);
  var dataContent = {'content': myJSON};
  
  $.ajax({
	url:"/abc/myNewData",
	type: "POST",
	data: dataContent,
	dataType: 'JSON',
	success: function(response){
	  alert("Data sent successfully!");
	}
  }); 
}
.box {
	background-color: skyblue;
	height: 100px;
	border: 2px solid lightgrey;
	border-radius: 4px;
	margin-top: 5px;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<button class="btn btn-primary" onclick="createDisplay()">Create Data </button>	
<button class="btn btn-primary" onclick="sendData()">Send Data </button>	
<div class="container">
	
</div>

【问题讨论】:

    标签: jquery object recursion dynamic html-select


    【解决方案1】:

    试试下面的代码

    var logoColor = [];
    $('.box .selectLogo option:selected').each(function() {
      logoColor.push($(this).val())
    })
    var myJSON = JSON.stringify(logoColor);
    var dataContent = {
      'content': myJSON
    };
    

    这将遍历所有 div 选择并返回所选值。

    var myData = [{
      "company": "ABC",
      "logoColor": "1"
    }, {
      "company": "BCD",
      "logoColor": "2"
    }, {
      "company": "CDE",
      "logoColor": "1"
    }, {
      "company": "DEF",
      "logoColor": "2"
    }];
    
    
    function createDisplay() {
      myData.forEach(function(obj) {
        $('.container').append(
          $('<div>').addClass('box').append(
            $('<label>').text('Company Website: '),
            $('<span>').text(obj.company),
            $('<br /><label>').text('Logo Colour: '),
            $('<select>').addClass('selectLogo').append(
              $('<option>').val('1').text('Red').prop('selected', true),
              $('<option>').val('2').text('Blue')
            ).val(obj.logoColor)
          )
        )
      });
    }
    
    function sendData() {
      var logoColor = [];
      $('.box .selectLogo option:selected').each(function() {
        logoColor.push($(this).val())
      })
    
      var myJSON = JSON.stringify(logoColor);
      var dataContent = {
        'content': myJSON
      };
    
      console.log(dataContent)
      $.ajax({
        url: "/abc/myNewData",
        type: "POST",
        data: dataContent,
        dataType: 'JSON',
        success: function(response) {
          alert("Data sent successfully!");
        }
      });
    }
    .box {
      background-color: skyblue;
      height: 100px;
      border: 2px solid lightgrey;
      border-radius: 4px;
      margin-top: 5px;
    }
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <button class="btn btn-primary" onclick="createDisplay()">Create Data </button>
    <button class="btn btn-primary" onclick="sendData()">Send Data </button>
    <div class="container">
    
    </div>

    【讨论】:

      【解决方案2】:

      尝试循环遍历动态生成的div,如下:

      var myData = [];
          $("div.box").each(function(i){
        var obj = {};
         console.log("index"+i);
          obj["company"] = $(this).find("span").text();
          obj["logoColor"] =  $(this).find('.selectLogo').val();
          myData.push(obj);
        });
      

      var myData = [{
        "company": "ABC",
        "logoColor": "1"
      }, {
        "company": "BCD",
        "logoColor": "2"
      }, {
        "company": "CDE",
        "logoColor": "1"
      }, {
        "company": "DEF",
        "logoColor": "2"
      }];
      
      
      function createDisplay() {
        myData.forEach(function(obj) {
          $('.container').append(
            $('<div>').addClass('box').append(
              $('<label>').text('Company Website: '),
              $('<span>').text(obj.company),
              $('<br /><label>').text('Logo Colour: '),
              $('<select>').addClass('selectLogo').append(
                $('<option>').val('1').text('Red').prop('selected', true),
                $('<option>').val('2').text('Blue')
              ).val(obj.logoColor)
            )
          )
        });
      }
      
      function sendData() {
        var myData = [];
        $("div.box").each(function(i) {
          var obj = {};
          console.log("index"+i);
          obj["company"] = $(this).find("span").text();
          obj["logoColor"] = $(this).find('.selectLogo').val();
          myData.push(obj);
        });
        var myJSON = JSON.stringify(myData);
        alert(myJSON);
        var dataContent = {
          'content': myJSON
        };
      
        $.ajax({
          url: "/abc/myNewData",
          type: "POST",
          data: dataContent,
          dataType: 'JSON',
          success: function(response) {
            alert("Data sent successfully!");
          }
        });
      }
      .box {
        background-color: skyblue;
        height: 100px;
        border: 2px solid lightgrey;
        border-radius: 4px;
        margin-top: 5px;
      }
      <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
      
      <button class="btn btn-primary" onclick="createDisplay()">Create Data </button>
      <button class="btn btn-primary" onclick="sendData()">Send Data </button>
      <div class="container">
      
      </div>

      【讨论】:

      • find("span").val() 应该是find("span").text()
      • @CarstenLøvboAndersen:谢谢 :)
      • 知道如何同时获取每个具有 '.box' 类的 div 的索引吗?我试过 $(this).parents('.box').index();但它总是返回 -1!
      【解决方案3】:
      Try : 
      
      var logoColor = $(this).find(".selectLogo").val();
      

      【讨论】:

      • $(this) 将返回“发送数据”按钮,因为我单击了该按钮,并且单击它会调用我的函数 sendData()。
      • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
      猜你喜欢
      • 2018-08-19
      • 2012-02-08
      • 2023-04-07
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多