• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Wann AJAX sinnvoll einsetzen?

Um serverseitig zu unterscheiden, welche antwort kommen soll.
Ich werde das noch ein wenig weiter beschreiben :)
Du erwartest ja den gleichen Inhalt wie bei dem normalen Seitenaufruf mit der Ausnahme, dass du von solch einem Quelltext wie dem folgendem....
HTML:
<html>
    <head><title>Bla</title></head>
    <body>
        <h1>Meine Seite</h1>
        <ul id="navigation"><li>News</li><li>Kontakt</li></ul>
        <div id="content">
             <h2>News</h2>
             <p>Super Neuigkeiten</p>
        </div>
    </body>
</html>

... dann nur noch bei Ajax diesen teil brauchst

HTML:
 <h2>News</h2>
 <p>Super Neuigkeiten</p>

Und das rausfiltern der Überflüssigen informationen würde ich an deiner Stelle dann per PHP machen.
Deine Seite könnte dann so aussehen
HTML:
<?php
if($_GET['ajax'] != "true") {
?>
<html>
    <head><title>Bla</title></head>
    <body>
        <h1>Meine Seite</h1>
        <ul id="navigation"><li>News</li><li>Kontakt</li></ul>
        <div id="content">
<?php
}
 ?>
             <h2>News</h2>
             <p>Super Neuigkeiten</p>

<?php
if($_GET['ajax'] != "true") {
?>
        </div>
    </body>
</html>

<?php
}
 ?>

Was JS Frameworks angeht, so erleichtern diese dir wirklich das Leben. Besonders was Ajax angeht. Bei deinem Vorhaben würde sich der Einsatz schon lohnen.

Die Schreibweise mit onclick gefällt mir persönlich ja nicht so gut, da JS Code in deinen HTML-Elementen stehen hast. Ich bevorzuge die Elemente von außen anusprechen.
Dafür gibst du deinen Elementen nur ein Indiez zum zuordnen wie einen Klassennamen. Zum Beispiel:

HTML:
 <a href="index.php?page=news" class="ajaxLink">News</a>

Nehmen wir an du benutzt nun jQuery als Javascript Framework. So sähe dein JS so aus.

Code:
$(".ajaxLink").click(loadSite);

function loadSite() {
   // this bezieht sich auf das Link-Element
  $.ajax({
  url: this.href,
  data: "ajax=true",
  success: function(result){
    alert(result);
  }
});
}

Wenn du Fragen zur Umsetzung hast kannst du diese gerne stellen
 
Werbung:
Also, ich habe das Ganze jetzt einmal über gelöst
HTML:
<li class="top_"><a href="index.php?page=home" onClick="get_page('home'); return false" title="Home" class="top_link">Home</a></li>

gelöst.
Jetzt habe ich noch eine Frage: Mit der Funktion stelle ich die Anfrage an den Server
Code:
function get_page(page){                                                // AJAX: get page
    if (page == ""){                                                    // No page defined -> error and exit
        document.getElementById("content").innerHTML = "";
        return;
    } 
    if (window.XMLHttpRequest){                                            // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else{                                                                // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function(){
        if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)){
            document.getElementById("content").innerHTML = xmlhttp.responseText;
        }
        overlay_hide();                                                    // Loading Balken ausblenden
    }
    xmlhttp.open("GET", "/admin/get_content.php?page=" + page,true);    // Send request
    xmlhttp.send();
    overlay_show();                                                        // Loading Balken einblenden
}
So kann ich den Inhalt der Seite bequem anpassen. Aber jetzt möchte ich den Titel noch ändern. Kann ich im selben request gleich mehrere Parameter zurück bekommen (z.B. mit PHP eine Array zurückgeben)? Zum Beispiel Titel, den Autor, das Ertellugnsdatum... zurückbekommen und den HTML-Inhalt anpassen.
Oder muss ich da mehrere Anfragen an den Server stellen?
 
Werbung:
Besten Dank

Ok, jetzt kommt die nächste dumme Frage: Wie kann man die JavaScript-History bearbeiten? Beim Zurück-Button des Browsers verlasse ich momentan die ganze Seite, nicht aber inhaltlich. Und der Refresh versetzt mich immer zur Startseite zurück.
Alles was ich bis jetzt gefunden habe ist ReallySimpleHistory, aber wie ich dies einsetze habe ich bis jetzt noch nicht herausgefunden. Oder gibt es eine andere Möglichkeit?

