Horváth Győző
Egyetemi adjunktus
1117 Budapest, Pázmány Péter sétány 1/c., 2.408-as szoba
Tel: (1) 372-2500/8469
horvath.gyozo@inf.elte.hu
open("method", "URL", async)
: hívási paraméterek beállításasend([data])
: kérés küldése (opc. data a kéréstörzsben)abort()
: kérés leállítása.getAllResponseHeaders()
: HTTP fejlécek visszaadása szövegkéntgetResponseHeader("fejléc")
: adott fejléc értékesetRequestHeader("fejléc", "érték")
: kérésfejléc beállításareadyState
: a kérés aktuális státusza
0
= uninitialized1
= loading2
= loaded3
= interactive (néhány adat érkezett)4
= completestatus
: a HTTP válasz státuszkódja, pl. 200statusText
: a HTTP válasz státusza, pl. “OK”responseText
: a szerverről érkezett szöveges válaszresponseXML
: ha a válasz XML dokumentum volt, akkor annak XML DOM dokumentuma.responseType
: a válasz típusának beállítása.readystatechange
: a readyState
állapot változásainál hívódik megprogress
: a feltöltés állapotáról ad információtabort
error
load
loadend
loadstart
XMLHttpRequest.upload
objektumon is működik
Kódevolúció
<?php
var_dump($_GET);
var_dump($_POST);
$ido = date('Y.m.d. G:i:s');
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>AJAX példa</title>
</head>
<body>
<form action="pingphp.php" method="get">
<input type="submit" id="gomb" value="Ping">
</form>
<hr>
<div id="output">
<?php echo $ido; ?>
</div>
</body>
</html>
ping.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>AJAX példa</title>
<script type="text/javascript" src="ping.js"></script>
</head>
<body>
<input type="button" id="gomb" value="Ping">
<hr>
<div id="output"></div>
</body>
</html>
ping.php
var_dump($_GET);
var_dump($_POST);
echo date('Y.m.d. G:i:s');
ping.js
//Segédfüggvények
function $(id) {
return document.getElementById(id);
}
//Oldal betöltésekor lefutó függvény
function init() {
$('gomb').onclick = ping;
}
window.addEventListener('load', init, false);
//A gomb lenyomásakor lefutó függvény
function ping() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'ping.php', false);
xhr.send(null);
$('output').innerHTML = xhr.responseText;
}
readyState
tulajdonság változikreadystatechange
eseménykezelőt kell írnunklet xhr;
function ping() {
xhr = new XMLHttpRequest();
xhr.open('GET', 'ping.php', true);
xhr.addEventListener('readystatechange', pingKezelo, false);
xhr.send(null);
}
function pingKezelo() {
if (xhr.readyState == 4 && xhr.status == 200) {
$('output').innerHTML = xhr.responseText;
}
}
Globális xhr objektum → problémás → paraméter
Névtelen függvény segítségével
function ping() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'ping.php', true);
xhr.addEventListener('readystatechange', function () {
pingKezelo(xhr);
}, false);
xhr.send(null);
}
function pingKezelo(xhr) {
if (xhr.readyState == 4 && xhr.status == 200) {
$('output').innerHTML = xhr.responseText;
}
}
A lényegi részt még jobban leválasztva
function ping() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'ping.php', true);
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState == 4 && xhr.status == 200) {
pingKezelo(xhr);
}
}, false);
xhr.send(null);
}
function pingKezelo(xhr) {
$('output').innerHTML = xhr.responseText;
}
Kérésszöveg az URL-ben
function ping() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'ping.php?alma=piros', true);
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState == 4 && xhr.status == 200) {
pingKezelo(xhr);
}
}, false);
xhr.send(null);
}
function pingKezelo(xhr) {
$('output').innerHTML = xhr.responseText;
}
function ping() {
const xhr = new XMLHttpRequest();
xhr.open('POST', 'ping.php?alma=piros', true);
xhr.setRequestHeader(
'Content-Type', 'application/x-www-form-urlencoded');
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState == 4 && xhr.status == 200) {
pingKezelo(xhr);
}
}, false);
xhr.send('korte=sarga');
}
function pingKezelo(xhr) {
$('output').innerHTML = xhr.responseText;
}
function ping() {
const xhr = new XMLHttpRequest();
xhr.open('POST', 'ping.php?alma=piros', true);
xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
pingKezelo(xhr);
} else {
console.log('Hiba');
}
}
}, false);
xhr.send('korte=sarga');
}
ajax()
függvényAlapértelmezett értékek
function ajax(opts) {
let mod = opts.mod || 'GET',
url = opts.url || '',
getadat = opts.getadat || '',
postadat = opts.postadat || '',
siker = opts.siker || function(){},
hiba = opts.hiba || function(){};
mod = mod.toUpperCase();
url = url+'?'+getadat;
const xhr = new XMLHttpRequest();
xhr.open(mod, url, true);
if (mod === 'POST') {
xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
}
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
siker(xhr, xhr.responseText);
} else {
hiba(xhr);
}
}
}, false);
xhr.send(mod == 'POST' ? postadat : null);
return xhr;
}
function ping() {
ajax({
mod: 'post',
url: 'ping.php',
getadat: 'alma=piros',
postadat: 'korte=sarga',
siker: pingKezelo
});
}
function pingKezelo(xhr, text) {
$('output').innerHTML = text;
}
function ping() {
ajax({
mod: 'post',
url: 'ping.php',
getadat: 'alma=piros',
postadat: 'korte=sarga',
siker: function (xhr, text) {
$('output').innerHTML = text;
}
});
}
ajax()
ajax()
függvény paraméterezése###Válasz (output)
Adott gyümölcsök listája, jelenítsük meg felsorolásként.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>AJAX példa</title>
<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript" src="format.js"></script>
</head>
<body>
<input type="button" id="btnText" value="Text">
<input type="button" id="btnJSON" value="JSON">
<input type="button" id="btnHTML" value="HTML">
<input type="button" id="btnXML" value="XML">
<input type="button" id="btnScript" value="Szkript">
<hr>
<div id="output"></div>
</body>
</html>
alma,körte,szilva,barack,eper,málna,szeder
function lista(t) {
return '<ul><li>' + t.join('</li><li>') + '</li></ul>';
}
function text() {
ajax({
url: 'gyumolcs.txt',
siker: function (xhr, text) {
console.log(text);
const t = text.split(',');
$('output').innerHTML =
(new Date()).toLocaleString() + lista(t);
}
});
}
[
"alma",
"körte",
"szilva",
"barack",
"eper",
"málna",
"szeder"
]
function json() {
ajax({
url: 'gyumolcs.json',
siker: function (xhr, text) {
const json = eval(text);
// vagy
const json = JSON.parse(text);
console.log(json);
$('output').innerHTML =
(new Date()).toLocaleString() + lista(json);
}
});
}
eval
JSON.parse
<ul>
<li>alma</li>
<li>körte</li>
<li>szilva</li>
<li>barack</li>
<li>eper</li>
<li>málna</li>
<li>szeder</li>
</ul>
function html() {
ajax({
url: 'gyumolcs.html',
siker: function (xhr, text) {
const html = text;
console.log(html);
$('output').innerHTML =
(new Date()).toLocaleString() + html;
}
});
}
<?xml version="1.0" encoding="UTF-8"?>
<gyumolcsok>
<gyumolcs>alma</gyumolcs>
<gyumolcs>körte</gyumolcs>
<gyumolcs>szilva</gyumolcs>
<gyumolcs>barack</gyumolcs>
<gyumolcs>eper</gyumolcs>
<gyumolcs>málna</gyumolcs>
<gyumolcs>szeder</gyumolcs>
</gyumolcsok>
function xml() {
ajax({
url: 'gyumolcs.xml',
siker: function (xhr, text) {
const xmldom = xhr.responseXML;
console.log(xmldom);
const gyumolcsok = xmldom.getElementsByTagName('gyumolcs');
const t = [];
for (let i = 0; i < gyumolcsok.length; i++) {
t.push(gyumolcsok[i].firstChild.nodeValue);
};
$('output').innerHTML =
(new Date()).toLocaleString() + lista(t);
}
});
}
xhr.responseXML
responseXML
az XML dokumentum értelmezett DOM fáját tartalmazza (ld. HTML DOM)function getGyumolcsok() {
return [
"alma",
"körte",
"szilva",
"barack",
"eper",
"málna",
"szeder"
];
}
function script() {
ajax({
url: 'gyumolcs.js',
siker: function (xhr, text) {
console.log(text);
eval(text);
const t = getGyumolcsok();
$('output').innerHTML =
(new Date()).toLocaleString() + lista(t);
}
});
}
gyumolcs.php
$gyumolcsok = array(
"alma",
"körte",
"szilva",
"barack",
"eper",
"málna",
"szeder",
);
echo json_encode($gyumolcsok);
xhr.responseType
és xhr.response
használata
const xhr = new XMLHttpRequest();
xhr.onload = function(e) {
const arraybuffer = xhr.response; // not responseText
/* ... */
}
xhr.open("GET", url);
xhr.responseType = "arraybuffer";
xhr.send();
http://www.omdbapi.com/?s=hobbit
{
"Search":[
{
"Title":"The Hobbit: An Unexpected Journey",
"Year":"2012",
"imdbID":"tt0903624",
"Type":"movie"
},
{
"Title":"The Hobbit: The Desolation of Smaug",
"Year":"2013",
"imdbID":"tt1170358",
"Type":"movie"
},
{
"Title":"The Hobbit",
"Year":"1977",
"imdbID":"tt0077687",
"Type":"movie"
}
]
}
http://www.omdbapi.com/?s=hobbit&callback=feldolgoz
feldolgoz({"Search":[{"Title":"The Hobbit: An Unexpected Journey","Year":"2012","imdbID":"tt0903624","Type":"movie"},{"Title":"The Hobbit: The Desolation of Smaug","Year":"2013","imdbID":"tt1170358","Type":"movie"},{"Title":"The Hobbit","Year":"1977","imdbID":"tt0077687","Type":"movie"}]});
function omdbHivas(keresett) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.omdbapi.com/?s='+keresett+'&callback=feldolgoz';
document.body.appendChild(script);
}
function feldolgoz(json) {
console.log(json);
}
fetch
const myImage = document.querySelector('img');
fetch('flowers.jpg')
.then(function(response) {
return response.blob();
})
.then(function(myBlob) {
const objectURL = URL.createObjectURL(myBlob);
myImage.src = objectURL;
});
ajax()
segédfüggvény