AJAX-Library

Huschi

Moderator
Hallo Leute,

ich entwickel ein Web2-Projekt von Grund auf neu und wollte diesmal von Anfang an eine AJAX-Library mit ins Boot holen. Vorher habe ich die paar AJAX-Teile in meinen Projekten selber programmiert, will aber diesmal mehr damit machen und mich daher auf eine stabile Grundlage stützen.

Wenn man bei Google sucht findet man eine ganze Menge an Projekten und die Entscheidung ist nicht leicht. Momentan präferiere ich das Projekt ZK Simple AJAX (bzw. URL bei SourceForge).

Hat vielleicht noch jemand andere Erfahrungen, andere Libraries oder ähnliches?

huschi.
 
Hi,
Ich spiel aktuell auch wieder mit Ajax. Habe aber auch etwas Eigenes, hab auch mal paar libs angetestet fand das ganze aber nie so 100% super.
Meistens viel zu viel Müll den der User dann Laden muss.

Die ajax.in.js
Code:
function letss(x, div, par)
{
	switch (x) {
  case 1:
	makeHttpRequest("session.php", out, div);
	break;
  case 2:
    lonsmall(div);
	makeHttpRequest("exc/step2.php"+par+"", out, div);
	break;
	
  default:
    alert("Element nicht gefunden!");
    break;
}
}

Dem Ajaxkern
Code:
var http_request = false;

   function makeHttpRequest(url, func, div)
{
    var http_request = false;
	
   if (window.XMLHttpRequest) { // Mozilla, Safari,...
       http_request = new XMLHttpRequest();
       if (http_request.overrideMimeType) {
           http_request.overrideMimeType('text/xml');
       }
   } else if (window.ActiveXObject) { // IE
       try {
           http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
           try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {}
       }
   }

   if (!http_request) {
       return false;
   }
   http_request.onreadystatechange = function() {
       if (http_request.readyState == 4) {
           if (http_request.status == 200) {
               eval(func(div, http_request.responseText));
			   
			} else {
               alert('There was a problem with the request.(Code: ' + http_request.status + ')');
           }
       }
   }
   http_request.open('GET', url, true);
   http_request.send(null);
}

Und die ajax.out.js
Code:
function out (div, data)
{
	document.getElementById(div).innerHTML= data;
	loff();
}

lonsmall und loff ind Ladeüberbrückungen das ist nur was optisches ;)

Ich finde das hier hat den geringsten Umfang bei maximaler Nutzung da ich im in und im out die Eingabe belibig auf die Page anpassen kann.

Gruß
Daniel
 
Wie ich schon sagte, ich suche nix kleines an dem man viel Programmieren und testen muß, sondern wirklich etwas Großes. Ich will so ne richtige Web-2.0 Anwendung zusammen stückeln mit so richtig viel JavaScript und möglichst wenig Requests. Und weil ich mich auf meine Anwendung konzentrieren will, möchte ich mich nicht zusätzlich noch auf die ganzen JavaScript-Programmierung achten müssen.

PS: Deine Lib ist nicht Thread-Save. Über das Stadium bin ich schon hinaus. :)

huschi.
 
Evtl. die Ajax-Library von ASP.NET? Damit sind Sachen wie Textboxen mit Autocompletion oder clientseitiger Validierung schnell erstellt.
 
Ja, script.aculo.us ist tatsächlich sowas wie ich es suche. Ist zwar vielseitiger vom Backend als o.g. simple Ajax, aber hat nicht ganz so viele fertige Features und sieht Grafisch (z.B. die Slider) nicht so überragend aus.

PS: ASP kommt allerdings gar nicht in Frage. :)

huschi.
 
NeoXx hat mich zwar per PM gefragt, aber ich denke es ist von allgemeinen Interesse:
NeoXx said:
Leider hab ich jetzt nach 2 Tagen suchen immer noch keinen Plan was Thread Save genau bedeutet und wie eine save Funktion auszusehen hat.
Evtl. liegt es einfach daran, daß es Thread-Safe heißt. Mein Englisch ist nicht immer so gut, daß ich das zu unterscheiden wüßte. :)

