Ajax (Asynchronous JavaScript and XML) - Luento 15
- Luentotaltiointi
- Mikä on Ajax?
- Mitä Ajaxilla voi tehdä
- Miten Ajax-ohjelmia tehdään
- XMLHTTPRequest-objekti
- JavaScript-kirjastot
- Ajax-esimerkkejä
- Ajax-sovelluksien virheitä ja ongelmia
- Lisätietoa
Perehdymme dynaamisten (DHTML) WWW-sovellusten tuottamiseen Javascriptin ja asynkronisten XMLHTTP-kutsujen avulla.
Luentotaltiointi
- sovellukset15.wmv 58M
- sovellukset15.mp3 16M
- sovellukset15_xvid.avi 109M
Mikä on Ajax?
- Ajax on lyhenne sanoista Asynchronous Javascript and XML
- Ajax on vain yleisnimitys monen vanhan tekniikan yhteiskäytölle:
- Javascript (Ecmascript)
- XML
- XHTML
- CSS
- XMLHTTPRequest
- DOM
Mitä Ajaxilla voi tehdä
- Ajaxin avulla muutetaan perinteinen WWW-sovelluksen toimintatapa muistuttamaan paremmin tavallisia tietokoneohjelmia.
- Ajax-sovellus muokkaa käyttäjän näkemää WWW-sivua dynaamisesti ilman, että käyttäjän tarvisi navigoida sivulta toiselle.
- Voi teettää www-palvelimella asioita, joita pelkällä Javascriptillä on hankalaa tehdä. Esim. voi kutsua mitä tahansa PHP/Perl/Python tms. skriptiä.
- Voi tarkistaa lomakkeen syötteet heti eikä vasta kun käyttäjä on täyttänyt koko lomakkeen.
- Lomakkeen sisältöä voidaan muuttaa dynaamisesti käyttäjän syötteiden perusteella.
Tunnettuja Ajax-sovelluksia
Myös suomalaisissa palveluissa osataan jo käyttää Ajaxia:
Miten Ajax-ohjelmia tehdään
- Kirjoitetaan normaali Javascript-sovellus, joka tarvittaessa kutsuu WWW-palvelinta XMLHTTPRequestin avulla.
- XMLHTTPRequest-kutsua ei ole standardoitu joten selainten toteutustavoissa on suuria eroja. On syytä käyttää kirjastoa, joka piilottaa erot. Esim. Prototype.
- XMLHTTPRequest-kutsut voidaan osoittaa vain samalle www-palvelimelle, mistä Javascript-ohjelma haettiin.
- Ohjelman suoritus ei pysähdy XMLHTTPRequest-kutsun suorittamisen ajaksi vaan kutsu suoritetaan asynkronisesti ohjelman taustalla
- XMLHTTPRequest-kutsun vastauksen saavuttua suoritetaan haluttu Javascript-funktio.
XMLHTTPRequest-objekti
XMLHTTPRequest-objektin ominaisuudet kuvataan esim. W3C:n The XMLHttpRequest Object - draft-dokumentissa.
Tärkeimmät metodit:
| abort() | Keskeytä menossa oleva pyyntö |
| setRequestHeader("nimi", "arvo") | Asettaa pyynnön otsikkotietoja |
| getResponseHeader("nimi") | Palauttaa yhden halutun http-otsakkeen arvon |
| getAllResponseHeaders() | Palauttaa kaikki pyynnölle palautetut http-otsakkeet |
| open("method", "URL"[, async[, "tunnus"[, "salasana"]]]) | Asettaa metodin (POST|GET|HEAD etc.), osoitteen ja mahdollisen käyttäjätunnuksen, salasanan ja tehdäänkö pyyntö asynkronisesti vai ei |
| send(data) | Lähettää pyynnön ja mahdollisen datan |
| onreadystatechange | Tapahtumankäsittelijä |
| readyState | Objektin tila
|
| responseText | Palautettu data merkkijonona |
| responseXML | Palautettu data DOM-yhteensopivana XML-dokumenttina |
| status | HTTP-statuskoodi (kts. luento 5) |
| statusText | HTTP-statuskoodin mukana tullut mahdollinen teksti esim. virheilmoitus |
Huomioitavaa
Muutama asia on huomioitava ennenkuin XMLHttpRequest toimii oikein:
GET
GET-metodia käytettäessä parametrit laitaa open-metodin url-parametriin.
Käytä escape-funktiota tai muuta vastaavaa funktiota ääkkösten yms. korjaamiseksi.
Jos mitään tietoa ei lähetetä ja käytössä on GET-metodi, niin kutsu send(null).
POST
POST-metodia käytettäessä send-metodille annettava data on oltava querystring-muodossa:
nimi=arvo&toinen=arvo&kolomas=jotain
Käytettäessä POST-metodia täytyy mediatyyppi määrätä seuraavalla tavalla:
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
Jos mitään tietoa ei lähetetä ja käytössä on POST-metodi, niin kutsu send("").
Vasteen käsittely
Tapahtumankäsittelijässä on tarkistettava readyState-ominaisuudesta mikä on pyynnön vaihe ja status-attribuutista mikä on vasteen statuskoodi.
Kun nämä ovat ok, niin data saadaan responseText tai responseXML-attribuuteista.
responseXML
Jos vaste halutaan XML:nä, on huomioitava seuraavat asiat:
- palvelimen on palautettava vaste
text/xml-otsikkotiedoilla- muutoin responseXML:ssä ei ole mitään.
- PHP:ssä tämä onnistui header-funktiolla:
header('Content-type: text/xml; charset=ISO-8859-1');
- Normaali <xml-deklaraatio vaaditaan, muista kertoa encoding.
- Juurielementtiin on määritettävä nimiavaruus
xmlns="http://www.w3.org/1999/xhtml"jos XML:n osa halutaan upottaa DOM:n avulla XHTML-dokumenttiin. - Varsinainen juurielementti saadaan
requestolio.responseXML.documentElement. Tämä pitää liittää dokumenttiin document.importNode-funktiolla ennen upottamista. - Internet Explorerilla upottaminen DOM:in avulla ei toimi. Upotus on tehtävä ResponseText-ominaisuuden avulla.
XMLHttpRequestien debuggaus
Pyynnöt ja vasteet saa näkyviin esim. Firebugin Console-ikkunasta.
JavaScript-kirjastot
- Javascriptin tuki ja toimivuus vaihtelee valitettavasti selaimittain
- Comparison of layout engines - Wikipedia
- Erityisesti IE6:ssa ei ole natiivia XMLHttpRequest-objektia tarjolla vaan se on luotava ActiveXObject:ina.
- Kannattaa ottaa käyttöön jokin javascript-kirjasto, joka piilottaa nämä eroavaisuudet, esim. Prototype-kirjasto.
- Lisäksi löytyy erilaisia kirjastoja, jotka tarjoavat mm. monipuolisia www-pohjaisia käyttöliittymäkomponentteja, esim. Scriptaculous.
Prototype on suosittu Javascript-kirjasto, jonka avulla voidaan tehdä eri selaimilla toimivaa Javascriptiä. Siinä on tuki myös tuki erilaisille Ajax-operaatioille.
Tapahtumien rekisteröinti
window.onload = function() {
Event.observe('napin_id', 'click', tee_operaatiot);
}
Ajax-operaatiot
Onnistuu prototypen Ajax-oliolla:
new Ajax.Request('hae_dataa.php', {
onSuccess: paivita_sivu
});
Tapahtuman käsittely esim.
function paivita_sivu(transport) {
if (transport.status == 200) {
var vanhempi = $('elementin_id').parentNode;
$('elementin_id').remove();
if (document.importNode) {
var uusinode = document.importNode(transport.responseXML.documentElement);
vanhempi.appendChild(uusinode);
// IE ei vain osaa
} else {
new Insertion.Bottom(vanhempi, transport.responseText);
}
}
}
GET-metodi parametreilla:
escape muuntaa merkkijonon URL-enkoodatuksi ISO Latin -heksamerkkikoodiksi.
POST-metodin käyttö:
new Ajax.Request('hae_dataa.php', {
method: 'post',
parameters: Form.serialize($('lomakkeen_id'), true),
onSuccess: paivita_sivu
});
Serialize käyttää encodeURIComponent-funktiota, joka muuttaa merkin vastaamaan sen UTF-8-koodia. Tämä pitää muuttaa palvelimella takaisin ISO-8859-1-merkistöön, jos sitä halutaan käyttää. Esim. PHP:ssa:
iconv("UTF-8", "ISO-8859-1", $_REQUEST['haku'])
Ajax-esimerkkejä
- Lähdekoodit
- XMLHttpRequest-testejä: xmlhttptest.xhtml, testi.js, testi.php, testi2.php
- Rekisteröitymislomake: lomake.xhtml, lomake.css, rek.js, onko_tunnusta.php, hae_postitoimipaikka.php
- Prototype-kirjaston saa http://www.prototypejs.org/
- Lomaketta ja muita esimerkkejä tarkastellaan vielä luennolla 16
Ajax-sovelluksien virheitä ja ongelmia
- Selaimen back-painike ei toimi enää odotetulla tavalla
- Selainhistorian takaisinsaamiseksi on olemassa kikkoja.
- Esim. käytetään eri tiloille erilaista URL:in #ankkuria.
- Kirjanmerkkien tekeminen on ongelmallista
- Toimintojen vasteaika voi olla windows-sovelluksiin tottuneelle liian pitkä.
- Käyttäjälle pitää visuaalisesti vihjata, että nyt täytyy odottaa.
- Esteettömyys - sovelluksen pitää toimia myös ilman javascriptiä
- Ajax-sovellus on myös hankalasti hakurobottien indeksoitavissa.
- Making Ajax Work with Screen Readers
- Accessible Web 2.0 Applications with WAI-ARIA
- Linkit muuttavat sovelluksen tilaa
- Käyttäjä odottaa linkin vievän vain paikasta toiseen.
- Liian paljon Javascript-koodia aiheuttaa selaimen hidastumista.
- Kehitetään uusia käyttöliittymäkikkoja, jotka eivät ole käytettäviä.
- Tietoturva
- Huomaa, että XMLHttpRequest voi kutsua vain sitä palvelinta, josta Javascript-tiedosto on ladattu.
- Ei esim. SQL:ää, salasanoja yms. Javascript-tiedostoihin!
Lisätietoa
Linkkejä javascript-kirjastoihin ja Ajax-artikkeleihin.
Javascript-kirjastoja
- Javascript-kirjastoja:
- Prototype
- MochiKit
- Scriptaculous - pohjautuu Prototypeen
- Open Rico - pohjautuu Prototypeen
- Dojo Toolkit
- Yahoo! UI Library
- Google Web Toolkit - Java->Javascript-kääntäjä
- DWR
- jQuery - kompakti js-kirjasto
- mootools - kompakti js-kirjasto
- Koottuja listoja erilaisista javascript-kehitysympäristöistä
AJAX-artikkeleita
- Mastering Ajax, Part 1: Introduction to Ajax
- Mastering Ajax, Part2
- Dynamic HTML and XML: The XMLHttpRequest Object
- Ajax Matters
- Ajax: A New Approach to Web Applications Artikkeli josta Ajax-hype alkoi
- Ajax (programming)
- Ajaxian
- Ajax Patterns
- SAJAX
- Ajax Mistakes
- XMLHTTPRequest & Ajax Working examples
- Very Dynamic Web Interfaces
- AJAX and Accessibility
- Why Ajax Sucks (Most of the Time)
- Basic AJAX examples
- Ajax Tutoria: Ajax What Is It Good For?
- Introducing JSON
- A Simpler Ajax Path
- Getting Started with Ajax
- Rasmus' 30 second AJAX Tutorial
- Rich Ajax slide shows with DHTML and XML
- AJAX Applications vs Server Load?
- AJAX/DHTML Tutorial: Should I Render My UI On The Server or the Client
- 10 Places You Must Use Ajax
- XMLHTTP
- The XMLHttpRequest Object - W3C Working Draft 05 April 2006
- The SVG Terminal
- Suckerfish HoverLightbox
- Document Object Model (DOM) Level 3 Load and Save Specification


Käyttäjien kommentit