Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Antwort
 
Themen-Optionen
Alt 02.11.2005, 20:01   Nach oben    #1
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard AJAX - PHP-Script wird nicht aufgerufen

Hallo,
ich habe hier gerade mal ein kleines AJAX-Beispiel, welches nicht funktioniert.
Ich habe mir das mal zusammengesucht und dachte jetzt eigentlich, dass das auch so laufen müsste.

Die .html-Datei:
HTML-Code:
<html>
 <head>

	<script type="text/javascript" language="javascript"> 
	   
	    var requestObject = null;
	   
	   
	    /**
	     * createRequestObject()
	     *
	     * This function returns an requestObject. Either an ActiveXObject if the client uses the
	     * Internet Explorer or a XMLHttpRequest object.
 	     */
	    function createRequestObject() {
		    var localRequestObject;
		    var browser = navigator.appName;
		    
		    if(browser == "Microsoft Internet Explorer"){
		        localRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
		    }
                    else{
		        localRequestObject = new XMLHttpRequest();
                    }
	    
	        return localRequestObject;
	    }


	    /**
	     * sendRequest(string)
	     *
	     * The parameter defines the PHP file that should be executed.
 	     */        
	    function sendRequest(phpFile) {
		requestObject.open('get', phpFile);
		requestObject.onreadystatechange = handleResponse;
		requestObject.send(null);
            }
		
		
	    function handleResponse() { 

	        if((requestObject.readyState == 4) && ( requestObject.status == 200 ) ) { 
	        	document.getElementById("colorSwitch").innerHTML = requestObject.responseText; 
	        } 
	     } 
		
		
		function changeColor(request) {
			createRequestObject();
			sendRequest(request);
		}
		   
	
	</script>

  </head>
  <body>  
     
     <a href="#" onclick="changeColor('script.php?color=red')">switch color</a>
     <div id="colorSwitch">default (black)</div>
     
     
  </body>  
</html>
Und die .php-Datei names script.php
PHP-Code:
<?php

    
if(array_key_exists('color'$_GET) && is_string($_GET['color'])) {
        
printf('<span style="color:%s">%s</span>'$_GET['color'], $_GET['color']);
    }
    else {
        exit(
'You are not allowed to access this file directly.');
    }
    
?>
Wenn ich jetzt auf den Link klicke tut sich nix .. hab ich da irgendwie Tomaten auf den Augen?
Ein Beispiel von Lars funktioniert dagegen einwandfrei.
HTML-Code:
<html>
 <head>

	<script type="text/javascript" language="javascript"> 
	    
	    var httpObject = false; 
	    
	    /** * Liefert das HTTPXML-Objekt und baut * automatisch eine HTTP-Verbindung zum Host-Server auf. */ 
	    
	    function setHttpObject() { 
	    	// Wenn der Browser kein HTTPXML-Objekt 
	    	// zur Verfügung stellt, wird eine Exception geworfen. 
	    	
	    	try { 
	    		// Mozilla bietet XMLHttpRequest, 
	    		// der IE das ActiveX-Equivalent. 
	    		
	    		httpObject = window.XMLHttpRequest 
	    		           ? new XMLHttpRequest() 
	    		           : new ActiveXObject("Microsoft.XMLHTTP"); 
	        } catch(exception) { 
	        	// [...] 
	        } 
	    } 
	    
	    
	    /** * Sendet einen GET-Request. */ 
	    
	    function request($request) { 
	    	// Beginnt den Request. 
	    	httpObject.open('get', $request); 
	    	
	    	
	    	// Event-Handler für Statusänderungen der 
	    	// Verbindung setzen.     	
	    	httpObject.onreadystatechange = response; 
	    	
	    	// Sendet den von httpObject.open() begonnen Request. 
	    	httpObject.send(null); 
	    } 
	    
	    /** * Event-Handler für Statusänderungen der Verbindung. */ 
	    
	    function response() { 
	    	// readyState = 4 (completed) 
	    	// 0 = uninitialized ; 
	    	// 1 = loading ; 
	        // 2 = loaded ; 
	        // 3 = interactive 
	        // status = 200 (okay) 
	        
	        if((httpObject.readyState == 4) && ( httpObject.status == 200 ) ) { 
	        	// Ist der request abgeschlossen und der 
	        	// Return-Code gleich 200, wird die 
	        	// Antwort ins HTML geschrieben. 
	        	document.getElementById("inhalt").innerHTML = httpObject.responseText; 
	        } 
	     } 
	     
	     /** * Ändert den Inhalt des Elements mit der ID "inhalt". */ 
	     function inhaltAendern() { 
	     	// Das HTTPXML-Objekt setzen. 
	     	setHttpObject(); 
	     	
	     	// Den Request senden. 
	     	request("phpscript.php"); 
	     } 
	
	</script>

  </head>
  <body>  
     <input type="button" name="inhaltAendern" onclick="inhaltAendern();" value="Inhalt &auml;ndern" />  
     <div id="inhalt">  alter inhalt </div> 
  </body>  