Das Thema, wie man eine Seite mit Ajax erstellt, ist etwas unübersichtlich.
Dem kann ich bis jetzt nur zustimmen.

Nochmals besten Dank für die Unterstützung
 
?? Das begreife ich jetzt nicht so ganz.
Funktioniert dies mit dem Hashbang URL?

EDIT:
Ok, ich glaube, dass ich es einigermassen begriffen habe:
Beim "xmlhttp.onreadystatechange" habe ich folgende Zeile ergänzt <<location.hash = "#!page=" + response.page>>, wobei ich die aktuelle Seite auch zusätzlich zum Inhalt zurückbekomme.
Somit werden die History-Einträge gesetzt und die Vor- und Zurück-Funktion des Browser sowie das Refresh gehen. Aber die Seite ansich wird nicht aktualisiert (bei vor und zurück). Das Refresh habe ich über eine onload-Funktion gelöst.
Wie kann ich den Inhalt durch die neue URL anpassen? Gibt es da einen Event, weil eine Funktion die periodisch aufgerufen wird, erscheint mir nicht sinnvol. Oder hättet ihr andere Vorschläge?

EDIT2:
Ich habe die gesuchte Funktion gefunden:
Code:
window.onhashchange
Momentan sieht der Code bei mir so aus:
Code:
/*
 *    AJAX-Funktion um Seiteninhalt dynamisch asynchron anzupassen
 */
function get_page(page){                                                                // AJAX: get page
    if (page == ""){                                                                    // No page defined -> error and exit
        document.getElementById("content").innerHTML = "";
        return;
    } 
    if (window.XMLHttpRequest){                                                            // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else{                                                                                // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function(){
        document.getElementById("author").innerHTML = "";                                // Autor anpassen
        document.getElementById("date_time").innerHTML = "";                            // Erstellungsdatum anpassen
        switch(xmlhttp.readyState){                                                        // Verschiedene States von xhtml.Request
            case 0:                                                                        // Unset
                document.getElementById("content").innerHTML = "<b>AJAX-ReadyState:<b><br/>The object has been constructed. ";
                break;
                
            case 1:                                                                        // Opened
                document.getElementById("content").innerHTML = "<b>AJAX-ReadyState:<b><br/>The 'open()' method has been successfully invoked";
                break;
                
            case 2:                                                                        // Header received
                var msg = "<b>AJAX-ReadyState:<b><br/>Header received:<br/>";
                msg += "All redirects (if any) have been followed and all HTTP headers of the final response have been received. Several response members of the object are now available.";
                document.getElementById("content").innerHTML = msg;
                break;
                
            case 3:                                                                        // Loading
                document.getElementById("content").innerHTML = "<b>AJAX-ReadyState:<b><br/>Loading: The response entity body is being received.";
                break;
                
            case 4:                                                                        // Done
                if(xmlhttp.status == 200){
                    var response = eval('(' + xmlhttp.responseText + ')');                // JSON-String decodieren
                    document.getElementById("content").innerHTML = response.content;    // Content-Teil ändern
                    document.title = "Harmonie Schwarzenburg: " + response.title;        // Titel anpassen
                    document.getElementById("author").innerHTML = response.author;        // Autor anpassen
                    document.getElementById("date_time").innerHTML = response.date_time;// Erstellungsdatum anpassen
                }
                else{    
                    var msg = "\r<table class=\"schrift_error\" align=\"center\">";
                    msg += "\r\t<tr>";
                    msg += "\r\t\t<td style=\"padding-right: 10px\">";
                    msg += "\r\t\t\t<img src=\"admin/images/error.png\" alt=\"Error\"/>";
                    msg += "\r\t\t</td>";
                    msg += "\r\t\t<td>";
                    msg += "\r\t\t\tAJAX request error:<br/>";
                    msg += "\r\t\t\tReload the page";
                    msg += "\r\t\t</td>";
                    msg += "\r\t</tr>";
                    msg += "\r</table>";
                    
                    document.getElementById("content").innerHTML = msg;                    // Error-Ausgeben
                    document.title = "Titel: AJAX-Error";                                             // Titel anpassen
                }
                break;
        }
        overlay_hide();                                                                    // Loading Balken ausblenden
    }
    xmlhttp.open("GET", "/admin/get_content.php?page=" + page,true);                    // Send request
    location.hash = "#!page=" + page;                                                    // Anker mit Seite in URL setzen (Refresh, vor und zurück)
    xmlhttp.send();
    overlay_show();                                                                        // Loading Balken einblenden
}

