Professional Documents
Culture Documents
1
© Copyright 2014, Εθνικό και Καποδιστριακό Πανεπιστήμιο Αθηνών, Π. Ε. Πετράκης.
Η έντυπη, ηλεκτρονική και γενικά κατά οποιοδήποτε τρόπο αναπαραγωγή, δημοσίευση
ή χρησιμοποίηση όλου ή μέρους του υλικού έργου αυτού, απαγορεύεται χωρίς την
έγγραφη έγκριση του κατόχου των πνευματικών δικαιωμάτων του έργου.
2
Το παρόν έντυπο αποτελεί το εκπαιδευτικό υλικό του μαθήματος “Τεχνική AJAX”.
Αποτελεί απαραίτητο συμπλήρωμα του ηλεκτρονικού υλικού που βρίσκεται στην
πλατφόρμα και αναπόσπαστο κομμάτι της εκπαιδευτικής διαδικασίας.
Η πρώτη διδακτική ενότητα παρουσιάζει στους εκπαιδευόμενους τη σημασία και την
εφαρμογή τεχνικών Ajax στη δημιουργία ενός website. Επίσης, θα μάθουν τη
δημιουργία αντικειμένου XMLHTTPRequest, τον τρόπο με τον οποίο γίνεται η συνομιλία
με τον διακομιστή, καθώς και να χρησιμοποιούν πολύ καλά τη συνάρτηση callback.
Με τη δεύτερη διδακτική ενότητα, οι εκπαιδευόμενοι θα μάθουν πώς χτίζουμε μια
εφαρμογή Ajax και πώς η εφαρμογή αυτή επιστρέφει δεδομένα. Επίσης, θα
μελετήσουμε πολλά παραδείγματα της τεχνικής Ajax χρησιμοποιώντας και
συνδυάζοντας όλες τις γλώσσες προγραμματισμού που μάθαμε.
Τη συγγραφή του συγκεκριμένου εκπαιδευτικού υλικού πραγματοποίησε ο κ. Βαγγέλης
Στελλάτος, εξωτερικός συνεργάτης του Προγράμματος Συμπληρωματικής εξ
Αποστάσεως Εκπαίδευσης του Εθνικού και Καποδιστριακού Πανεπιστημίου Αθηνών.
3
ΠΕΡΙΕΧΟΜΕΝΑ
ΒΙΒΛΙΟΓΡΑΦΙΑ ................................................................................................................... 61
4
ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ
5
6
Εισαγωγικές Παρατηρήσεις
Στην πρώτη υποενότητα θα αναλυθούν η χρησιμότητα και η λειτουργία της AJAX
καθώς και η σημασία του αντικειμένου XMLHttpRequest
Στη δεύτερη υποενότητα θα αναλυθούν οι δύο βασικοί τρόποι απόκρισης του server
responseXML και responseText.
Στην τρίτη υποενότητα θα παρουσιαστούν και θα αναλυθούν εφαρμογές AJAX.
7
ΥΠΟΕΝΟΤΗΤΑ 1. ΕΙΣΑΓΩΓΗ ΣΤΗΝ AJAX
Η AJAX δεν είναι μία γλώσσα προγραμματισμού όπως είναι για παράδειγμα η
JavaScript. Η AJAX έρχεται στην ουσία να αλλάξει τον τρόπο επικοινωνίας μεταξύ του
Browser και του server, και κατά επέκταση τον τρόπο που αλληλεπιδρά ο χρήστης με
τον server.
Ο κλασσικός τρόπος επικοινωνίας είναι να φορτώνεται μία σελίδα όταν ο χρήστης
πατήσει κάποιο button ή κάποιο link κτλ. Στο διάστημα που μεσολαβεί μεταξύ δύο
διαδοχικών επιλογών του χρήστη δεν υπάρχει επικοινωνία browser και server.
Έτσι λοιπόν, όταν ο χρήστης κάνει μία επιλογή και το αποτέλεσμα της επιλογής είναι να
αλλάξει ένα μόνο μέρος της σελίδας τότε θα πρέπει ο Browser να στείλει αίτημα στο
server και ο server να στείλει εκ νέου τη σελίδα, όπως για παράδειγμα όταν
συμπληρώνουμε μία φόρμα σε μια ιστοσελίδα.
Αυτό έχει σαν αποτέλεσμα να επιβαρύνεται η σύνδεση με μεταφορά άχρηστων
δεδομένων και φυσικά οι σελίδες να γίνονται πιο αργές. Επίσης από την άλλη μεριά ο
χρόνος μεταξύ δύο διαδοχικών επιλογών του χρήστη παραμένει ανεκμετάλλευτος.
Πρέπει λοιπόν όση ώρα, για παράδειγμα, συμπληρώνει ο χρήστης τα στοιχεία να
υπάρχει δυνατότητα να γίνονται και άλλες διεργασίες παράλληλα, όπως ακριβώς
γίνεται σε ένα λειτουργικό σύστημα. Αυτή την εμπειρία την έχουμε σχεδόν όλοι δοκιμάσει
κατά την εισαγωγή στοιχείων αναζήτησης της google.
Όταν εισαγάγουμε στοιχεία τότε θα παρατηρήσουμε ότι σε κάθε χαρακτήρα που
πληκτρολογούμε η σελίδα της google ανανεώνει το συγκεκριμένο κομμάτι της σελίδας
προσπαθώντας να μαντέψει αυτό που θέλουμε να εισαγάγουμε και ταυτόχρονα
προετοιμάζει τα αντίστοιχα αποτελέσματα. Δηλαδή η μηχανή της Google δεν περιμένει
το πάτημα του button του χρήστη, αφού έχει συμπληρώσει τη φόρμα αναζήτησης.
Στην ουσία με τη βοήθεια της AJAX δημιουργούμε μία ασύγχρονη επικοινωνία μεταξύ
server και browser και εκμεταλλευόμαστε τον χρόνο όπου η σύνδεση είναι παγωμένη.
Με την AJAX μπορούμε και στέλνουμε αιτήματα στον Browser χωρίς αυτό να σημαίνει
ότι τα αιτήματα θα συνοδεύονται από μία πλήρη ανανέωση της οθόνης ή έστω και
αλλαγή ενός τμήματός της.
8
Εικόνα 1. Ασύγχρονη επικοινωνία AJAX
Πηγή: w3schools.com
Για να δημιουργήσουμε ένα αντικείμενο XMLHTTPRequest για τον Internet Explorer τότε
πρέπει να γράψουμε:
Υπάρχουν κάποιες εκδόσεις του Internet Explorer οι οποίες χρησιμοποιούν μία άλλη
έκδοση XML και είναι απαραίτητη η παρακάτω σύνταξη:
10
Το πρώτο if αφορά στην περίπτωση των περισσότερων Browser ενώ το δεύτερο if
αφορά στην περίπτωση του Internet Explorer παλιότερες από την έκδοση 7.
Και στις δύο περιπτώσεις λοιπόν θα δημιουργηθεί ένα καινούργιο αντικείμενο-αίτημα
προς τον server
3. Γράφουμε κώδικα σχετικά με το τι θέλουμε να πετύχουμε με το συγκεκριμένο αίτημα.
Σαν μέθοδο θα επιλέξουμε τη μέθοδο get ή τη μέθοδοι post. Γενικά η μέθοδος GET είναι
πιο γρήγορη και πιο απλή από τη μέθοδο POST και μπορεί να χρησιμοποιηθεί στην
πλειονότητα των περιπτώσεων. Από την άλλη μεριά η μέθοδος POST είναι
καταλληλότερη για αποστολή δεδομένων μεγαλύτερης χωρητικότητας καθώς δεν έχει
περιορισμούς. Επίσης στην περίπτωση που θέλουμε να στείλουμε με το αίτημα
ευαίσθητα δεδομένα χρησιμοποιούμε περισσότερο τη μέθοδο POST η οποία είναι
ασφαλέστερη.
Στη θέση URL θα δώσουμε τη θέση του αρχείου στο server.
Στο τρίτο όρισμα θα εισαγάγουμε τιμή true(προεπιλογή) για ασύγχρονη επικοινωνία και
false για σύγχρονη.
11
Με τη μέθοδο send στέλνουμε την αίτηση στο server. Η μέθοδος send δέχεται μόνο ένα
όρισμα.
Μέθοδος abort
Η μέθοδος abort() σταματάει την τρέχουσα αίτηση.
Η μέθοδος getAllResponseHeaders() επιστρέφει όλες τα Headers ως string
Η μέθοδος getResponseHeader(x) επιστρέφει το Header x ως string.
Ιδιότητα readyState
Η ιδιότητα readyState είναι πάρα πολύ σημαντική για την AJAX γιατί «κρατάει την
κατάσταση της αίτησης και παίρνει τις παρακάτω τιμές:
readyState =0 το αίτημα δεν έχει αρχικοποιηθεί.
readyState =1 εδραιώθηκε η σύνδεση με τον server
readyState =2 το αίτημα παραλήφθηκε από τον server
readyState =3 επεξεργασία αιτήματος
readyState =4 το αίτημα έχει ολοκληρωθεί και είναι έτοιμη η απάντηση στο αίτημα.
Ιδιότητα onreadystatechange
Η ιδιότητα onreadystatechange αποθηκεύει μία συνάρτηση η οποία θα κληθεί
αυτόματα σε περίπτωση που αλλάξει κάποια τιμή της readyState του αντικειμένου.
Ιδιότητα status
Η ιδιότητα status παίρνει τις παρακάτω τιμές
Status=200 σημαίνει ότι το http που επιστρέφει ο server είναι εντάξει.
Status=404 σημαίνει ότι δεν βρέθηκε η σελίδα.
12
1. Θα δημιουργεί αντικείμενο XMLHTTPRequest.
2. Θα αλλάζει στην ίδια σελίδα το κείμενο με περιεχόμενο από ένα txt file με το
πάτημα ενός button.
3. Επίσης θα εμφανίζει τις τιμές για τις readyState και status
Σχόλιο
Μέχρι εδώ έχουμε γράψει κώδικα για τη βασική δομή μιας σελίδας Html.
Στο στοιχείο head θα γράψουμε το ακόλουθο κώδικα JavaScript
Σχόλιο
Η συνάρτηση loadtext θα καλείται με ένα onclick event handler. Δηλαδή όταν ο
χρήστης πατήσει το πλήκτρο του mouse.
Σχόλιο
ορίζουμε τη μεταβλητή req για να εκχωρήσουμε το αποτέλεσμα της δημιουργίας
αντικειμένου XMLHttpRequest.
Σχόλιο
Αν ισχύει ότι υπάρχει το αντικείμενο window.XMLHttpRequest τότε στη μεταβλητή req θα
εκχωρηθεί η τιμή από XMLHttpRequest. Δηλαδή σε περίπτωση που δεν χρησιμοποιείται
internet Explorer προηγούμενης έκδοσης από 7.
13
Σχόλιο
Σε διαφορετική περίπτωση στη μεταβλητή req θα εκχωρηθεί το ActiveXObject.
Σχόλιο
Στο σημείο αυτό του κώδικα ορίζουμε το onreadystatechange event στο οποίο
αποθηκεύεται η συνάρτηση που ορίζεται παρακάτω. Η συνάρτηση θα εκτελεστεί
αυτόματα σε περίπτωση που αλλάξει η τιμή της readyState. Παρακάτω ορίζουμε τη
συνάρτηση που θα εκτελεστεί. Η συγκεκριμένη συνάρτηση που ενεργοποιείται όταν
αλλάξει η τιμή readyState λέγεται συνάρτηση callback.
Σχόλιο
Αν συμβαίνει η τιμή της req.readyState να είναι ίση με 4 και η τιμή της req.status ίση με
200, δηλαδή αν όλα έχουν πάει καλά, τότε θα εκτελεστούν οι παρακάτω γραμμές
κώδικα.
Σχόλιο
Σε περίπτωση που κληθεί η συνάρτηση θα αλλάξει το κείμενο στα παραπάνω divs
Σχόλιο
Καλούμε τη μέθοδο open με ορίσματα την επιλογή μεθόδου GET, το url του ajax.txt και
true για ασύγχρονη μετάδοση δεδομένων.
14
Στη θέση url δεν γράψαμε κάποια διαδρομή διότι το αρχείο ajax.txt υπάρχει μέσα στον
ίδιο φάκελο με τη σελίδα html. Μπορούμε εναλλακτικά να γράψουμε και
req.open(“GET”,“http://localhost/ajax5/ajax.txt”,true);
Αν γράψουμε το παραπάνω url σημαίνει ότι το αρχείο ajax.txt θα βρίσκεται στο φάκελο
htdocs ajax5 εφόσον η localhost του server αντιστοιχεί στο φάκελο htdocs.
15
2.2 Ιδιότητα responseXML
Για να γράψουμε δεδομένα γράφουμε πρώτα μία ετικέτα η οποία θεωρείται η ρίζα του
δένδρου και κλείνουμε με την ίδια ετικέτα.
Για παράδειγμα να θέλουμε να γράψουμε σε XML τα στοιχεία χρηστών τότε γράφουμε
τις ετικέτες και ανάμεσα θα γράψουμε τα στοιχεία αυτά για κάθε χρήστη ξεχωριστά.
16
Επίσης στις ετικέτες μπορούμε να προσθέσουμε και ιδιότητες, αλλά δεν θα επεκταθούμε
περισσότερο.
2.3 Μέθοδος εξόρυξης δεδομένων από αρχείο XML που βρίσκεται στο
server με τεχνική AJAX
Δημιουργούμε ένα XML σε text editor όπως είναι το Notepad++ για windows ή το
Wrangler για Mac αρχείο με στοιχεία χρηστών ενός Website όπως το παρακάτω. Θα
γράψουμε με λατινικούς χαρακτήρες για να αποφύγουμε την περίπτωση
ασυμβατότητας. Θα ξεκινήσουμε με την ετικέτα της xml και στη συνέχεια θα
συμπεριλάβουμε όλα τα στοιχεία μεταξύ των ετικετών και .
Στη συνέχεια για το κάθε στοιχείο του χρήστη θα το εισαγάγουμε εντός αντίστοιχων
ετικετών.
17
Αφού ολοκληρώσουμε την εισαγωγή των στοιχείων αποθηκεύουμε το αρχείο σε μορφή
xml με προέκταση .xml και σε φάκελο που έχουμε δημιουργήσει εντός του htdocs.
Στη συνέχεια θα γράψουμε κώδικα που να δημιουργεί αντικείμενο XMLHTTPRequest το
οποίο θα είναι υπεύθυνο για την επικοινωνία με το sever και έπειτα θα γράψουμε
κώδικα που θα δημιουργεί μία callback function η οποία μόλις αλλάξει η κατάσταση
θα κληθεί για να εξορύξει δεδομένα από το XML αρχείο με κριτήριο το αντίστοιχο tag.
Αρχείο html
Σχόλιο
Μέχρι αυτό το σημείο έχουμε δημιουργήσει τη δομή της Html σελίδας και στο στοιχείο
head της Html έχουμε ξεκινήσει την ετικέτα scipt για κώδικα Javascript
18
Σχόλιο
Δημιουργία αντικειμένου XMLHTTPRequest για όλους του browser εκτός του Internet
Explorer, έκδoση προηγούμενη από την 7.
Σχόλιο
Ορίζουμε τη συνάρτηση callback
Σχόλιο
Εκχωρούμε στη μεταβλητή xmlDoc την απόκριση από την ιδιότητα responseXML του
αντικειμένου req δηλαδή του XMLHTTPRequest.
Σχόλιο
Εκχωρούμε στη μεταβλητή x το αποτέλεσμα της μεθόδου getElementsByTagName
19
Σχόλιο
Χρησιμοποιούμε ένα μετρητή ώστε να εμφανίσει το αποτέλεσμα της αίτησης
αναζήτησης προς το server. Σε κάθε εκτέλεση του βρόχου θα προστίθεται και ένα
ακόμα childNode του DOM αντικειμένου.
Η τιμή childNodes[0] είναι γιατί το childnode είναι κείμενο.
Σχόλιο
Αφού ολοκληρωθεί ο βρόχος και τα αποτελέσματα είναι έτοιμα τότε θα εμφανιστούν
στη θέση του κειμένου του πίνακα που ορίζεται από το div1.
20
Παράδειγμα 2. Ιδιότητα responseXML
21
ΥΠΟΕΝΟΤΗΤΑ 3. ΕΦΑΡΜΟΓΕΣ AJAX
Σε αυτή την υποενότητα θα δούμε τις εφαρμογές AJAX με τη δημιουργία δύο quiz.
Στο πρώτο quiz θα εμφανιστεί μία ερώτηση γνώσεων. Κατά την πληκτρολόγηση της
απάντησης από το χρήστη θα εμφανίζεται ταυτόχρονα ένας προς έναν οι χαρακτήρες.
Μόλις στο πεδίο συμπληρωθεί η απάντηση τότε χωρίς ο χρήστης να πατήσει κάποιο
button θα εμφανιστεί κατάλληλο μήνυμα ότι δόθηκε η σωστή απάντηση.
Για να το πετύχουμε αυτό θα χρειαστεί να δημιουργήσουμε μία σελίδα με onkeyup
event handler έτσι ώστε κάθε φορά που ο χρήστης θα γράφει κάποιο χαρακτήρα στη
φόρμα θα πυροδοτείται μία συνάρτηση η οποία στη συνέχεια θα πυροδοτεί με τη σειρά
της μία συνάρτηση callback. Η συνάρτηση callback θα δημιουργεί αντικείμενο
XMLHTTPRequest και θα περνάει μία παράμετρο μαζί με την τιμή της σε αρχείο php που
βρίσκεται στο φάκελο htdocs του εικονικού server.
Αφού ο server θα ελέγχει αν η απάντηση είναι η σωστή θα στέλνει πίσω στη σελίδα
κατάλληλο μήνυμα.
Αρχικά θα γράψουμε κώδικα για τη δομή της Html και θα δημιουργήσουμε την ετικέτα
έναρξης του script:
22
περιγράψουμε τι θα γίνει στην περίπτωση όπου το μήκος της αλφαριθμητικής string
είναι ίσο με μηδέν. Στην περίπτωση αυτή το div που θα μας εμφανίζει τους χαρακτήρες
που έχει πληκτρολογήσει ο χρήστης θα παραμένει κενό. Μέχρι να πληκτρολογήσει ο
χρήστης κάποιο χαρακτήρα δεν συντρέχει λόγος για δημιουργία αντικείμενου
XMLHttpRequest.
Στη συνέχεια θα περιγράψουμε στον κώδικα μας τι θα γίνει στην περίπτωση όπου ο
χρήστης πληκτρολογήσει κάποιο χαρακτήρα. Τότε θα γράψουμε την κλασική συνθήκη
για τα αντικείμενα XMLHttpRequest.
Σε περίπτωση όπου όλα έχουν πάει καλά εκχωρούμε το αποτέλεσμα από την
ανταπόκριση του server σε αντίστοιχη innerHTML για να αλλάξει η αλφαριθμητική που
εμφανίζει τους χαρακτήρες που πληκτρολόγησε ο χρήστης.
Στη συνέχεια θα γράψουμε τις μεθόδους open και send για να στείλουμε το αίτημα στο
server. Σαν ορίσματα στη μέθοδο open θα επιλέξουμε τη μέθοδο GET ως πρώτο
23
όρισμα και το επόμενο όρισμα θα γράψουμε το quiz2.php περνώντας ταυτόχρονα την
παράμετρο q μαζί με τη λέξη word και κλείνουμε άγκιστρα και τις ετικέτες τέλους για
script και head.
Τέλος, θα γράψουμε style για το στοιχείο border και θα γράψουμε τον κώδικα για να
εμφανίζεται η φόρμα με το onkey event handler και το div στο οποίο θα αλλάζει το
περιεχόμενο η απόκριση του server xmlhttp.responseText.
Στη συνέχεια θα γράψουμε το PHP script.
Στο php script θα γράψουμε για να έχουμε πρόσβαση στο στοιχείο
το οποίο είναι το περιεχόμενο της φόρμας. Στη συνέχεια θα γράψουμε
μία συνθήκη για να εμφανιστεί κατάλληλο μήνυμα όταν η αλφαριθμητική string που έχει
εισαγάγει ο χρήστης έχει γίνει ίση με την απάντηση.
24
Παράδειγμα 3. Quiz1
Κώδικας: Quiz1
25
3.1.2 Δημιουργία Quiz 2
Στο quiz2 θα υπάρχει στο PHP script ένας αριθμός και κάθε φορά που θα πληκτρολογεί
ο χρήστης έναν αριθμό τότε θα εμφανίζεται άμεσα μήνυμα όπου θα πληροφορεί το
χρήστη αν ο αριθμός που έχει εισαγάγει στο πεδίο είναι μεγαλύτερος ή μικρότερος από
τον ζητούμενο.
Για να το πετύχουμε αυτό θα χρησιμοποιήσουμε τον ίδιο κώδικα με το quiz1 για την Html
σελίδα. Θα γράψουμε διαφορετικό κώδικα για το PHP script.
Ξεκινώντας το PHP script θα ορίσουμε και θα εκχωρήσουμε στη μεταβλητή $r την τιμή
239. Δηλαδή αυτός θα είναι και ο αριθμός αναζήτησης. Στη συνέχεια θα έχουμε
πρόσβαση στην παράμετρο q η οποία θα εκχωρηθεί στη μεταβλητή $q.
Στη συνέχεια θα γράψουμε μία echo για να εμφανίζει αυτό που μέχρι στιγμής έχει
συμπληρώσει ο χρήστης.
26
Παράδειγμα 4. Quiz2
Κώδικας: Quiz2
27
3.2 Εφαρμογή AJAX
Σχόλιο
Μέχρι αυτό το σημείο δημιουργήσαμε τη σελίδα html και το αντικείμενο XMLHttpRequest
ανά περίπτωση Browser.
28
Σχόλιο
Δημιουργήσαμε τη συνάρτηση topio η οποία δέχεται δύο ορίσματα το name και το
photo. Επίσης χρησιμοποιήσαμε τη μέθοδο open() με επιλογή μεθόδου GET για να
ανταλλάξουμε δεδομένα με το server.
Σχόλιο
Δημιουργία συνάρτησης callback που ενεργοποιείται όταν αλλάζει η τιμή της
readyState.
Σχόλιο
Αν όλα είναι εντάξει τότε θα πάρουμε την ανταπόκριση του server από τα τρία αρχεία
τύπου txt τα οποία περιγράφουν αντίστοιχα τα τρία τοπία.
Σχόλιο
Με ένα h1 στοιχείο δίνουμε την οδηγία για να ξέρει ο χρήστης τι πρέπει να κάνει.
Σχόλιο
Τοποθετήσαμε τις τρεις φωτογραφίες με ετικέτες img src δίνοντάς τους διαστάσεις
width, height. Επίσης σε κάθε ετικέτα προσθέσαμε από ένα click event handler έτσι
29
ώστε να αλλάζει το κείμενο όταν ο χρήστης κάνει κλικ επάνω στη φωτογραφία. Αυτό
επιτυγχάνεται με την πυροδότηση της συνάρτησης topio.
Τέλος, θα προσθέσουμε και ένα div id= “perigrafi” για να μπορούμε να έχουμε
πρόσβαση στο σημείο όπου θα εμφανίζονται οι περιγραφές.
30
Σύνοψη
Μετά την ολοκλήρωση της συγκεκριμένης διδακτικής ενότητας γνωρίζετε ότι:
• μπορούμε να δημιουργούμε ασύγχρονη επικοινωνία με τη βοήθεια της AJAX,
• μπορούμε να δημιουργούμε αντικείμενα XMLHttpRequest για να στέλνουμε
αιτήματα στο server,
• μπορούμε να παίρνουμε αποτελέσματα από το server σε μορφή κειμένου txt ή XML
με τις μεθόδους responseText και responseXML, και
• μπορούμε να δημιουργούμε συνάρτηση Callback για να ενεργοποείται κάθε φορά
που αλλάζει η readyState.
31
32
ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ
33
34
Εισαγωγικές Παρατηρήσεις
Στην πρώτη υποενότητα θα αναλυθούν οι δυνατότητες των μεθόδων GET, POST και
πώς μπορούμε να περάσουμε σε αρχεία του server περισσότερες παραμέτρους και
τιμές αυτών.
Στη δεύτερη υποενότητα θα αναλυθεί η μέθοδος δημιουργίας πολλαπλών αιτήσεων και
πώς μπορούμε να εμφανίζουμε τα αποτελέσματα σε διαφορετικά divs της σελίδας.
Επίσης θα αναλυθεί και η εφαρμογή: Ιταλικό εστιατόριο
Στην τρίτη υποενότητα θα παρουσιαστεί και θα αναλυθεί εκτενώς η μέθοδος
δημιουργίας πολλαπλών αντικειμένων XMLHttpRequest. Επίσης θα παρουσιαστεί
εφαρμογή της μεθόδου.
35
ΥΠΟΕΝΟΤΗΤΑ 1. ΠΡΟΧΩΡΗΜΕΝΗ ΑΠΟΣΤΟΛΗ ΔΕΔΟΜΕΝΩΝ ΜΕ GET
POST
Για να γίνει καλύτερα κατανοητός ο τρόπος που στέλνουμε δεδομένα σε ένα Website
θα πρέπει να έχουμε στο μυαλό μας ότι η διεύθυνση του website που έχουμε
εγκαταστήσει στον εικονικό μας server με την πλατφόρμα του Xampp είναι η διεύθυνση
localhost.
Έτσι, για παράδειγμα, αν θέλω να πλοηγηθώ σε μία σελίδα στο Internet π.χ google.gr
θα πρέπει να γράψω στο πεδίο των διευθύνσεων του Browser https://www.google.gr/.
Αυτή είναι η διεύθυνση ενός server που έχει αποθηκευμένη τη συγκεκριμένη σελίδα. Ο
Browser λοιπόν θα στείλει αίτημα επικοινωνίας στη συγκεκριμένη σελίδα.
Έστω τώρα ότι η σελίδα αυτή βρίσκεται σε ένα φάκελο μέσα στο φάκελο htdocs της
πλατφόρμας Xampp. Τότε ο Browser θα στείλει αίτημα επικοινωνίας προς τη διεύθυνση
http://localhost. Αυτό που θα κάνουμε σε αυτή την υποενότητα είναι να στέλνουμε
αιτήματα και με τις δύο μεθόδους GET και POST με μία ή περισσότερες παραμέτρους
μαζί με τις τιμές τους.
Φυσικά για να έχουμε πρόσβαση στη συγκεκριμένη διεύθυνση θα πρέπει να
ενεργοποιήσουμε τα services από το Control panel. Αν κάνουμε μία δοκιμή να
πληκτρολογήσουμε στο Browser τη διεύθυνση http://localhost/ όταν τα services είναι
απενεργοποιημένα, τότε θα λάβουμε το γνωστό μήνυμα για αδυναμία της σύνδεσης.
Αν επαναλάβουμε το ίδιο, αφού έχουμε ενεργοποιήσει τα services, τότε θα πάρουμε ως
αποτέλεσμα στον Browser “It Works”.
Επίσης όταν τα services είναι ενεργοποιημένα και πληκτρολογήσουμε μία διεύθυνση
της localhost/όνομα_φακέλου/, πατώντας το enter θα εμφανιστούν τα αρχεία του
φακέλου σε μορφή Html σελίδας.
Έστω ότι θέλουμε να εισέλθουμε στο λογαριασμό μας στο WinBank της Τράπεζας
Πειραιώς. Τότε θα πληκτρολογήσουμε την παρακάτω διεύθυνση για να εμφανιστεί η
φόρμα των στοιχείων που πρέπει να συμπληρώσουμε. Σε αντιστοιχία θα έχουμε κάποιο
php file στο οποίο θα περνάμε όσες παραμέτρους θέλουμε.
https://www.winbank.gr/el/Pages/Home.aspx
Αντίστοιχα ένα αρχείο που βρίσκεται σε ένα φάκελο ajax μέσα στο htdocs θα έχει τη
διεύθυνση http://localhost/ajax/transfer.html.
36
Αυτό που θα κάνουμε είναι να περάσουμε σε ένα PHP αρχείο τιμές για όνομα, επίθετο
και email ενός χρήστη. Στη συνέχεια θα γράψουμε κώδικα για να εμφανίζονται τα
αποτελέσματά μας.
Θα δημιουργήσουμε λοιπόν ένα φάκελο με το όνομα ex-ajax2 μέσα στο φάκελο
htdocs του Xampp. Στη συνέχεια μέσα σε αυτό το φάκελο θα δημιουργήσουμε δεύτερο
φάκελο με το όνομα php όπου εκεί θα δημιουργήσουμε και θα αποθηκεύσουμε αρχείο
php με όνομα transfer.php.
Το αρχείο transfer.php είναι ένα αρχείο που βρίσκεται στον υποφάκελο Php του
εικονικού μας server. Άρα για να επικοινωνήσει ο Browser με το server θα χρειαστεί να
επικοινωνήσει με το τοπικό server στη διευθυνση http://localhost/ex-
ajax2/php/transfer.php.
37
Σχόλια: Ορίσαμε τη συνάρτηση transfer με είσοδο divID. Αυτό το όρισμα είναι που θα
πάρει τιμή ίση με το div που θα επιλέξουμε για να εμφανιστούν τα στοιχεία που θα
επιστρέψει ο server.
Σχόλιο:
Γράψαμε τη μέθοδο open για το αντικείμενο req και έχουμε δηλώσει τα παρακάτω
ορίσματα:
1. Σαν πρώτο όρισμα γράφουμε τη μέθοδο GET για την μεταφορά δεδομένων.
2. Σαν δεύτερο όρισμα γράφουμε τη διεύθυνση 'http://localhost/ex-
ajax2/php/transfer.php?name=Dimitris&lname=Papadopoulos&email=dp@gm
ail.com' στην οποία υπάρχει το αρχείο transfer.php. Όπως εξηγήσαμε, για να
συμβεί αυτό θα πρέπει το αρχείο να βρίσκεται στη διαδρομή Xampp/htdocs/ex-
ajax2/php. Επίσης πολύ σημαντικό είναι να προσέξουμε ότι στο τέλος του
ονόματος του αρχείου transfer.php ακολουθεί ένα Αγγλικό ερωτηματικό και
έπειτα με τη δήλωση
name=Dimitris&lname=Papadopoulos&email=dp@gmail.com
ως συνέχεια του δεύτερου ορίσματος περνάμε στο server και πιο συγκεκριμένα
στο αρχείο transfer.php τις τιμές για επίθετο όνομα και email. Ο κανόνας για τη
σύνταξη είναι
όνομα_παραμέτρου1=τιμή_παραμέτρου1&
όνομα_παραμέτρου2=τιμή_παραμέτρου2&…
3. Δίνουμε σαν τρίτο όρισμα την τιμή true για ασύγχρονη μετάδοση δεδομένων. Η
τιμή true είναι προαιρετική επειδή είναι και η προεπιλογή.
38
Σχόλιο:
Στο σημείο αυτό ορίζουμε τη συνάρτηση callback.
Σχόλιο:
Αν η readyState == 4 και req.status == 200 σημαίνει ότι η απάντηση του server είναι
έτοιμη προς αποστολή.
Σχόλιο:
Στην ιδιότητα innerHTML του αντικειμένου x θα αποθηκευθεί η απόκριση του server σε
μορφή κειμένου αλφαριθμητικής string του αντικειμένου req.
Σχόλιο:
Στο στοιχείο body θέσαμε image picjumbo.com_IMG_3130.jpg ως background.
Επίσης ορίσαμε
39
Σχόλιο:
Δημιουργήσαμε ένα button με τη βοήθεια της ετικέτας form δίνοντας style χρώμα
γραμματοσειράς magenta για να υπάρχει μία ομοιομορφία. Ορίσαμε στο Button ένα
onclick event handler το οποίο στην περίπτωση που πατηθεί από το χρήστη το button
πυροδοτεί τη συνάρτηση transfer δίνοντας σαν είσοδο το όρισμα με όνομα div1.
Σχόλιο:
Γράψαμε κώδικα για το div όπου θα εμφανιστεί το αποτέλεσμα της απόκρισης του
server. Επίσης γράψαμε και σε ετικέτα footer την πηγή της φωτογραφίας και κλείσαμε
τις ετικέτες των στοιχείων body και footer.
40
Παράδειγμα 1. Μέθοδος POST
Κώδικας: Μέθοδος POST
41
2. Θα προσθέσουμε κάτω από τη γραμμή με τη req.open τη μέθοδο
Με αυτή τη γραμμή στέλνουμε τις παραμέτρους name, lname και email με τις
αντίστοιχες τιμές. Προσέξτε τη σύνταξη της req.send.:
req.send("par1=+value1& par2=+value2+… ");
42
ΥΠΟΕΝΟΤΗΤΑ 2. ΧΕΙΡΙΣΜΟΣ ΠΟΛΛΩΝ ΑΠΟΤΕΛΕΣΜΑΤΩΝ ΚΑΙ
ΕΜΦΑΝΙΣΗΣ ΣΕ ΔΙΑΦΟΡΕΤΙΚΑ ΣΗΜΕΙΑ ΤΗΣ ΣΕΛΙΔΑΣ
Παρακάτω θα γράψουμε τη συνθήκη για την έκδοση του Browser που χρησιμοποιεί ο
χρήστης.
Σχόλιο: Αν ισχύει ότι η έκδοση του Browser που χρησιμοποιούμε είναι ένας κοινός
browser εκτός ΙΕ με ver<7 τότε στη req θα εκχωρηθεί το αντικείμενο XMLHttpRequest και
στη var μήνυμα που θα ενημερώνει για την έκδοση του Browser.
Σχόλιο: Σε περίπτωση που ο Browser που χρησιμοποιεί ο χρήστης είναι Internet Explorer
με έκδοση μικρότερη από 7, τότε στην μεταβλητή var θα εκχωρηθεί κατάλληλο μήνυμα.
Σχόλιο: Αν όλα είναι έτοιμα, δηλαδή αν έχει γίνει η επικοινωνία Browser- server, ο server
έχει επεξεργαστεί το αίτημα και είναι έτοιμος να στείλει απάντηση τότε θα συμβούν τα
εξής:
44
Μέσα στο div box θα εμφανιστεί το μήνυμα από την getAllResponseHeaders(); η οποία
θα εμφανίσει όλους τους headers του server δηλαδή όλες τις πληροφορίες σχετικά με
την κατάσταση του server.
Μέσα στο div box2 θα εμφανιστεί το μήνυμα που έχει αποθηκευθεί στη μεταβλητή ver.
Στο div head1 θα εμφανιστεί η πληροφορία από την απόκριση του server η οποία είναι
αποθηκευμένη σε φάκελο του server και εντός του txt αρχείου.
Σχόλιο: Γράψαμε μέθοδο open με ορίσματα την επιλογή μεθόδου GET και τη θέση URL
του αρχείου txt.
Σχόλιο:
Δημιουργήσαμε δύο boxes για να εμφανίσουμε ξεχωριστά τα αποτελέσματά μας.
Γράψαμε λοιπόν στο εντός του στοιχείου head μορφοποίηση CSS για το ύψος της
45
γραμμής, το background color, τις διαστάσεις και το padding. Τα δεκαεξαδικής
μορφής χρώματα τα πήραμε από τη σελίδα του w3schools:
http://www.w3schools.com/tags/ref_colorpicker.asp
Σχόλιο:
Ξεκινήσαμε το στοιχείο body δίνοντας css style όπως και στο προηγούμενο
παράδειγμα.
Σχόλιο:
Με αυτές τι γραμμές εμφανίζουμε κατά σειρά τα boxes στα οποία θα εμφανιστούν τα
αποτελέσματα. Σε περίπτωση που είναι επιθυμητό μπορούμε να τοποθετήσουμε τα
boxes σε θέσεις της ιστοσελίδας εφαρμόζοντας τις γνωστές positioning ιδιότητες.
46
Παράδειγμα 3. Χειρισμός πολλών αποτελεσμάτων
Μέχρι τώρα είδαμε σενάρια όπου ο χρήστης ενεργοποιεί συνήθως με ένα event
handler ένα αίτημα για δημιουργία αντικειμένου XMLHttpRequest. Σε αυτή την
υποενότητα θα εξηγήσουμε τι πρέπει να κάνουμε στην περίπτωση όπου ο χρήστης
θέλει να στείλει παραπάνω από μία αιτήσεις.
47
Η πρώτη περίπτωση είναι να δημιουργήσουμε δύο ή περισσότερα buttons η γενικά
περισσότερα από ένα event handlers. Σε κάθε συνάρτηση ενός event handler
μπορούμε να εισαγάγουμε ορίσματα για αρχείο επικοινωνίας και για παραμέτρους που
μπορούν να περάσουν σε αυτό τα αρχείο. Με αυτές τις παραμέτρους μπορούμε ν
ορίσουμε συνθήκες μέσα στο αρχείο php έτσι ώστε να έχουμε διαφορετικά
αποτελέσματα ανάλογα με το button που επιλέγουμε.
2.3 Βήματα για τη δημιουργία της σελίδας HTML εφαρμογής για το Ιταλικό
Εστιατόριο
48
Σχόλιο: Μέχρι εδώ έχουμε δημιουργήσει τη βασική δομή της HTML.
Η function fetch θα δέχεται από τη συνάρτηση που χειρίζεται το onclick event του
button όρισμα για το αρχείο php που βρίσκεται αποθηκευμένο στο server καθώς
επίσης και για την τιμή της επιλογής που θα περάσει στο server και πιο συγκεκριμένα
στο αρχείο php.
Σχόλιο: Μέχρι εδώ έχει γίνει η δημιουργία των αντικειμένων XMLHttpRequest ανάλογα με
την έκδοση. Στη μεταβλητή req θα εκχωρηθεί το αποτέλεσμα του αντικειμένου
XMLHttpRequest.
Σχόλιο: Δημιουργήσαμε στυλ για το στοιχείο body. Αυτό σημαίνει ότι για ό,τι είναι
ορατό στη σελίδα θα εμφανιστεί με τις συγκεκριμένες μορφοποιήσεις εκτός και αν
υπάρξει άλλη ιδιότητα CSS που να το αλλάξει. Για τη συγκεκριμένη σελίδα επιλέξαμε ένα
πράσινο χρώμα από το w3schools color picker που να ταιριάζει με τα λαχανικά της
φωτογραφίας.
50
Γενικά είναι καλή τακτική που ακολουθείται κυρίως από επαγγελματίες να αγοράζουν
φωτογραφίες οι οποίες είναι τραβηγμένες και επεξεργασμένες ειδικά για Web Design.
Για παράδειγμα, αν θέλει μία εταιρεία μία φωτογραφία με λαμπερά πρόσωπα για να
μην χρεωθεί το κόστος μιας παραγωγής φωτογράφησης μπορεί να αγοράσει τα
δικαιώματα της φωτογραφίας. Το ίδιο ισχύει και με τα videos.
Σχόλιο: Ορίσαμε το div με id box για την εμφάνιση των πληροφοριών που θα επιλέξει ο
χρήστης.
51
Σχόλιο: Ολοκληρώσαμε τον κώδικα της σελίδας Html με τα υπόλοιπα buttons τα οποία
θα έχουν επιλογές select με τιμές 2 και 3 για να εμφανιστούν στη σελίδα τα
αποτελέσματα για το μενού της ημέρας καθώς και το ωράριο λειτουργίας.
2.4 Βήματα για τη δημιουργία του αρχείου PHP της εφαρμογής για το
Ιταλικό Εστιατόριο
Στο αρχείο PHP θα περάσουν οι τιμές της παραμέτρου select. Έτσι θα δημιουργηθούν
αντίστοιχα τρεις συνθήκες για να επιστρέψει ο server τα αποτελέσματα που πρέπει.
Σχόλιο: Αν η τιμή της παραμέτρου που θα περάσει στο αρχείο php είναι ίση με 1, τότε
θα εμφανιστεί κατάλληλο μήνυμα. Η $_GET["select"] περιέχει την τιμή της παραμέτρου
select που πέρασε στο αρχείο PHP.
Αν η επιλογή ήταν 1, τότε σημαίνει ότι ο χρήστης έχει ζητήσει τα στοιχεία της
επικοινωνίας και θα εμφανιστούν οι αντίστοιχες πληροφορίες.
52
Σχόλιο: Αν η επιλογή ήταν select=2 τότε σημαίνει ότι ο χρήστης έχει ζητήσει τα στοιχεία
του μενού.
Σχόλιο: Αν η επιλογή ήταν 3 τότε σημαίνει ότι ο χρήστης έχει ζητήσει τα στοιχεία του
ωραρίου του καταστήματος.
Όπου:
foodxxx.php? Θα γράφαμε το όνομα και τη διαδρομή του αρχείου που θα
αλληλεπιδρά η σελίδα μας.
select=xxx Η τιμή της επιλογής που θα περάσει μαζί με την παράμετρο select στο
αρχείο PHP.
53
boxyyyy το όνομα του div στο οποίο θα εμφανιστούν τα δεδομένα που θα
επιστρέψει ο server, έτσι ώστε να δέχεται σαν είσοδο και το όνομα του respdiv. Αυτό
μας δίνει ακόμη περισσότερες επιλογές. Δηλαδή μπορούμε να επιλέγουμε σαν είσοδο
της onclick συνάρτησης και το αρχείο και την παράμετρο για την επιλογή και το σημείο
που θα εμφανιστούν τα δεδομένα που θα επιστρέψει ο sever.
54
ΥΠΟΕΝΟΤΗΤΑ 3. ΔΗΜΙΟΥΡΓΙΑ ΠΟΛΛΑΠΛΩΝ ΑΝΤΙΚΕΙΜΕΝΩΝ
XMLHTTPREQUEST
Σχόλιο
Δημιουργούμε τη συνάρτηση fetch για να τη συνδέσουμε με onclick event handler στο
πρώτο button
56
Σχόλιο: Γράφουμε τις μεθόδους open, send για το αντικείμενο req.
57
Σχόλιο: Γράφουμε CSS για το πρώτο box όπου θα εμφανιστούν τα αποτελέσματα του
req.responseText
Σχόλιο: Γράφουμε CSS για το δεύτερο box όπου θα εμφανιστούν τα αποτελέσματα του
req2.responseText
Σχόλιο: Επιλέγουμε φωτογραφία για το φόντο της σελίδας Html καθώς και ιδιότητες CSS
για το στοιχείο body.
58
Σχόλιο: Ορίζουμε div με id box2 για να εμφανιστούν τα αποτελέσματα της fetch2().
59
Παράδειγμα 5. Δημιουργία πολλαπλών αντικειμένων
Σύνοψη
Μετά την ολοκλήρωση της συγκεκριμένης διδακτικής ενότητας γνωρίζετε ότι μπορούμε:
• να δημιουργούμε συναρτήσεις που δημιουργούν αντικείμενα XMLHttpRequest με
είσοδο ορίσματα για το div της εμφάνισης των αποτελεσμάτων και να τα εμφανίζουμε
σε διαφορετικά boxes,
• με τη μέθοδο GET και τη μέθοδο POST να περάσουμε σε αρχεία του server πάνω
από μία παραμέτρους με τις τιμές τους και να πάρουμε αντίστοιχα αποτελέσματα,
• να δημιουργήσουμε φόρμες με περισσότερα από ένα buttons, και
• να δημιουργήσουμε περισσότερες από μία onclick συναρτήσεις που να
δημιουργούν και να διαχειρίζονται περισσότερα από ένα XMLHttpRequest αντικείμενα.
60
ΒΙΒΛΙΟΓΡΑΦΙΑ
ΔΕ1
• Ballard, Ph. & Moncur, M. (2008) Sams Teach Yourself Ajax, JavaScript, and PHP All
in One, 1st edition, USA: Sams Publishing
• Holzner, S. (2006) Ajax for Dummies, 1st edition, USA: Willey Publishing Inc.
• Riordan, R. (2008), Head First AJAX, 1st edition, USA: O’Reilly Media
• Holdener, A. (2008), AJAX: The Definitive Guide, 1st edition, USA: O’Reilly Media
ΔΕ2
• Ballard,Ph. &Moncur,M. (2008) Sams Teach Yourself Ajax, JavaScript, and PHP All in
One, 1st edition, USA:Sams Publishing
• Holzner, S. (2006) Ajax for Dummies, 1st edition, USA: Willey Publishing Inc.
• Riordan, R. (2008), Head First AJAX, 1st edition, USA:O’Reilly Media
• Holdener, A. (2009), Οδηγός της AJAX, 1st edition, Αθήνα: Εκδόσεις Μόσχος
Γκιούρδας
• Hadlock, K. (2007), Ανάπτυξη Web Εφαρμογών, 1st edition, Αθήνα: Εκδόσεις
Μόσχος Γκιούρδας
61