带有动态div id的循环javascript

时间:2013-08-07 17:38:33

标签: javascript html dynamic for-loop

这可以根据第一个下拉菜单的结果动态创建第二个下拉菜单:

for (var i = 0; i < 1; i++) {
    $('#wdiv' + i).change(function() {
        var wdiv = $(this).val();

        $.ajax({
            type: "POST",
            url: "populate_classes.php",
            data: 'theOption=' + wdiv,
            success: function(whatigot) {
                $('#class_list' + i).html(whatigot);
            } 

        }); //END $.ajax
    }); //END dropdown change event 
}

为什么输入来自下拉选择#wdiv0更改下拉菜单#class_list1?我希望#wdiv选择设置#classlist0下拉选择。

以下是表格的一部分:

<fieldset><legend>Select Divisions</legend>              
  <table width="100%" border="0" cellspacing="0" cellpadding="5">
  <tr>
    <td><div align="center"><u><strong>Name</strong></u></div></td>
    <td><div align="center"><u><strong>Division</strong></u></div></td>
    <td><div align="center"><u><strong>Class</strong></u></div></td>
  </tr>
  <?php for ($i = 0; $i < $wrestlerkey; $i++) {    
      $sql = 'SELECT * FROM tourn_division AS td WHERE t_num = ?';
      $divresult = $dbConnect->fetchAll($sql, $_SESSION['tourn_id']);
      $divcount = count($divresult);
  ?>          
    <tr>
      <td width="20%" bgcolor="#CCCCCC"><div align="right"><?php echo $_SESSION['wfirst'][$i] . " " . $_SESSION['wlast'][$i] . ":"; ?></div></td>
      <td>
        <select name="<?php echo "wdiv" . $i ?>" id="<?php echo "wdiv" . $i ?>">
        <?php for ($d = 0; $d < $divcount; $d++) { ?>
          <option value="<?php echo $divresult[$d]->div_num; ?>"><?php echo $divresult[$d]->div_name; ?></option>
        <?php } ?>  
      </select></td>
      <td>
      <div id="<?php echo "class_list" . $i ?>"></div>
      </td>
    </tr>
    <?php } ?>
  </table>
</fieldset>  

2 个答案:

答案 0 :(得分:1)

循环结束后,ajax响应返回,因此它始终是i的最后一个值。您需要将变量设置为i或在其周围放置一个闭包:

    for (var i = 0; i < 1; i++) {
       var currentIndex = i; // this will not work (see comments below)
        $('#wdiv' + i).change({currentIndex: i}, function(e) {
            var wdiv = $(this).val();
            var currentIndex = e.data.currentIndex;
            $.ajax({
                type: "POST",
                url: "populate_classes.php",
                data: 'theOption=' + wdiv,
                success: function(whatigot) {
                    $('#class_list' + currentIndex).html(whatigot);
                } 

            }); //END $.ajax
        }); //END dropdown change event 
    }

for (var i = 0; i < 1; i++) {
   (function (i){
        $('#wdiv' + i).change(function() {
            var wdiv = $(this).val();

              $.ajax({
                type: "POST",
                url: "populate_classes.php",
                data: 'theOption=' + wdiv,
                success: function(whatigot) {
                    $('#class_list' + i).html(whatigot);
                } 

              }); //END $.ajax

        }); //END dropdown change event 
      })(i);
    }

答案 1 :(得分:1)

这种情况正在发生,因为您创建的AJAX回调处理程序共享对同一变量“i”的引用。为了避免这种情况,您可以使用单独的函数 edit 创建“成功”处理程序 - 实际上,由于此处代码结构的性质,您需要在一个单独的函数中进行整个“更改”回调。单独的功能:

function makeChangeHandler(listIndex) {
  return function() {
    var wdiv = $(this).val();

    $.ajax({
        type: "POST",
        url: "populate_classes.php",
        data: 'theOption=' + wdiv,
        success: function(whatigot) {
            $('#class_list' + listIndex).html(whatigot);
        } 
     });
  };
}

// ...

for (var i = 0; i < 2; i++) { // for 2, substitute actual number of elements involved
    $('#wdiv' + i).change( makeChangeHandler(i) );
}

该函数将返回实际的处理函数。 “makeSuccessHandler”返回的每个这样的函数都将拥有它自己的循环索引的私有副本

(注意编辑 - 需要在辅助函数中构造整个“更改”处理程序。)