我收到以下错误:TypeError:slides [i]未定义。
奇怪,因为它不应该能够访问slide变量吗?
<script>
$('document').ready(function() {
$.ajax({
type: "POST",
url: "getSlides.php",
data: '',
cache: false,
success: function(response)
{
var slides = JSON.parse(response);
for (var i = 0; i < slides.length; i++) {
setTimeout(function() {
if (slides[i].type === 'image') {
$('#slideshow').html('<img src="' + slides[i].image_video + '" />');
}
}, 2000);
}
}
});
});
</script>
答案 0 :(得分:1)
看起来像classic closure in a loop problem
$('document').ready(function () {
$.ajax({
type: "POST",
url: "getSlides.php",
dataType: 'json',
cache: false,
success: function (response) {
$.each(slides, function (slide) {
if (slide.type === 'image') {
$('#slideshow').html('<img src="' + slide.image_video + '" />');
}
})
}
});
});
答案 1 :(得分:1)
您可以代理sildes[i]
至setTimeout
功能回调,ref,fiddle示例
$('document').ready(function () {
$.ajax({
type: "POST",
url: "getSlides.php",
data: '',
cache: false,
success: function (response) {
var slides = JSON.parse(response);
for (var i = 0; i < slides.length; i++) {
setTimeout(function (slide) {
if (slide.type === 'image') {
$('#slideshow').html('<img src="' + slide.image_video + '" />');
}
}, 2000, slides[i]);
}
}
});
});
答案 2 :(得分:0)
如果我没有误会,这是一个经典错误,setTimeout将在循环结束后执行异步,所以在回调运行时我应该等于slides.length。要解决此问题,请为i创建一个本地范围,如下所示:
for (var i = 0; i < slides.length; i++) {
(function(i){
setTimeout(function(callback) {
if (slides[i].type === 'image') {
$('#slideshow').html('<img src="' + slides[i].image_video + '" />');
}
}, 2000);
})(i)
}
答案 3 :(得分:0)
因为setTimeOut会在2000ms之后调用你的代码,在那个时候i的值是slide.length,它会抛出错误。
您必须安排为每个超时功能提供“i”的独特副本。
success: function (response) {
var slides = JSON.parse(response);
for (var i = 0; i < slides.length; i++) {
doSetTimeout(slides, i);
}
}
function doSetTimeout(slides, i) {
setTimeout(function () {
if (slides[i].type === 'image') {
$('#slideshow').html('<img src="' + slides[i].image_video + '" />');
}
}, 2000);
}
答案 4 :(得分:0)
尝试替换:
for (var i = 0; i < slides.length; i++) {
为:
for (var i in slides) {