# AJAX Problem



## ddhb (26. Juli 2005)

Das hier ist mein Script, funktioniert auch ganz gut, allerdings nur wenn ich ein 2. Mal auf den Link klicke kommt das Ergebnis vom Server. Allerdings sollte das ergebnis schon beim 1. Klick auf den Link kommen, in der echo.php ist ledeglich ein "echo" Befehl.

Kann mir da wer helfen?
	
	
	



```
<html>

<head>
<title>test</title>
</head>
<script type="text/javascript">
<!--
/*
* Initialize AJAX Handler
*/
function ddhb_AJAX(){
	this.AJAX_handler = false;	
};

ddhb_AJAX.prototype.init = function (){
	
	if(window.XMLHttpRequest){ // Mozilla, Safari, Firefox
		try {
			this.AJAX_handler = new XMLHttpRequest();	
		} catch(e) { }
	}else if(window.ActiveXObject){
		try {
        			this.AJAX_handler = new ActiveXObject("Msxml2.XMLHTTP");
      		} catch(e) {
        			try {
          			this.AJAX_handler = new ActiveXObject("Microsoft.XMLHTTP");
        			} catch(e) { }
		}
	}
};


/*
* Send request to server
*/
ddhb_AJAX.prototype.proceed = function (url,method){	
	this.AJAX_handler.onreadystatechange = this.result();
	this.AJAX_handler.open(method, url, true);
	this.AJAX_handler.send(null);
};


/*
* Get result form server
*/
ddhb_AJAX.prototype.result = function(){
	if(this.AJAX_handler.readyState == 4){
		var response = this.AJAX_handler.responseText;
			
		alert(response);
	}

};

var ddhb_AJAX = new ddhb_AJAX();
ddhb_AJAX.init();

//-->
</script>

<a href="Javascript: ddhb_AJAX.proceed('echo.php','GET');">Test?</a>
</html>
```


----------



## Sven Mintel (26. Juli 2005)

Das Problem ist, dass die Funktion auf deine Art nicht erst beim onreadystatechange aufgerufen wird, sondern direkt beim Einlesen der betreffenden Zeile.
Weiterhin ist bei dieser Zuweisung einer Funktion zu einem Event das ursprüngliche Objekt in der funktion nicht mehr "this" verfügbar...da die Funktion, die dein Objekt erstellt,  zu dem Zeitpunkt, zu dem der Event eintritt, bereits verlassen wurde(das, was du beim 2.mal siehst, ist die Rückmeldung auf den 1.Request).

Lösung:

```
/*
* Send request to server
*/
ddhb_AJAX.prototype.proceed = function (url,method){ 
    this.AJAX_handler.onreadystatechange=function()
        {
            if(ddhb_AJAX.AJAX_handler.readyState == 4)
                {
                    var response = ddhb_AJAX.AJAX_handler.responseText;
                    alert(response);
                }
        }
    this.AJAX_handler.open(method, url, true);
    this.AJAX_handler.send(null);
};
```
du musst den Objektnamen also explicit angeben, wenn du beim onreadystatechange drauf zurückgreifen willst.


----------



## ddhb (26. Juli 2005)

Danke, ich hab das jetzt anders gelöst, da ich verschieden Funktionen für onreadystatechange brauche habe ich das jetzt anders gelöst.

Ich hab allerdsing noch eine Frage, für was der asynchron Flag bei der .open Funktion eigentlich zu gebrauchen?

Hier die ajax.js

```
/*
* Initialize AJAX Handler
*/
function ddhb_AJAX(){
	this.AJAX_handler = false;
	this.debug = true;
	this.init();
};


ddhb_AJAX.prototype.init = function (){
	if(this.AJAX_handler) return;
	
	if(window.XMLHttpRequest){ // Mozilla, Safari, Firefox
		try {
			this.AJAX_handler = new XMLHttpRequest();
				
		} catch(e) {
			if(this.debug) alert('XMLHttpRequest init failed');
			return false;
		}
	}else if(window.ActiveXObject){ // IE
        		try {
          		this.AJAX_handler = new ActiveXObject("Microsoft.XMLHTTP");
          		return true;
        		} catch(e) {
        			if(this.debug) alert('Microsoft.XMLHTTP init failed');
        			return false;
        		}
	}
};


/*
* Send request to server
*/
ddhb_AJAX.prototype.send = function (url,datas){
	
	if(!this.AJAX_handler) { // if AJAX is not init
		this.init();
		if(this.debug) alert('AJAX not init at ddhb_AJAX::send');
	}
	
	this.AJAX_handler.open('POST', url, true);
	this.AJAX_handler.send(datas);
};


/*
* Set event function for the onreadystatechange property
*/
ddhb_AJAX.prototype.onreadystatechange = function (func){
	if(typeof(func) != 'function') {
		if(this.debug) alert('Param1 at ddhb_AJAX::onreadystatechange is not a function');
		return false;
	}
	
	if(!this.AJAX_handler) { // if AJAX is not init
		this.init();
		if(this.debug) alert('AJAX not init at ddhb_AJAX::send');
	}
	
	this.AJAX_handler.onreadystatechange = func;
};


var ddhb_AJAX = new ddhb_AJAX();
```