</html>
PHP-Code:
<?php

    
echo 'neuer Inhalt';

?>
Wäre nett, wenn da mal jemand drüberschauen könnte.

Danke schön

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:07   Nach oben    #2
J33d3X
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

also dieser code fuktioniert einwandfrei

Code:
<html>
<head>
<script type="text/javascript" language="javascript">

var httpObject = false;

/** * Liefert das HTTPXML-Objekt und baut * automatisch eine HTTP-Verbindung zum Host-Server auf. */

function setHttpObject() {
// Wenn der Browser kein HTTPXML-Objekt // zur Verfügung stellt, wird eine Exception geworfen. 

    try {
      // Mozilla bietet XMLHttpRequest, // der IE das ActiveX-Equivalent. 
      httpObject = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    } catch(evt) {
      // [...]
      alert("Sorry, your browser is not AJAX-enabled!");
    }
}
/** * Sendet einen GET-Request. */

function request($request) {
    // Beginnt den Request. 
    httpObject.open('get', $request);
    
    // Event-Handler für Statusänderungen der // Verbindung setzen.
    httpObject.onreadystatechange = response;
    
    // Sendet den von httpObject.open() begonnen Request. 
    httpObject.send(null);
}

/** * Event-Handler für Statusänderungen der Verbindung. */
function response() {
    // readyState = 4 (completed)
    // 0 = uninitialized ;
    // 1 = loading ;
    // 2 = loaded ;
    // 3 = interactive
    // status = 200 (okay) 
    if((httpObject.readyState == 4) && ( httpObject.status == 200 ) ) {
        // Ist der request abgeschlossen und der 
        // Return-Code gleich 200, wird die 
        // Antwort ins HTML geschrieben. 
        document.getElementById("inhalt").innerHTML = httpObject.responseText; 
    }
}

/** * Ändert den Inhalt des Elements mit der ID "inhalt". */ 
function inhaltAendern() {
    // Das HTTPXML-Objekt setzen. 
    setHttpObject();
    
    // Den Request senden. 
    request("test.php");
} 

</script>
</head>

<body>
<input type="button" name="inhaltAendern" onclick="inhaltAendern();" value="Inhalt &auml;ndern" />
<div id="inhalt"> alter inhalt </div>

</body>
</html>
test.php
Code:
echo 'cool';
getestet IE / Mozilla

ka was dein Prob ist
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:09   Nach oben    #3
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Ich schrieb ja, dass das Beispiel von Lars geht .. aber meins nicht.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:26   Nach oben    #4
Lars
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Code:
function sendRequest(phpFile) {
	requestObject.open('get', phpFile);
	requestObject.onreadystatechange = handleResponse;
	requestObject.send(null);
}
Das ding heißt "localRequestObject"