/*
 *    "Seite wird geladen"
 */
function overlay_show(){                                                                // Seite abdunkeln, Ladebalken einblenden
    document.getElementById("black_overlay").style.display = "block";
    document.getElementById("loading").style.display = "block";
}
function overlay_hide(){                                                                // Seite normal darstellen
    document.getElementById("black_overlay").style.display = "none";
    document.getElementById("loading").style.display = "none";
}

/*
 *    Refresh und Onload
 */
window.onload = function (){
    if(location.hash != ""){                                                            // Hash vorhanden
        var str = location.hash;                                                        // Hash speichern
        str = str.substr(2);                                                            // #! ignorieren
        var parts = str.split("=");                                                        // String-Teile
        if(parts[0] == "page"){                                                            // AJAX-Anfrage stellen
            get_page(parts[1]);                                                            // Entsprechende Seite neu laden
        }
    }
    else{                                                                                // Startseite (erstes betetreten der Seite)
        location.hash = "#!page=home";                                                    // Anker mit Seite in URL setzen (Refresh, vor und zurück)
    }
}

/*
 *    Vor und Zurück Aktionen des Browsers, Hash geändert
 */
window.onhashchange = function (){
    if(xmlhttp.readyState != 1){                                                        // Verhindern von doppeltem Laden, State bei open created
        if(location.hash != ""){                                                        // Hash vorhanden
            var str = location.hash;                                                    // Hash speichern
            str = str.substr(2);                                                        // #! ignorieren
            var parts = str.split("=");                                                    // String-Teile
            if(parts[0] == "page"){                                                        // AJAX-Anfrage stellen
                get_page(parts[1]);                                                        // Entsprechende Seite neu laden
            }
        }
        else{
            get_page("home");                                                            // Startseite
        }
    }
}
So funktionieren alle Browser-Funktionen (Vor, Zurück und Refresh). Oder habt ihr noch Verbesserungsvorschäge?

Besten Dank für eure Unterstützung
P51D
 
Zuletzt bearbeitet:
Werbung:
Ich habe eine kleine Frage. Bei einem Formular wird komischerweise die Seite get_content.php augerufen, die eigentlich vom JavaScript angesprochen wird. Wieso ist das so?