Und hier die HTML Datei.

```
<html>

<head>
<title>test</title>
<script type="text/javascript" src="ajax.js"></script>
</head>

<script type="text/javascript">

ddhb_AJAX.onreadystatechange(getResult);

function getResult(){
	var AJAX_handler = ddhb_AJAX.AJAX_handler; 
	
	if(AJAX_handler.readyState == 4) {
		alert(AJAX_handler.responseText);
	}
}
</script>

<a href="Javascript: ddhb_AJAX.send('echo.php');">Test?</a>
</html>
```


----------



## Sven Mintel (26. Juli 2005)

async bestimmt, ob die Serveranfrage "synchron"(oder nicht) vonstatten gehen soll.
Wenn sie synchron läuft, stoppt das Skript solange, bis die Anfrage beendet ist.

Wenn der Server nicht antwortet, oder sonstetwas für Verzögerung sorgt, bleibt das Skript und somit der Browser hängen... weshalb man einen Request im Normalfall asynchron durchführen sollte.

Soweit ich weiss, ist asynchron die Voreinstellung... du musst es also nicht extra angeben.


----------



## ddhb (27. Juli 2005)

Ok, danke dir.


----------



## eukrem (17. August 2005)

Hallo!

Ich habe 2 Probleme:

1. Ich arbeite nur mit new ActiveXObject("Msxml2.XMLHTTP"); und habe festgestellt, dass beim asynchronen Open nicht immer eine Antwort vom Server kommt. 

```
function myOnreadystatechang(){
	if(xmlHttp.readyState == 4) {
                // 4 wird nicht immer erreicht!
	var requestResult = xmlHttp.responseText;
                ...
	}
}
```

2. Ich moechte noch Argumente an den Server mitschicken, die Umlaute enthalten. Habe versucht gleich mit xmlHttp.open() zu uebergeben. Geht aber nicht. Server bekommt nur Fragezeichen, wo Umlaute waren. Dachte,  Send wuerde mir helfen, weiss aber nicht,  wie ich das anwenden soll. In MSDN habe ich nicht viel verstanden.

Vielen Dank!


----------



## Sven Mintel (17. August 2005)

zu 1.Das ist ein Problem des Servers....wenn der nicht antwortet, kann man da nicht viel dran ändern

zu2. willst du Daten per GET oder POST senden?


----------



## eukrem (17. August 2005)

1. aber wenn ich das nicht asynchron mache, kommt immer eine Antwort. Vieleicht ist die Wartezeit zu kurz?

2. ist egal, gibt's da unterschied?


----------



## Sven Mintel (17. August 2005)

zu 1.bei async wird ja nicht gewartet.... das ist der Unterschied.
Das Skript läuft weiter, ohne auf die Antwort zu warten.... wenn die Antwort dann kommt, kann sie trotzdem verarbeitet werden.

zu 2. Ja,  unbedingt.
Bei Post musst du einen Content-Type-Header:*application/x-www-form-urlencoded* senden, bei GET solltest du die Daten codieren, so wie es escape() tut.
Poste doch mal deinen kompletten Code(falls er nicht zu geheim ist)


----------



## eukrem (18. August 2005)

Ich habe jetzt so gemacht


```
var args = "text="+selection;
		xmlHttp.open('POST', url, false);
       		xmlHttp.send(args);
                                myOnreadystatechang();
```
Es funktioniert. *Content-Type-Header:application/x-www-form-urlencoded * habe ausgelassen, da ich nicht viel davon verstehe.

Ich danke dir!


----------

