这可以根据第一个下拉菜单的结果动态创建第二个下拉菜单:
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>
答案 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”返回的每个这样的函数都将拥有它自己的循环索引的私有副本。
(注意编辑 - 需要在辅助函数中构造整个“更改”处理程序。)