index.php:
HTML:
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>    
        <link rel="stylesheet" type="text/css" media="screen" href="css/style.css"/>
        <link rel="stylesheet" type="text/css" media="screen" href="css/schriften.css"/>    
        <link rel="stylesheet" type="text/css" media="print" href="css/print_style.css"/>            
    
        <script type="text/javascript" src="js/ajax_page_loader.js"></script>
    </head>

    <body>
        <div id="black_overlay"></div>
        <div id="loading">
            <div id="loading_text">Seite wird geladen</div>
            <img src="admin/images/ajax_loader.gif" alt=""/>
        </div>

        <div id="left">
            <div id="menu">            
                <ul id="menu2">
                    <li class="top_"><a href="index.php?page=home" onClick="get_page('home'); return false" title="Home" class="top_link">Home</a></li><br/>
                    <li class="top">
                        <a title="Fotogalerie" class="top_link">Fotogalerie</a>
                        <ul class="sub">
                            <li class="subtop"><span><a href="index.php?page=frkonzert11" onClick="get_page('frkonzert11'); return false" title="Frühlingskonzert 2011">Frühlingskonzert 2011</a></span><b></b></li>
                            <li><span><a href="index.php?page=s_weekend_11" onClick="get_page('s_weekend_11'); return false" title="Skiweekend">Skiweekend</a></span><b></b></li>

                            <li><span><a href="index.php?page=a_abend10" onClick="get_page('a_abend10'); return false" title="Abschlussabend 2010">Abschlussabend 2010</a></span><b></b></li>
                            <li><span><a href="index.php?page=advkonzert10" onClick="get_page('advkonzert10'); return false" title="Adventskonzert 2010">Adventskonzert 2010</a></span><b></b></li>
                            <li><span><a href="index.php?page=dorfturnier_2010" onClick="get_page('dorfturnier_2010'); return false" title="Dorfturnier 2010">Dorfturnier 2010</a></span><b></b></li>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>

        <div id="content">                                                                    
            <form method="post" action="index.php">
                <table>
                    <tr>
                        <td style="width:158px; padding-top:40px" align="center">
                            <p>
                                <a href="uploads/images/gallery/frkonzert11/frkonzert11_01.JPG" rel="clearbox=[gallery=Frühlingskonzert 2011]" title="frkonzert11_01.JPG">
                                    <img border="0" class="glossy" src="uploads/images/gallery/frkonzert11/frkonzert11_01.JPG" width="134px" height="98px" alt="frkonzert11_01.JPG"/>

                                </a>
                            </p>
                            <input name="checkbx[]" type="checkbox" value="uploads/images/gallery/frkonzert11/frkonzert11_01.JPG"/>Bild-1
                        </td>
                        <td style="width:158px; padding-top:40px" align="center">
                            <p>
                                <a href="uploads/images/gallery/frkonzert11/frkonzert11_02.JPG" rel="clearbox=[gallery=Frühlingskonzert 2011]" title="frkonzert11_02.JPG">
                                    <img border="0" class="glossy" src="uploads/images/gallery/frkonzert11/frkonzert11_02.JPG" width="134px" height="98px" alt="frkonzert11_02.JPG"/>
                                </a>

                            </p>
                            <input name="checkbx[]" type="checkbox" value="uploads/images/gallery/frkonzert11/frkonzert11_02.JPG"/>Bild-2
                        </td>
                    </tr>
                </table>
                <center>
                    <button type="submit" name="download_images">Ausgewählte Bilder als ZIP downloaden</button>
                </center>

            </form>
        </div>
    </body>
</html>
und ajax_page_loader.js:
Code:
function get_page(page){                                                                // AJAX: get page
    if (page == ""){                                                                    // No page defined -> error and exit
        document.getElementById("content").innerHTML = "";
        return;
    }
    if (window.XMLHttpRequest){                                                            // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else{                                                                                // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function(){
        document.getElementById("author").innerHTML = "";                                // Autor anpassen
        document.getElementById("date_time").innerHTML = "";                            // Erstellungsdatum anpassen
        switch(xmlhttp.readyState){                                                        // Verschiedene States von xhtml.Request
            case 4:                                                                        // Done
                if(xmlhttp.status == 200){
                    var response = eval('(' + xmlhttp.responseText + ')');                // JSON-String decodieren
                    document.getElementById("content").innerHTML = response.content;    // Content-Teil ändern
                    document.title = "Harmonie Schwarzenburg: " + response.title;        // Titel anpassen
                    document.getElementById("author").innerHTML = response.author;        // Autor anpassen
                    document.getElementById("date_time").innerHTML = response.date_time;// Erstellungsdatum anpassen
                    
                    if(response.type == "gallery_images"){                                // Wenn Bildergalerie angezeigt werden soll
                        CB_Init();                                                        // Init Clearbox 3
                        if(window.addEventListener) addGlossy();                        // Wenn nicht IE -> Glossy anpassen
                        else                         addIEGlossy();                        // IE Glossy
                    }
                }
                else{    
                    var msg = "\r<table class=\"schrift_error\" align=\"center\">";
                    msg += "\r\t<tr>";
                    msg += "\r\t\t<td style=\"padding-right: 10px\">";
                    msg += "\r\t\t\t<img src=\"admin/images/error.png\" alt=\"Error\"/>";
                    msg += "\r\t\t</td>";
                    msg += "\r\t\t<td>";
                    msg += "\r\t\t\tAJAX request error:<br/>";
                    msg += "\r\t\t\tReload the page";
                    msg += "\r\t\t</td>";
                    msg += "\r\t</tr>";
                    msg += "\r</table>";
                    
                    document.getElementById("content").innerHTML = msg;                    // Error-Ausgeben
                    document.title = "Harmonie Schwarzenburg: AJAX-Error";                // Titel anpassen
                }
                break;
        }
        overlay_hide();                                                                    // Loading Balken ausblenden
    }
    xmlhttp.open("GET", "/admin/get_content.php?page=" + page,true);                    // Send request
    location.hash = "#!page=" + page;                                                    // Anker mit Seite in URL setzen (Refresh, vor und zurück)
    xmlhttp.send();
    overlay_show();                                                                        // Loading Balken einblenden
}
Wie gesagt iwird get_content.php augerufen anstelle von index.php sobald ich auf den Submit-Button klicke. Aber wieso?

