这里有一个有趣的问题,优化了一些代码,但在使用 javascript 循环而不是 jQuery 循环时遇到了范围问题。
例如,如果我们有 3 次“十年”迭代,其值为“1950”、“1960”和“1970”,使用 javascript 循环,我们将一直得到“1970”(循环中的最后一次迭代) “alert”的decade.name,但使用jQuery.each 我们得到每个创建元素的预期值。
问题: - 为什么这适用于 jQuery.each 而不是常规的 javascript 循环?- 我怎样才能使用普通的 javascript for 循环来完成这项工作?
$.ajax({
async: true,
type: 'post',
url: 'ajax/products.php',
data: {
'action': 'get_filter_decades',
'data': {
"search_term": ple.find('input[name="search_term"]').val(),
"first_letter": $.bbq.getState('first_letter'),
"category_id": categoryId.val(),
"original_release_year_range": ple.find('input[name="original_release_year_range"]').val()
}
},
success: function (jsonResponse) {
if (jsonObj = handleJsonResponse(jsonResponse)) {
var filterDecadesResultList = filterDecades.find('ul.decade_result_list');
filterDecadesResultList.hide();
filterDecadesResultList.empty();
var originalReleaseYearRange = $(ple.find('input[name="original_release_year_range"]'));
// jquery loop
//$( jsonObj.data.decades ).each( function( i, decade ) {
// javascript loop (faster!)
var decadesLength = jsonObj.data.decades.length;
var listElement;
var linkElement;
var decade;
for (var i = 0; i < decadesLength; i++) {
decade = jsonObj.data.decades[i];
listElement = $('<li />');
linkElement = $('<a />');
linkElement.text(decade.name);
if (decade.product_count > 0) {
linkElement.append(' (' + decade.product_count + ')');
if (decade.selected) {
linkElement.addClass('selected');
}
linkElement.on("click", function () {
alert(decade.name);
if (!linkElement.hasClass('selected')) {
originalReleaseYearRange.val(decade.name);
$.bbq.pushState({
'original_release_year_range': decade.name
});
productListPaginate(ple);
} else {
originalReleaseYearRange.val('');
$.bbq.removeState('original_release_year_range');
productListPaginate(ple);
}
});
}
listElement.append(linkElement);
filterDecades.find('ul.decade_result_list').append(listElement);
// jquery loop
//});
// javascript loop
}
filterDecadesResultList.show();
}
}
});