2016-07-27 3 views
-1

Я не понимаю, почему я могу распечатать console.log(imgs), но я не могу распечатать console.log(imgs[0])Javascript элемент массива не определен

$(function() { 
    var imgs = []; 
    var dir = "images/"; 
    var fileextension = ".png"; 

    $.ajax({ 
     url: dir, 
     success: function (data) { 
      $(data).find("a:contains(" + fileextension + ")").each(function() { 
       var filename = this.href.replace(window.location.host, "").replace("http://", ""); 
       imgs.push(dir+filename); 
      }); 
     } 
    }); 

    console.log(imgs);//ok 
    console.log(imgs[0]);//undefined 
    //$('body').css({'background-image': 'url(images/' + imgs[Math.floor(Math.random() * imgs.length)] + ');'}); 
}); 
+0

Я включил jQuery – Cver

+0

Что такое результат данных ajax? –

+0

Уточнить: console.log (imgs [0]) показывает, что? Не определено? если это выполняется до того, как будет выполнен ваш ASYNC imgs.push(). Поместите console.log (imgs [0]) после imgs.push(), чтобы он срабатывал после того, как этот шаг завершен. –

ответ

0

По умолчанию $.ajax выполняется асинхронно. Если добавить больше журналов консоли, как в этом примере:

$(function() { 
var imgs = []; 
var dir = "images/"; 
var fileextension = ".png"; 
console.log('telling jquery to load some data') 
$.ajax({ 
    url: dir, 
    success: function (data) { 
     console.log('data loaded'); 
     $(data).find("a:contains(" + fileextension + ")").each(function() { 
      var filename = this.href.replace(window.location.host, "").replace("http://", ""); 
      imgs.push(dir+filename); 
     }); 
     console.log('data parsed'); 
    } 
}); 

console.log("try to print images", imgs[0]); 
//$('body').css({'background-image': 'url(images/' + imgs[Math.floor(Math.random() * imgs.length)] + ');'}); 
}); 

Вы увидите, что когда вы пытаетесь напечатать imgs[0] Аякса еще не загружен.

+0

Спасибо, это правильно! – Cver

1

Метод ajax является асинхронным, так что вам нужно использовать функцию обратного вызова использовать imgs переменная после вызова ajax. Или вы можете переместить свой код внутри success function, как это:

$(function() { 
    var imgs = []; 
    var dir = "images/"; 
    var fileextension = ".png"; 
    $.ajax({ 
     url: dir, 
     success: function (data) { 
      $(data).find("a:contains(" + fileextension + ")").each(function() { 
       var filename = this.href.replace(window.location.host, "").replace("http://", ""); 
       imgs.push(dir+filename); 
      }); 

      console.log(imgs);//ok 
      console.log(imgs[0]);//undefined 
      //$('body').css({'background-image': 'url(images/' + imgs[Math.floor(Math.random() * imgs.length)] + ');'}); 
     } 
    }); 
}); 
1

Это потому, что Ajax является асинхронной и JavaScript является синхронным.

Вам нужно console.log выполнить функцию обратного вызова.

+0

Спасибо, это так! – Cver

Смежные вопросы