javascript数组项未定义

时间:2016-07-27 14:10:45

标签: javascript jquery

我不明白为什么我可以打印console.log(imgs)但我无法打印console.log(imgs[0])

$(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)] + ');'});
});

3 个答案:

答案 0 :(得分:1)

ajax方法是异步的,因此您需要使用回调函数在ajax调用后使用imgs变量。或者您可以在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 :(得分:1)

那是因为Ajax是异步的,JavaScript是同步的。

您需要在成功回调函数中使用console.log。

答案 2 :(得分: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] ajax时,您会看到。