功能:第一个选择框做了选择,子选择框的选项会做相应的筛选。
方法:把相关的选择框id和post URL放在数组里,然后遍历去做更新。
问题:因为是异步的,等第一个post做完以后for循环已经做完了,i永远是最后的值,请问如何控制每个post都能得到对应的i?
或者应该用别的方法来实现?求指点,多谢。
选择框用了multipleSelect插件
代码如下:
for (i = 0; i < nextID.length; i++) { $.post(nextURL[i].toString(), { ID: $("#sel_ta").multipleSelect("getSelects").toString() }) .then( function (data) { cID = $(String(nextID[i])); var html = []; $.each(data, function (d, data) { html.push('<option value="' + data.id + '">' + data.text + '</option>'); }); cID.html(html.join('')).multipleSelect(); }); }
网上查了一下“立即执行的匿名函数”可以正确的传i的值,但是不知道怎么传post得到的data。
经典的闭包问题,在var z = 0;上面,加上一句var a=i;后面的i都用a代替。
刚刚试了一下,a始终是最后一个i的值。
@moiam: 不好意思,昨天我没有试,按C#里面的写了,JS里面你可以试一下写成传参的方式。给你一个我写的Demo:
for(var i=0;i<10;i++){setTimeout(function(a){console.info(a);},i);}
也就是说,你把你里面的操作写成一个function,然后这个functioni作为参数,就可以了,传参的时候js里面才是传值 ,其它的闭包可能无论怎么调都是传址。
1 for (i = 0; i < nextID.length; i++) { 2 Send(i); 3 } 4 function Send(i){ 5 $.post(nextURL[i].toString(), 6 { 7 ID: $("#sel_ta").multipleSelect("getSelects").toString() 8 }) 9 .then( 10 function (data) { 11 cID = $(String(nextID[i])); 12 var html = []; 13 $.each(data, function (d, data) { 14 html.push('<option value="' + data.id + '">' + data.text + '</option>'); 15 }); 16 cID.html(html.join('')).multipleSelect(); 17 }); 18 }
试一下,如果不行,可能得传形参放在post里面而不是外面,你先试一下。
@ensleep: 太感谢了!完美解决问题!谢谢!
ajax就是这样的,类似i这样变化的值,需要从返回的data中获取.
也就是说,你要先传到服务器,再从服务器传回来.,