0

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

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>  
4

2 回答 2

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);
    }
于 2013-08-07T17:42:17.303 回答
1

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

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”返回的每个此类函数都将拥有它自己的循环索引的私有副本

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

于 2013-08-07T17:44:36.217 回答