// Edit:
Das gleich auch in handleResponse(). Außerdem gibt createRequestObject() das Objekt zurück, d. h. du musst es auch irgendwie abfangen.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:27   Nach oben    #5
J33d3X
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

naja bei deinem code solltest du
entweder den unterschied zwischen
localRequestObject
requestObject

erkennen
oder requestObject auch localRequestObject zuweisen

Code:
<script type="text/javascript" language="javascript"> 
       
        var localRequestObject = null;
       
       
        /**
         * createRequestObject()
         *
         * This function returns an requestObject. Either an ActiveXObject if the client uses the
         * Internet Explorer or a XMLHttpRequest object.
          */
        function createRequestObject() {
            var browser = navigator.appName;
            
            if(browser == "Microsoft Internet Explorer"){
                localRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
            }
                    else{
                localRequestObject = new XMLHttpRequest();
                    }
        
            return localRequestObject;
        }


        /**
         * sendRequest(string)
         *
         * The parameter defines the PHP file that should be executed.
          */        
        function sendRequest(phpFile) {
        localRequestObject.open('get', phpFile);
        localRequestObject.onreadystatechange = handleResponse;
        localRequestObject.send(null);
            }
        
        
        function handleResponse() { 

            if((localRequestObject.readyState == 4) && ( localRequestObject.status == 200 ) ) { 
                document.getElementById("colorSwitch").innerHTML = localRequestObject.responseText; 
            } 
         } 
        
        
        function changeColor(request) {
            createRequestObject();
            sendRequest(request);
        }
           
    
    </script>

ps:
entweder ist:
return localRequestObject;

sinnbefreit oder du schnappst den return und weist es dem requestObject zu

Geändert von J33d3X (02.11.2005 um 21:30 Uhr).
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:38   Nach oben    #6
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Zitat:
Zitat von J33d3X
entweder ist:
return localRequestObject;

sinnbefreit oder du schnappst den return und weist es dem requestObject zu
Jup. Genau das ist es .. *ploink* ..

Wenn ich es so mache, dann geht es:
HTML-Code:
requestObject = localRequestObject;
Okido. Danke schön
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:41   Nach oben    #7
J33d3X
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

und ? ...

sach mal ehrlich es macht schon so ein spässchen mit ajax ?!
weg mit der "schnöden" validierung von formularen mittels js hinzu kompfortablen Anwendungen

J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2005, 21:45   Nach oben    #8
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Zitat:
Zitat von J33d3X
sach mal ehrlich es macht schon so ein spässchen mit ajax ?!
Ich sag nur eins: MACHT.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.11.2005, 16:35   Nach oben    #9
Du-weisst-schon-wer
Neuer Benutzer
 
Registriert seit: 18.08.2005
Ort: Hürth
Beiträge: 28
Standard

Ajax macht schon was her. Aber öhm du muss die Formulare 2 mal validieren denn ajax hin order her javascript aus und dann sitzte da.
Du-weisst-schon-wer ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.11.2005, 17:24   Nach oben    #10
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Zitat:
Zitat von Du-weisst-schon-wer
Aber öhm du muss die Formulare 2 mal validieren denn ajax hin order her javascript aus und dann sitzte da.
Jou. Das ist ja irgendwie klar, oder?

AJAX stellt ja auch eigentlich nur eine Komfortlösung dar, aus dem von dir angesprochenen Grund.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.12.2005, 19:20   Nach oben    #11
Jay
Gast
 
Beiträge: n/a
Standard

Hier ein Artikel zu AJAX: http://www.usabilityviews.com/ajaxsucks.html - Why Ajax Sucks (Most of the Time)
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2005, 06:04   Nach oben    #12
J33d3X
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

völlig lapidare Begründungen ...

mfg
__________________
Code:
eval('echo "'.gzinflate(base64_decode('8zI2TjGOAAA=')).'";');
J33d3X ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.01.2006, 23:43   Nach oben    #13
lokari
Benutzer
 
