ugrás a tartalomhoz

Ajax motor hiba (na, de mi?)

Velias9 · 2008. Ápr. 30. (Sze), 16.08
Sziasztok!

Van egy saját készítésű Ajax motorom:

AjaxMotor = function()
{
	var self = this;
	this.vissza = null;
	this.toltesTipus = null;
	this.kulsoTolto = null;
	this.fuggonyId = null;
	this.toltoId = null;
	this.keszVanId = null;
	this.xmlFeldolgozo = null;
	this.scrollTop = null;
	this.scrollLeft = null;
	this.xmlHttp = function()
	{
		var seged = null;
		try
		{
			seged = new XMLHttpRequest();
		}
		catch(e)
		{
			try
			{
				seged = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e)
			{
				try
				{
					seged = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e)
				{
					alert("Hát a böngészod nem komálja az AJAX-ot.\nEzen változtass, ha szeretnéd ezt a honlapot megnézni!\n(Tölts le egy újabbat!)");
				}
			}
		}
		self.xmlHttp = seged;
		self.xmlHttp.onreadystatechange = self.tolto;
	};
	this.tolto = function()
	{
		switch (self.xmlHttp.readyState)
		{
			case 0:
				$("#" + self.toltoId).html("Töltés...");
				break;
			case 1:
				$("#" + self.toltoId).html("Töltés...");
				break;
			case 2:
				$("#" + self.toltoId).html("Töltés...");
				break;
			case 3:
				$("#" + self.toltoId).html("Töltés...");
				break;
			case 4:
				self.kesz();
				break;
			default:
				alert("Hiba!");
		}
	};
	this.kesz = function()
	{
		if (self.vissza == "text")
		{
			$("#" + self.keszVanId).html(self.xmlHttp.responseText);
		}
		else
		{
			self.xmlFeldolgozo(self.xmlHttp.responseXML, self.keszVanId);
		}
		self.fuggonyLe();
	};
	this.fuggonyFel = function()
	{
		var fuggonySzeles = ($(window).outerWidth() > $(document).outerWidth()) ? $(window).outerWidth() : $(document).outerWidth();
		var fuggonyMagas = ($(window).outerHeight() > $(document).outerHeight()) ? $(window).outerHeight() : $(document).outerHeight();

		self.scrollTop = $(window).scrollTop();
		self.scrollLeft = $(window).scrollLeft();

		$(window).scroll( function() { $(window).scrollTop(self.scrollTop);  $(window).scrollLeft(self.scrollLeft); } );

		$("#" + self.fuggonyId).css("visibility", "visible");
		$("#" + self.fuggonyId).css("display", "block");
		$("#" + self.fuggonyId).css("position", "absolute");
		$("#" + self.fuggonyId).css("top", "0px");
		$("#" + self.fuggonyId).css("left", "0px");
		$("#" + self.fuggonyId).css("width", (fuggonySzeles + "px"));
		$("#" + self.fuggonyId).css("height", (fuggonyMagas + "px"));
		$("#" + self.toltoId).css("visibility", "visible");
		$("#" + self.toltoId).css("display", "block");
		$("#" + self.toltoId).css("position", "absolute");
		$("#" + self.toltoId).css("top", (parseInt(($(window).outerHeight() - $("#" + self.toltoId).height()) / 2) + "px"));
		$("#" + self.toltoId).css("left", (parseInt(($(window).outerWidth() - $("#" + self.toltoId).width()) / 2) + "px"));
	};
	this.fuggonyLe = function()
	{
		$(window).unscroll();

		$("#" + self.fuggonyId).css("visibility", "hidden");
		$("#" + self.fuggonyId).css("display", "none");
		$("#" + self.toltoId).css("visibility", "hidden");
		$("#" + self.toltoId).css("display", "none");
	};
	this.kerelem = function(method, url, tipus, adat, obj)
	{
		self.fuggonyFel();
		self.xmlHttp.open(method, url, tipus);
		self.xmlHttp.send(adat);
	}
}

