Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Область витдимости переменной... (https://javascript.ru/forum/misc/8970-oblast-vitdimosti-peremennojj.html)

ipevgeny 22.04.2010 20:09

Область витдимости переменной...
 
Есть ajax запрос. В результате его создается список элементов. Не могу понять как вне функции с запросом получить доступ у созданному списку...
function abc() {
	list = document.getElementById("users");// ul tag
	function loadPage(){
		var url = 'site.com';	
	    var initRequest = new XMLHttpRequest();
	    initRequest.open("POST", url, true);
	    initRequest.onreadystatechange = function(){
	        if (initRequest.readyState == 4) {
	            if (initRequest.status == 200) {
					for(var i=0; i<=10;i++) {
						list_item = document.createElement("li");
						list_item.innerHTML = initRequest.responseText;
						list.appendChild(list_item);
					}
	            }
	        }
	    };
	    initRequest.send(null);
	}
	loadPage();
	
	alert(list_item.length);//не видит list_item, т.к. он еще не создан.
	
}


Нужно, чтобы в alert были правильные данные.

Спасибо

B~Vladi 22.04.2010 20:47

function abc() {
	list = document.getElementById("users");// ul tag
	var list_item;
	function loadPage(){
		var url = 'site.com';	
	    var initRequest = new XMLHttpRequest();
	    initRequest.open("POST", url, true);
	    initRequest.onreadystatechange = function(){
	        if (initRequest.readyState == 4) {
	            if (initRequest.status == 200) {
					for(var i=0; i<=10;i++) {
						list_item = document.createElement("li");
						list_item.innerHTML = initRequest.responseText;
						list.appendChild(list_item);
					}
	            }
	        }
	    };
	    initRequest.send(null);
	}
	loadPage();
	
	alert(list_item.length);//не видит list_item, т.к. он еще не создан.
	
}

Может так?!

ipevgeny 23.04.2010 10:27

Я, вероятно, не правильно описал проблему)
Если я объявлю переменную в начале функции, то в alert будет ее изначальное значение(undefined), а нужно, чтобы был (object). т.е. результат создания списка...

function abc(){
	list = document.getElementById("users");// ul tag
	var list_item;
	var loadPage = (function(){
		var url = 'site.com';	
	    var initRequest = new XMLHttpRequest();
	    initRequest.open("POST", url, true);
	    initRequest.onreadystatechange = function(){
	        if (initRequest.readyState == 4) {
	            if (initRequest.status == 200) {
					for(var i=0; i<=10;i++) {
						list_item = document.createElement("li");
						list_item.innerHTML = initRequest.responseText;
						list.appendChild(list_item);
					}
					alert(typeof list_item);// а здесь покажет правильно:)
	            }
	        }
	    };
	    initRequest.send(null);
	}())
		
	
	alert(typeof list_item);//покажет undefined, а нужно, чтобы было object
}

Skipp 23.04.2010 10:53

правильно! на момент вызова последнего алерта onreadystatechange не равно 4 и переменная не получила объект. А как событие сработает и нижний алерт будет object.

Событие не успевает сработать до вывода нижнего алерта.

ipevgeny 23.04.2010 10:56

А можно как-нибудь передать какое-нибудь(например true) значение функцие "loadPage", когда onreadystatechange будет равен 4???
Тогда можно было бы сделать проверку после функции...

Skipp 23.04.2010 11:00

Вызывай её всё в том же обработчике события и всё.

function abc(){
	list = document.getElementById("users");// ul tag
	var list_item;
	var loadPage = (function(){
		var url = 'site.com';	
	    var initRequest = new XMLHttpRequest();
	    initRequest.open("POST", url, true);
	    initRequest.onreadystatechange = function(){
	        if (initRequest.readyState == 4) {
	            if (initRequest.status == 200) {
					for(var i=0; i<=10;i++) {
						list_item = document.createElement("li");
						list_item.innerHTML = initRequest.responseText;
						list.appendChild(list_item);
					}
						LoadPage(true);
	            }
	        }
	    };
	    initRequest.send(null);
	}())
}


Кстати твой код в IE не будет работать var initRequest = new XMLHttpRequest(); там нет такого объекта. Если ты конечно его сам до этого не создал.


Часовой пояс GMT +3, время: 03:12.