Нужно 2 функции для запуска onLoad с Ajax - только 1 работает - PullRequest
1 голос
/ 16 декабря 2011

Запускается с функциями перемешивания (просто перемешивает массивы).Оно работает.Затем я определяю 2 глобальные переменные, которые будут определять случайный порядок отображения изображений на странице.picOrder будет простым массивом от 0 до picCount, а picCount определяется загрузкой Ajax.PicCount извлекается, но массив picOrder не устанавливается!Если я вручную запускаю "rangePics (); "в консоли это работает.Он заполняет массив picOrder и затем перемешивает его.Но это не работает, помещая вызовы обеих функций внутри "" или помещая туда функцию "doStuff ()".

Array.prototype.shuffle = function() {
var s = [];
while (this.length) s.push(this.splice(Math.random() * this.length, 1)[0]);
while (s.length) this.push(s.pop());
return this;
}

var picOrder = new Array();
var picCount;

function getPicCount() {
//  picCount = array(10);
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      } else {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            picCount = xmlhttp.responseText;
        }
      }
    xmlhttp.open("GET","/example.com/images.php?count=hello",true);
    xmlhttp.send();
    //picCount.shuffle;

}

function arrangePics() {
    for(var i = 0;i<picCount;i++) {
    picOrder[i] = i;
    }
    picOrder.shuffle();
    //alert(picOrder);
}

HTML

<body onLoad="getPicCount();arrangePics();">

или

<body onLoad="doStuff();">

1 Ответ

0 голосов
/ 16 декабря 2011

Вам нужно arrangePics() после , когда асинхронный вызов AJAX вернулся, т.е. вы можете вызывать его только в блоке if (xmlhttp.readyState==4 && xmlhttp.status==200) {} (обратный вызов), иначе вы не можете быть уверены, что данные были получены полностью.

В настоящее время происходит то, что JavaScript вызывает getPicCount();arrangePics(); - первый метод инициирует вызов AJAX и немедленно возвращается, а затем второй метод попытается упорядочить 0 изображений.Выполнение arrangePics() вручную на консоли привело бы к достаточной задержке в системе для завершения вызова AJAX, и picCount будет установлено, как и ожидалось.

Так что если вы измените функцию обратного вызова на:

if (xmlhttp.readyState==4 && xmlhttp.status==200) {
    picCount = xmlhttp.responseText;

    for(var i = 0;i<picCount;i++) {
        picOrder[i] = i;
    }
    picOrder.shuffle();
}

он должен перетасовать картинки после получения счета.

...