function Ajax()
{
	var a = new AjaxMotor();

	a.vissza = (Ajax.arguments[0] != null && (Ajax.arguments[0] == "xml" || Ajax.arguments[0] == "text")) ? Ajax.arguments[0] : "text";				// Várt eredmény típusa (szöveg || xml)
	a.toltesTipus = (Ajax.arguments[1] != null && (Ajax.arguments[1] == "kulso" || Ajax.arguments[1] == "belso")) ? Ajax.arguments[1] : "belso";	// A töltési animáció típusa (külso || belso)
	a.kulsoTolto = (Ajax.arguments[2] != null && (Ajax.arguments[2] != "" && Ajax.arguments[1] == "kulso")) ? Ajax.arguments[2] : null;				// Ha külso a tölto, akkor a függvény neve
	a.fuggonyId = (Ajax.arguments[3] != null && Ajax.arguments[3]!= "") ? Ajax.arguments[3] : "takaro";												// Az oldalt töltés közben lefedo doboz Id-je
	a.toltoId = (Ajax.arguments[4] != null && Ajax.arguments[4] != "") ? Ajax.arguments[4] : "tolto";												// A tölto szöveget és animációt megjeleníto doboz neve
	a.keszVanId = (Ajax.arguments[5] != null && Ajax.arguments[5] != "") ? Ajax.arguments[5] : "celDoboz";											// Az eredmény helyének Id-je
	a.xmlFeldolgozo = (Ajax.arguments[6] != null && (Ajax.arguments[6] != "" && Ajax.arguments[0] == "xml")) ? Ajax.arguments[6] : null;			// Ha a várteredmény XML, akkor a függvény neve

	a.xmlHttp();

	return a;
}
Két gondom van vele, de amúgy a legfőbb feladatát ellátja ás működik.

Az első, kisebb gond, hogy amint láthatjátok, nem tudom, hogy a 'JavaScript'-ben hogyan kell Konstruktor függvényeket létrehozni, ezért plusz egy függvény kell. Nem ért valaki a 'JavaScript' Konstruktorokhoz? Ha van ilyen, akkor legyenszives ossza meg velem tudományát!

A második, a lényegesebb, hogy nem működik a lefedés, amit a 'fuggonyFel()' függvény csinálna. Egyszerűen nem csinál semmit. Azonban, ha például a 110-edik sor után beszúrok egy 'alert()'-ot, akkor tökéletesen működik (attól eltekintve, hogy nem kell az 'alert()'). Tehát a 110-111-edik sort így alakítom:

		self.fuggonyFel();
		alert("bla");
		self.xmlHttp.open(method, url, tipus);
Nos remélem vannak ötleteitek!

Előre is köszönök minden segítséget.
 
1

ötletek

gex · 2008. Ápr. 30. (Sze), 16.18
Nem ért valaki a 'JavaScript' Konstruktorokhoz?

keress, amúgy meg most megy: http://weblabor.hu/forumok/temak/21044 és igen egy "kicsit" értenek hozzá.

a másik kérdésedre meg az az ötletem, hogy ha az alert függvénnyel működik, akkor olyasmi hiba lehet benne, hogy (és innentől hipotetikus minden, mert nem bogarásztam végig a kódot) túl hamar jön egy függönyle vagy valami hasonló. az alert nem csinál semmi különlegeset, csak megakasztja a kód futását arra az időre, amíg meg nem nyomod az ok gombot. tehát ott az időzítéssel lehet valami bibi.
egyébként meg console.log() és firebug, azzal szépen le tudod követni, hogy meghívódik-e a függvény vagy sem.
2

setTimeout...

ksgy · 2008. Ápr. 30. (Sze), 17.56
tedd a fuggonyFel-t egy setTimeout-ba, igy valahogy:

setTimeout(self.fuggonyFel, 5);
vagy a fuggonyFel tartalmat egy nevtelen fuggvenyes setTimeoutba

nekem sok ilyen "alertel mukodik, anelkul meg nem" gondom oldotta meg ez az alig eszreveheto kesleltetes :)
3

readyState

rrd · 2008. Május. 1. (Cs), 09.44
A readyState nem egészen ugyanúgy viselkedik a különböző böngészőkben. Lehet, hogy ezzel lesz a gondod. Egyébként személyes tapasztalatom szerint nem éri meg saját ajax kezelőt írni. Most már minden JavaScript keretrendszer (pl a prototype) tálcán kínál kényelmes és biztos megoldásokat.
4

igaz..

ksgy · 2008. Május. 1. (Cs), 21.25
igaz, enis most nezem, hogy amugy jQuery-s kod... :) igy ensem ertem igazan vegkepp :)
5

És hogyan oldom meg...

Velias9 · 2008. Május. 5. (H), 08.58
..., hogy a kérelem előtt és után lefusson egy függvény, és ha XML adatot dolgozok fel, akkor mi van?