webForumDet fria alternativet

Returnerat värde i AS-funktion

Flash

2 svar · 186 visningar · startad av monAmour

Medlem sedan dec. 2002258 inlägg
Frågan#1

Hejsvejs!
Sitter och pillar lite med kalender (Datechooser) komponenten i Flash MX.
Detta är en prototyp och senare ska xml datan för ett visst datum hämtas och läsas in.

Det som ska hända är att när man klickar på ett specifikt datum i kalendern ska data läsas in för det datumet och funktionen countXmlPosts ska läsa av hur många events det finns för just det här datumet och visa det i et textruta.

Allt funkar fint förutom att jag inte kan returnera värdet (hur många events det finns under ett datum) i funktionen countXmlPosts.
Mitt returnerade värde blir endast "undefined"??
WHY?

Så här ser koden ut:

// XML-data count function (counts events for specific date)
function countXmlPosts(date) {
	var xmlObj = new XML();
	xmlObj.ignoreWhite = true;
	xmlObj.onLoad = function(okey) {
		if (okey) {
			// XML loaded continue
			xmlNode = this.firstChild;
			
			// Check for just one datepost
			if (xmlNode.childNodes.length > 1) {
				trace("More than one datepost. Not allowed!");
			}
			else {
				datePost = xmlNode.childNodes[0];
				datePostId = datePost.attributes.id;
				
				// control check for current date
				if (datePostId == date) {
					var postCount = datePost.childNodes.length;
					return postCount;
				}
				else {
					trace("False date match!");
				}
			}
		}
		else {
			// XML not loaded
			return false;
		}
	}
	xmlObj.load("calendarGrid.xml");
}

// Create eventListener for calendar component
calendarListener = new Object();
calendarListener.change = function(eventObj) {
	var eventSource = eventObj.target;
	var theSelectedDate = eventSource.selectedDate;
	
	// Format the date AS YYYY-MM-DD
	// Date
	var theDate = theSelectedDate.getDate();
	if (theDate < 10) { theDate = "0" + theDate; }

	// Month
	var theMonth = theSelectedDate.getMonth() + 1;
	if (theMonth < 10) { theMonth = "0" + theMonth; }
	
	// Year
	var theYear = theSelectedDate.getFullYear();

	// Date string
	var formattedDate = theYear + theMonth + theDate;
	
	// count XML-data for specific date
	var xmlCount:String = countXmlPosts(formattedDate);
	trace(xmlCount);
	
	// Set status message
	var msg = "Det finns " + xmlCount + " noteringar det här datumet.";
	statusMessage.text = msg;
}

myCalendar.addEventListener("change", calendarListener);
Medlem sedan maj 2003750 inlägg
#2

xmlObj är ju lokalt för funktionen och när funktionen avslutas så försvinner även xmlObj. Och funktionen load körs inte förrens allt frameskript körts klart vilket jag skulle tro (är inte 100% säker dock) innebär att laddningen aldrig ens påbörjas.

En andrta sak är att return i onLoad ger ju ett returvärde på just den funktionen. Detta returvärde går ej att fånga annat än när funktionen anropas manuellt. Det bästa är alltså att direkt från onLoad händelsen skicka datan dit den hör hemma. och eller flagga till övrig kod att nu finns datan och det är grönt att fortsätta.

/Mirandir

Medlem sedan dec. 2002258 inlägg
#3

Tack för tipset nu har det löst sig.
Använder nu enbart EventListener'n till att checka vilket datum som man valt och sedan sköter min andra funktion countXmlPosts som nu mer heter dataHandler allt annat. Så här ser allt ut nu:

// Stop movie
stop();

// Set calendar styles
myCalendar.setStyle("color", 0x000000);
myCalendar.setStyle("borderColor", 0xCCCCCC);
myCalendar.setStyle("embedFonts", false);
myCalendar.setStyle("fontFamily", "Verdana");
myCalendar.setStyle("disabledColor", 0xAAAAAA);

// Set range test
myCalendar.selectableRange = {rangeStart: new Date(2004, 5, 1), rangeEnd: new Date(2004, 7, 5)}; 

// Check notes for todays date when loaded
var today = new Date();
var todaysDate = today.getDate();
var todaysMonth = today.getMonth()+1;
var todaysYear = today.getFullYear();
(todaysDate < 10) ? todaysDate = "0" + todaysDate : todaysDate = todaysDate;
(todaysMonth < 10) ? todaysMonth = "0" + todaysMonth : todaysMonth = todaysMonth;
var fullToday = todaysYear + todaysMonth + todaysDate;
dataHandler(fullToday); // trigger it

// XML-data count function (counts events for specific date)
function dataHandler(date) {
	var xmlObj = new XML();
	xmlObj.ignoreWhite = true;
	xmlObj.onLoad = function(okey) {
		if (okey) {
			// XML loaded continue
			xmlNode = this.firstChild;
			
			// Check for just one datepost
			if (xmlNode.childNodes.length > 1) {
				trace("More than one datepost. Not allowed!");
			}
			else {
				datePost = xmlNode.childNodes[0];
				datePostId = datePost.attributes.id;
				
				// control check for current date
				if (datePostId == date) {
					var postCount = datePost.childNodes.length;
					if (_root.fullToday == date) {
						statusMessage.text = "Det finns " + postCount + " noteringar idag.";
					}
					else {
						statusMessage.text = "Det finns " + postCount + " noteringar det här datumet.";
					}
				}
				else {
					statusMessage.text = "Inga noteringar det här datumet";
				}
			}
		}
		else {
			// XML not loaded
			return false;
		}
	}
	xmlObj.load("calendarGrid.xml");
}

// Create eventListener for calendar component
calendarListener = new Object();
calendarListener.change = function(eventObj) {
	var eventSource = eventObj.target;
	var theSelectedDate = eventSource.selectedDate;
	
	// Format the date AS YYYY-MM-DD
	// Date
	var theDate = theSelectedDate.getDate();
	if (theDate < 10) { theDate = "0" + theDate; }

	// Month
	var theMonth = theSelectedDate.getMonth() + 1;
	if (theMonth < 10) { theMonth = "0" + theMonth; }
	
	// Year
	var theYear = theSelectedDate.getFullYear();

	// Date string
	var formattedDate = theYear + theMonth + theDate;
	
	// Start the handler
	dataHandler(formattedDate);
}

myCalendar.addEventListener("change", calendarListener);
256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)