2013-11-14 4 views
-1

Я получаю следующую ошибку: TypeError: слайды [i] не определены.TypeError: variable undefined

Его странно, потому что он не должен иметь доступ к переменной слайдов?

<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> 
+2

Вы уверены, что 'slides' переменная является массивом? – VisioN

ответ

0

Похож 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 + '" />'); 
       } 
      }) 
     } 
    }); 
}); 
0

Если я не ошибаюсь, это классическая ошибка, SetTimeout выполнит асинхра, после того, как цикл закончен, поэтому я должен быть равен горки .length при обратном вызове. Чтобы это исправить, создать локальную область для ввода, например:

   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) 
       } 
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]); 
      } 
     } 
    }); 
}); 
0

потому, что из-за SetTimeout это вызывает код после 2000 мс, в это время значение i является slides.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); 
} 
0

Попробуйте заменить:

for (var i = 0; i < slides.length; i++) { 

к:

for (var i in slides) { 
+0

В чем разница? Если 'slides' является массивом, необходимо использовать простой' for' loop * must *. – VisioN

+0

Вы уверены, что слайды - это массив, а не объект? –

+0

[Я не] (http://stackoverflow.com/questions/19976568/typeerror-variable-is-undefined#comment29737428_19976568). Однако случайно наличие объекта с свойством 'length' довольно сомнительно. – VisioN