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);
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.
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