Javascript大师,我需要你的帮助.
我需要比较两个不同的数组并检查不同的值.值来自相同形式的多选元素.我尝试获取当前值列表(cacheTermList)并检查更改时的新值(newTermList).我的想法是,如果输入新值,我想将id传递给ajax调用,并将一些数据返回到屏幕.
码:
var cachedTermList = $('select#edit-categories').val();
if (cachedTermList == null) {
var cachedTermList = new Array();
}
$('select#edit-categories').chosen().change(function() {
var newTermList = $('select#edit-categories').val();
if (cachedTermList != null) {
for(var i = 0; i < newTermList.length; i++) {
alert(newTermList[i]);
if (!($.inArray(newTermList[i], cachedTermList))) {
$.ajax({
type: "GET",
url: "/classifieds/js/term/" + newTermList[i],
success: function(data){
//$('div#term-help-text').html(data);
cachedTermList.push(newTermList[i]);
alert(cachedTermList);
}
});
}
}
} else {
}
});
Run Code Online (Sandbox Code Playgroud)
忍受我,我不倾向于经常使用Javascript.我试图通过在加载时设置cachedTermList来获取当前值列表,然后当select更改时,将newTermList设置为字段的新值,然后循环它,并检查该列表中不在的列表中的值缓存列表.
虽然我可以看到事情发生,并转储两个术语列表并查看不同的值,但对于我的生活,我无法将其找到将已找到的值推送到缓存列表,以便下次元素更改时,它不会保留一次又一次地向ajax调用发送相同的值.在执行.push()之后,它只添加没有值的',,,'.我哪里错了?
这是典型的闭环问题.所有success回调都引用相同的内容i.在执行回调时,循环已经完成并且i将具有值newTermList.length + 1,因此newTermList[i]将返回undefined.
您必须通过引入新范围来捕获索引或值,这可以通过调用函数来完成(JavaScript 没有块范围).
更新:另一个问题是,$.inArray不返回布尔值,而是返回元素的索引或-1.所以你必须比较返回值-1.
$('select#edit-categories').chosen().change(function() {
// ...
for(var i = 0; i < newTermList.length; i++) {
if ($.inArray(newTermList[i], cachedTermList) === -1) {
addTerm(newTermList[i], cachedTermList);
}
}
//...
});
function addTerm(term, target) {
$.ajax({
type: "GET",
url: "/classifieds/js/term/" + term,
success: function(data){
//$('div#term-help-text').html(data);
target.push(term);
alert(target);
}
});
}
Run Code Online (Sandbox Code Playgroud)
还要记住,所有Ajax调用基本上都会同时执行.循环不会等到一个调用完成.如果要一次执行一个调用,可以使用jQuery的Deferred对象.
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |