Documente Academic
Documente Profesional
Documente Cultură
Laborator 10 - AJAX
Laborator 10 - AJAX
02.04.2013
Programare Web
You are here: Program are W eb Laboratoare Laborator 10 - AJAX
Show pagesource
Old revisions
Recent changes
Index
Login
Search
Laborator 10 - AJAX
Obiective: n urma parcurgerii acestui laborator studentul va:
nelege conceptele i protocoalele din spatele AJAX
putea implementa cereri AJAX att folosind vanilla Javascript, ct i jQuery
AJAX
Termenul AJAX descrie o arhitectur pentru aplicaii web bazat pe HTTP scripting i obiectul
XMLHttpRequest. Termenul a fost creat de Jesse James Garret n
eseul su din februarie 2005.
Punctul cheie al acestei abordri este faptul c paginile web nu trebuie rencrcate complet iar datele
interschimbate au de obicei un volum mic. Efectul este o comportare a aplicaiilor web mult mbuntit
din puctul de vedere al experienei utilizatorului.
Table of Contents
Laborator 10 - AJAX
AJAX
Im plem entare AJAX
XMLHTTPRequest
Trim iterea unei cereri cu
XMLHttpRequest
Sam e-origin policy
AJAX n jQ uery
Task uri
Repartizare teme
Catalog PW
Laboratoare
Laborator 01 - Introducere
Laborator 02 - BD in PHP
Laborator 03 - Arrays,
Magic Methods
Laborator 04 - (X)HTML,
CSS
Laborator 05 - Formulare
HTML, Persistena Datelor
Laborator 06 - Securitate I
Laborator 07 - Securitate II
Laborator 08 - JavaScript
Laborator 09 - DOM
scripting
Laborator 10 - AJAX
Laborator 11 - Web
Frameworks
Teme
Tema 01 - API pentru BD
Tema 02 - Template System
& Controller
Tema 03 - Generator de
formulare
Tema 04 - Tree Web UI
Login
AJAX poate fi formalizat ntr-un mecanism RPC (spre exemplu), ns n cele mai multe cazuri se prefer
soluii mai simple i mai rapide. De multe ori, XML nici mcar nu mai este folosit, preferndu-se formate
mai lightweight (JSON sau chiar plain-text).
Implementare AJAX
XMLHTTPRequest
Obiectul XMLHTTPRequest a fost introdus pentru a se putea controla protocolul HTTP din Javascript
sincron i asincron, fr a se apela la artificii de genul <iframe>-urilor. Din pcate, obiectul nu a fost
niciodat standardizat i de aceea ntlnim diferite implementri n diferite browsere (IE, of course).
// normal browser (IE 7 included)
var request = new XMLHttpRequest();
// IE 5 or 6
var request = new ActiveXObject("Msxml2.XMLHTTP");
De obicei, se creaz metode care abstractizeaz aceste diferene de instaniere. Un exemplu este
prezentat mai jos:
var HTTP = {
file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2010%20-%20AJAX.htm
1/5
Laborator 10 - AJAX
02.04.2013
// Create
//
//
//
//
//
newRequest: function() {
if (HTTP._factory != null) return HTTP._factory();
for(var i = 0; i < HTTP._factories.length; i++) {
try {
var factory = HTTP._factories[i];
var request = factory();
if (request != null) {
HTTP._factory = factory;
return request;
}
}
catch(e) {
continue;
}
}
Observatii:
exemplul de mai sus aplica o varianta a design pattern-ului Singleton pentru a obtine o cerere
XMLHttp; (foarte asemanator cu SingletonDB, de la tema1);
observati membrul _factory al clasei HTTP: acesta este initial null, insa va retine un obiect
de tip XMLHttpRequest;
observati functia newRequest:
daca _factory a fost creat, functia il intoarce;
altfel, se incearca succesiv apelurile retinute in vectorul _factories; in functie de browser,
unul din aceste apeluri va avea succes (altfel, se va arunca exceptie); rezultatul apelului
care a avut succes este retinut in _factory, si intors de functie;
Cereri sincrone
O cerere sincron se efectueaz atunci cnd cel de-al treilea parametru al metodei open este
false. Acest lucru determin blocarea execuiei de cod Javascript pn n momentul
primirii rspunsului de la server. Secvena de cod de mai jos exemplific o cerere sincron:
var request = HTTP.newRequest();
request.open("GET", url, false); //prepare a HTTP request using GET method, to 'url'; request type is synchronous;
request.setRequestHeader("User-Agent", "XMLHttpRequest"); //set header fields
request.setRequestHeader("Accept-Language", "en");
request.setRequestHeader("If-Modified-Since", lastRequestTime.toString());
request.send(null);//send an empty request; the request is blocking;
file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2010%20-%20AJAX.htm
2/5
Laborator 10 - AJAX
02.04.2013
Observatii:
din cauza ca cererea este sincrona, apelul send din exemplul de mai sus este blocant;
functia va intoarce doar dupa primirea raspunsului de la server;
apoi, se poate inspecta codul HTTP (folosind membrul status), continutul si/sau header-ul
raspunsului;
Cereri asincrone
In momentul in care raspunsul unei cereri HTTP realizata folosind XMLHttpRequest intarzie, sau
ajunge mai greu (din diverse motive), pagina se blocheaza (din cauza apelului blocant al send).
Acest lucru poate fi neplacut. Tocmai de aceea, din punct de vedere al experienei utilizatorului,
este mult mai bine ca aceste cereri s fie non-blocante (asincrone). In aceasta situatie, se
pune problema depistarii momentului in care cererea este primita (si executarea unei actiuni
corespunzatoare, pe baza raspunsului).
Pentru aceasta avem la dispozitie urmatoarele:
readystate: este o proprietate a obiectului XMLHttpRequest, si contine starea cererii
curente:
0: open() nc nu a fost apelat
1: open() a fost apelat, dar send() nc nu a fost apelat
2: send() a fost apelat, dar serverul nu a rspuns nc
3: se primesc date de la server (atenie, implementrile difer ntre browsere aici)
4: toate datele au fost primite de la server
onreadystatechange: este un eveniment; i se atribuie o functie, care este apelata de
cate ori starea cererii se modifica;
Secvena de cod de mai jos prezint o cerere asincron (AJAX):
// Create an XMLHttpRequest using the utility defined earlier
var request = HTTP.newRequest();
// Make a GET request for a given URL. We don't pass a third argument,
// so this is an asynchronous request
request.open("GET", url);
Same-origin policy
Aceast politic de securitate restricioneaz coninutul cu care poate interaciona codul Javascript la
orginea documentului din contextul cruia se execut scriptul. Originea documentului este definit ca o
combinaie ntre protocol, host i port (determinate prin URL). Este important s reinei c orginea
file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2010%20-%20AJAX.htm
3/5
Laborator 10 - AJAX
02.04.2013
este legat de document i nu de script: putei avea un script ncrcat de pe alt domeniu din care s
efectueze cereri ctre originea documentului vostru. Se pot face excepii pentru cererile ntre
subdomenii dac se folosete proprietatea domain a obiectului document.
Aici gsii o explicaie mai
detaliat.
Aceast implementare de securitate este necesar pentru a preveni, printre altele, furtul de informaie.
Gndii-v la posibilitatea ca un site care ruleaz cod maliios s deschid i s aib acces la un alt tab
n care avei afiate informaii sensibile.
n cazul particular al folosirii obiectului XMLHttpRequest, s-ar referi la faptul c se pot face cereri doar
peste HTTP i doar ctre locul din care originat documentul din care a pornit cererea. Totui, cererile
AJAX cross-domain pot avea o utilitate foarte mare - nu ar mai fi nevoie s se fac proxying server-side
pentru a putea servi coninut de pe alte domenii. Soluia la care s-a ajuns este folosirea headerelor
Origin: [domeniu emitent] de ctre cel ce emite cererea i Access-Control-Allow-Origin: [* /
lista acceptat de domenii, separate prin ,]. Dac headerul Access-Control-Allow-Origin
conine domeniul emitent (sau *) atunci browserul primete i interpreteaz rspunsul. Mai multe detalii
putei vedea aici.
AJAX n jQuery
jQuery ofer metode care faciliteaz efectuarea aciunilor AJAX. Metodele sunt bine documentate i
demonstrate pe site-ul cu documentaia.
Este mult mai facil folosirea jQuery dect crearea de obiecte care s abstractizeze XMLHttpRequest
etc. Trebuie ns avut n vedere faptul c fr o nelegere bun a protocolului HTTP, a limbajului i a
modului de funcionare a browserelor este mult mai greu s scriei cod de calitate. Exemplul de mai jos
demonstreaz folosirea jQuery pentru a face cereri peste HTTP:
// on page load
$(document).ready(function () {
// reference a button
var button = $(...);
// do an ajax request
$.ajax({
// request method
type: 'GET',
// error callback
error: function(){
alert('Error loading HTML document');
},
Taskuri
Descrcai arhiva de
1. n pagina task1.html, adugai tagurilor span care au setat clasa tooltip urmtoarea
funcionalitate:
la mouseover, se efectueaz o cerere AJAX (post) la script/wordJSON.php
se trimite un JSON de forma: '{ word : test }'
se primete definiia cuvntului, tot JSON: '{ definition : definition for test }'
definiia va fi afiat undeva n pagin (orice variant e acceptabil, mai puin cele care
folosesc document.write()) (4p)
2. n pagina task2.html, adugai tagurilor span care au setat clasa tooltip urmtoarea
funcionalitate:
la mouseover, se efectueaz o cerere AJAX (post) la script/wordXML.php
se trimite un XML de forma:
<content>
<word>test</word>
</content>
file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2010%20-%20AJAX.htm
4/5
Laborator 10 - AJAX
02.04.2013
definiia este afiat n dreptul cursorului (la fel cum se ntmpl la tooltipurile default din
browser). (4p)
3. La fel ca la punctul 1, ns folosind jQuery. (2p)
4. La fel ca la punctul 2, ns folosing jQuery. (2p)
Bonus:
5. Implementai unul sau ambele taskuri de jQuery ca pluginuri. (2p)
Show pagesource
Old revisions
file:///D:/Dropbox/0.Cursuri%20Clubcisco/0%20facultate%20addon%20may/a4s2/c1%20programare%20web/labs/Laborator%2010%20-%20AJAX.htm
Back to top
5/5