Bei Deinem Code geht es vorallem um den "reantrance". Also das nochmalige Aufrufen der Funktion obwohl der erste Aufruf noch nicht durchgearbeitet ist. Dabei werden durch den 2.Aufruf die Daten des ersten überschrieben und können in einen undefinierbaren Zustand führen sobald der XML-Request abgearbeitet wurde.
Die entsprechende Lösung heißt "Objektorientierte Kapselung".
Hier stößt man aber an Probleme der OOP, da ja die aufzurufende Funktion ebenfalls in das Objekt gekapselt werden muß. JavaScript erlaubt dies aber Mithilfe des Prototypings.

Hier nun ein (lauffähiger) Ausschnitt aus meiner ajax.js.
Die Funktion get_XMLhttpObject() gibt es als Einzelfunktion, da in meiner Lib verschiedene Ajax-Funktionen existieren, die dem Programmierer bereits möglichst viel abnehmen sollen. (Z.B. Bilder nachladen, Select-Boxen ändern, HTML nachladen, etc.) Ich habe auf die allgemeine AJAX_callFunction() gekürzt, die eine externe Funktion mit dem fertig geladenen XML-Objekt aufruft.
Für das Umwandeln des onreadychange-Handlers in das Objekt wird der bind-Prototyp gebraucht.
Code:
function get_XMLhttpObject() {
	//XMLHttpRequest-Objekt erzeugen
	var xmlhttp;
	try {
		xmlhttp = new XMLHttpRequest();
	}
	catch (e1) {
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e2) {
			try {
				xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e3) {
			}
		}
	}
	if (! xmlhttp) {
		alert("Der Browser unterstützt kein XMLHttpRequest!");
	}
	return xmlhttp;
}

Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}

/* Multi-Threadable-AJAX */
function AJAX_callFunction(url, postparam, func) {
		// Funktion ins Objekt speichern:
		this.func = func;
		// XML-Objekt:
		this.xmlhttp = get_XMLhttpObject();
		if (this.xmlhttp) {
			// HTTP-Request
			if (postparam) {
				this.xmlhttp.open("POST", url, true);
				this.xmlhttp.send(postparam);
			} else {
				this.xmlhttp.open("GET", url, true);
				this.xmlhttp.send(null);
			}
			// Warten bis fertig (asyncron)
			this.xmlhttp.onreadystatechange = (function () {
				if (this.xmlhttp.readyState == 4) {
					if (this.xmlhttp.status == 200) {
						this.func(this.xmlhttp);
					} else {
						alert("Fehler im AJAX-Request:\n"+this.xmlhttp.responseText);
					}
				}
			}).bind(this);
		}
}

Ein Aufruf sieht dann wie folgt aus:
Code:
// ein GET-Request:
new AJAX_callFunction(window.location.baseref+'ajax.php?Command=getListOfDB'', changeListOfDB)
// oder als POST-Request:
new AJAX_callFunction(window.location.baseref+'ajax.php', 'Command=getListOfDB', changeListOfDB)

// und noch die Funktion zum Auswerten:
function changeListOfDB(xmlhttp) {
   text = xmlhttp.responseText;
   ...
}

huschi.
 
Um mal beim Thema zum bleiben. Ajax ist eine feine Sache, birgt aber auch Risiken. Sicherlicht ist Scriptaculous die Eierlegendewollmilchsau, aber nicht immer das Mittel der Wahl. Das - IMHO - viel zu überladen ist, und Funktionen mitliefert die man nicht braucht. Und da alles Clientseitig abläuft, erzeugt das verdammt viel Traffic.

Ich entwickle nunmehr seid fast vier Jahren mit Ajax in den Bereichen PHP, Perl und Java und kann sagen, das es immernoch die Beste wahl ist, sich seine kleine eigene Library zu schreiben. Dauert zwar ein wenig länger, aber lohnt sich nachher.

Der Grundaufbau über DOM ist sowieso immer der Gleiche, den den Rest kann man seinen Bedürfnissen anpassen.

Mal abgesehen davon ist mir noch nie eine Ajax Library über den Weg gelaufen, die die Umlaute per UTF-8 halbwegs vernünftig verarbeiten kann. Da ist dann immer Handarbeit angesagt.

Aber, dennoch gibt es fertige Lösungen die ziemlich umfangreich und gut sind.

Falls Du mit Java arbeitest, kann ich Dir die Kombi myFaces und Ajax4JSF ans Herz legen, damit habe ich nur gute Erfahrungen gemacht.

Bei PHP würde ich IMMER auf eine eigene Bibliothek bauen.

Gruß
Haggy
 
Back
Top