Registriert seit: 28.12.2005
Beiträge: 35
Standard

wer den liest, sollte auch den lesen:

http://ntschutta.com/jat/2005/12/07/the-ajax-spoof/
lokari ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2008, 12:59   Nach oben    #14
DasMööp
Erfahrener Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 212
Standard

Ähm wie bekomme ich den request zurück !?

Code:
       function sendGetRequest(phpFile) {

            if (!xhttp) {
                alert("An Error occured when trying to initialize XMLHttpRequest!");
                return; // exit
            }

			xhttp.open('get', phpFile);
			xhttp.onreadystatechange = handleResponse;
			xhttp.send(null);

        }

	    function handleResponse() {

	        if((xhttp.readyState == 4) && (xhttp.status == 200 ) ) {
	        	alert ( xhttp.responseText );
	        }
	     }
statt dem Alert. Oder muss ich immer per ID Arbeiten ... !?


document.getElementById("colorSwitch").innerHTML

Hmm ... gibts da eine Übersicht was für Elemente es gibt ...

(getElementById)
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.02.2008, 08:34   Nach oben    #15
Neq'
Patrick Freitag
 
Registriert seit: 17.08.2005
Beiträge: 106
Standard

Zitat:
Zitat von DasMööp Beitrag anzeigen
Oder muss ich immer per ID Arbeiten ... !?


document.getElementById("colorSwitch").innerHTML

Hmm ... gibts da eine Übersicht was für Elemente es gibt ...

(getElementById)
Kommt drauf an was du genau mit zurückgeben meinst. Grundsätzlich musst du das Element kennen das du mit dem neuen Text updaten möchtest. Es gibt getElementsByTagName, was dir ein Array aller definierten Elemente zurückgibt und getElementsByName, was dir ein Array aller Elemente des definierten Name-Attributes zurückgibt. Das heißt, grundsätzlich fährst du mit getElementById besser.

document.getElementById("colorSwitch").innerHTML = xhttp.responseText;
Neq' ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.02.2008, 19:30   Nach oben    #16
DasMööp
Erfahrener Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 212
Standard

Hmm, dann habe ich das evtl. bischen falsch gesehen. Bei dem Link gibt er die ganze Seite wieder zurück ...

Ist also doch nur um Feinheiten nachzuladen, hatte das im Template Compiler komplett umgesetzt das er auch Links einfach mittels Ajax umsetzt.

Dann werde ich normale SeitenLinks (hab irgendwo auch beim lesen gesehen das dies auch für die Suchm. besser ist.) auf dem "normalen" wege erstellen und eine Option mit einbauen wenn nur bestimmter Seiten Inhalt behandet wird per Ajax (im Template Format).

Nur müsste er dann für bestimmte Bereiche auch eine eigenes Ajax Script haben das dann mit geladen wird. .... Hmmm
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.02.2008, 08:23   Nach oben    #17
Neq'
Patrick Freitag
 
Registriert seit: 17.08.2005
Beiträge: 106
Standard

Zitat:
Zitat von DasMööp Beitrag anzeigen
Hmm, dann habe ich das evtl. bischen falsch gesehen. Bei dem Link gibt er die ganze Seite wieder zurück ...

Ist also doch nur um Feinheiten nachzuladen, hatte das im Template Compiler komplett umgesetzt das er auch Links einfach mittels Ajax umsetzt.

Dann werde ich normale SeitenLinks (hab irgendwo auch beim lesen gesehen das dies auch für die Suchm. besser ist.) auf dem "normalen" wege erstellen und eine Option mit einbauen wenn nur bestimmter Seiten Inhalt behandet wird per Ajax (im Template Format).

Nur müsste er dann für bestimmte Bereiche auch eine eigenes Ajax Script haben das dann mit geladen wird. .... Hmmm
Wenn man JavaScript optional verwenden möchte ist meiner Meinung nach "Unobtrusive JavaScript" die einzige wahre Lösung.
Neq' ist offline