Besten dank für die Hilfe
 
Nein, leider nicht. Da habe ich nur CSS Warnungen, aber keine Fehler.

Des weiteren habe ich festgestellt, dass das ganze funktioniert, wenn ich das Formular nicht über AJAX lade, sondern normal über get. Die Funktionen sind schon vorrangig eingebunden. Aber müssen diese dann irgendwie nachträglich noch "initialisiert" werden?
 
Werbung:
Das ist merkwürdig. Ob das initialisiert werden muss, hängt von deinem JS Code ab. Entweder du hast ihn selbst geschrieben, dann müsstest du das Wissen oder du hast ihn runtergeladen, dann müßte es in der Anleitung stehen.
 
Ich habe den Fehler gefunden...
Das Formular wird so erstellt (gekürtzt):
PHP:
$act_page = $_SERVER["PHP_SELF"];
$msg .= "\r<form method=\"post\" action=\"$act_page\">";

Und das Formular wird von "get_page.php" zusammengestellt, da diese Datei vom AJAX-Request angefragt wird.

Tja, nur dumm, dass sich der Qellcode nicht mehr anpasst beim Browser, ansonsten hätte ich es schon früher gefunden. Das jetzt war fast Zufall.
Kann man von AJAX aus auch den Qellcode beim Browser anpassen, denn es wird ja immer nur die Startseite angezeigt?
 
Werbung:
Beim Browser kann man ja den Seitenquellcode anzeigen lassen. Dieser entspricht aber nur dem, der Startsteite da ja alles über AJAX angepasst wird und nicht die Seite neu geladen wird.

Gibt es eine Möglichkeit auch den Quellcode im Browser zu ändern, damit er immer so aussieht, wie es eigentlich von der angezeigten Seite sein müsste.

Ist es jetzt etwas klarer geworden?
 
Den nachträglich per JavaScript veränderten „Quellcode“ des DOM kannst du mit Tools wie Firebug (für Firefox) betrachten.
 
So, jetzt ist schon die nächste Frage aufgetaucht:
Kann man auch Downloads über AJAX starten? Oder ist hierfür die "alte" Methode über ein POST oder eine URL besser geeignet?
Wenn ich versuche Bilder in ein Zip zu packen, funktioniert es, aber leider wird dann der "Dateiinhalt" bei der Seite hinzugefügt und nicht der Download gestartet.
Ich hab schon beide Meinungen gelesen, dass es funktioniert und aber auch nicht. Zum Teil lösten sie es über iFrames, was ich ehrlich gesagt vermeiden möchte.

Besten Dank
MFG
 
Werbung:
Was stört dich denn am konventionellen Download? Oder was versprichst du dir, was besser sein könnte?
 
So, jetzt ist schon die nächste Frage aufgetaucht:
Kann man auch Downloads über AJAX starten? Oder ist hierfür die "alte" Methode über ein POST oder eine URL besser geeignet?
Wenn ich versuche Bilder in ein Zip zu packen, funktioniert es, aber leider wird dann der "Dateiinhalt" bei der Seite hinzugefügt und nicht der Download gestartet.
Ich hab schon beide Meinungen gelesen, dass es funktioniert und aber auch nicht. Zum Teil lösten sie es über iFrames, was ich ehrlich gesagt vermeiden möchte.

Besten Dank
MFG
Such mal auf dieser Seite PHP: header - Manual
nach function downloadFile( $fullPath )
Das sollte genau das sein was du suchst :)
 
Zurück
Oben