Wątek przeniesiony 2014-11-25 20:30 z Webmastering przez dzek69.

Nie rozumiem dlaczego funkcja zwraca takie, a nie inne wartości.

0

Mam taką funkcję w JavaScript:

function widget(src){
	function zeroWiodace(i) {
		return (i < 10)? '0'+i : i;
	}
	var temperatura = null;
	
	jQuery.get('http://'+window.location.host+'/weather.xml', {}, function(xml){
		var czas = new Date();
		var now = czas.getDate()+'-'+zeroWiodace((czas.getMonth() + 1))+'-'+czas.getFullYear();
		jQuery('day', xml).each(function(i){
			if (jQuery(this).find("data").text() === now){
				temperatura = jQuery(this).find("temperatura").text();
				
			}
			
		});
		
	});

	//alert('temp: '+temperatura);
	document.write(
		'<div class="w-plugin-box">'+
			'<div class="w-plugin-map">'+
				'<h3 class="w-plugin-header">'+
					'Warszawa<br />'+
				'</h3>'+
			'</div>'+
		'</div>'+
		'<style type="text/css">'+
		'.w-plugin-header{color: #fff;font-size: 1.3em;padding: 100px 50px;}'+
		'.w-plugin-map{width: max-width: 240px;max-height: 240px;background: url('+src+'/images/krakow.png) no-repeat; background-size: 100% 100%;width: 240px;height: 240px;}'+
		'</style>'
	);

	jQuery('.w-plugin-header').append('<strong>'+temperatura+'</strong>');
}

Ogólnie funkcja pobiera dane z XML i szuka wartości z dnia dzisiejszego. Lecz problem mam z tym, że jeśli już znajdzie wartość:
temperatura = jQuery(this).find("temperatura").text();

to potem nie mogę jej wyświetlić. Jeśli odkomentuję //alert('temp: '+temperatura); wtedy w ostatniej linii wartość jest dodana. Jeśli jest zakomentowane, otrzymuję w html "undefined".

Nie rozumiem kompletnie dlaczego tak się dzieje. Pomoże ktoś?

0

Bo ajax wykonuje się asynchronicznie. Jeśli wyświetla się alert, to zanim go zamkniesz dociągnie się odpowiedź serwera i masz zmienną wypełnioną danymi. Jeśli nie wyświetla się alert, to kod wyświetlający te dane wykonuje się zanim one się ściągną.

0

Wg dokumentacji jQuery funkcja ma taką składnię:
jQuery.get( url [, data ] [, success ] [, dataType ] )

Zatem 3 argument to funkcja po sukcesie, czyli już załadowaniu pliku. Tak też jest u mnie. Czy dobrze myślę?

0

cały kod musi być w tej funkcji, nie tylko jedna linijka.

0

Faktycznie, nie przyszło mi głowy, żeby wypisać plugin w sukcesie.

Ale z drugiej strony to zmienna temperatura jest globalna. Więc powinno to działać wg mnie.

0

no to tylko wg Ciebie. co z tego, że jest globalna (btw: NIE JEST globalna), skoro kod działa tak:

  1. ustaw zmienną temperatura i zdefiniuj funkcję
  2. wczytaj plik, a po jego wykonaniu zrób podane akcje: [tu jakaś lista akcji] - KOD WYKONUJ DALEJ NIE CZEKAJĄC NA WCZYTANIE PLIKU
  3. NIE CZEKAJĄC na cokolwiek wyświetl zmienną, którą dopiero zdefiniowaliśmy w pkt 1 (jako null)

....

  1. [ po np. 10 sekundach wpisz coś do zmiennej z pkt 1, ale to i tak nie ma znaczenia ]

masz braki w podstawach i zamiast się douczyć to rzucasz hasłami, że wg Ciebie to powinno inaczej działać

0

Ok, już wiem o co chodzi. Dzięki za pomoc! Pozdrawiam gorąco ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1