Diferència entre revisions de la pàgina «JQUERY - AJAX»
(→Exercicis) |
(→Solucions) |
||
(47 revisions intermèdies per 2 usuaris que no es mostren) | |||
Línia 1: | Línia 1: | ||
== Jquery i AJAX == | == Jquery i AJAX == | ||
− | + | ||
+ | '''VIDEOTUTORIAL''' | ||
+ | |||
+ | https://youtu.be/yzhdVgxJbrQ | ||
+ | |||
+ | |||
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son: | jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son: | ||
*$.get() | *$.get() | ||
Línia 30: | Línia 35: | ||
// la resposta es pasada com argument a la funció | // la resposta es pasada com argument a la funció | ||
success : function(json) { | success : function(json) { | ||
− | $(' | + | $('h1').text(json); |
− | |||
− | |||
}, | }, | ||
Línia 55: | Línia 58: | ||
|- | |- | ||
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat. | | async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat. | ||
+ | |- | ||
+ | | jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta. | ||
+ | |- | ||
+ | | textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o "parseerror". | ||
+ | |- | ||
+ | | errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”. | ||
|- | |- | ||
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats. | | beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats. | ||
Línia 87: | Línia 96: | ||
|} | |} | ||
− | === | + | === Dreceres === |
− | + | Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi: | |
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]''' | *'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]''' | ||
Realitza una petició GET a una URL proveïda. | Realitza una petició GET a una URL proveïda. | ||
<source lang="java"> | <source lang="java"> | ||
− | + | $("button").click(function () { | |
− | + | $.get("./datos.php?name=julio&city=valencia", function (data, status) { | |
− | + | alert("Data: " + data + "\nStatus: " + status); | |
− | + | }); | |
− | + | }); | |
</source> | </source> | ||
Línia 119: | Línia 128: | ||
<source lang="java"> | <source lang="java"> | ||
− | $("button").click(function(){ | + | $("button").click(function () { |
− | + | $.post("datos.php", { | |
− | + | nom: "Julio", | |
− | + | ciutat: "Valencia" | |
− | + | }, | |
− | + | function (data, status) { | |
− | + | alert("Data: " + data + "\nStatus: " + status); //data muestra los datos recibidos y muestra el estado | |
− | + | }); | |
− | + | }); | |
</source> | </source> | ||
Línia 133: | Línia 142: | ||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
− | if(isset($_POST[" | + | if(isset($_POST["nom"]) && isset($_POST["ciutat"])){ |
− | $nom = $_POST[" | + | $nom = $_POST["nom"]; |
− | $cit = $_POST[" | + | $cit = $_POST["ciutat"]; |
echo $nom . $cit; | echo $nom . $cit; | ||
exit; | exit; | ||
Línia 147: | Línia 156: | ||
<source lang="java"> | <source lang="java"> | ||
− | $("button").click(function(){ | + | $("button").click(function () { |
− | + | $.getScript("demo_ajax_script.js"); | |
− | + | }); | |
Línia 168: | Línia 177: | ||
Els mètodes han de tenir els següents arguments, en ordre: | Els mètodes han de tenir els següents arguments, en ordre: | ||
− | *url | + | *''url'' |
+ | |||
La URL on es realitzarà la petició. El seu valor és obligatori. | La URL on es realitzarà la petició. El seu valor és obligatori. | ||
− | *parámetres | + | *''parámetres'' |
+ | |||
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&baz=bim). | La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&baz=bim). | ||
Nota: Aquesta opció no és correcte per al mètode $.getScript. | Nota: Aquesta opció no és correcte per al mètode $.getScript. | ||
− | *success callback | + | *''success callback'' |
+ | |||
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició. | Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició. | ||
− | *data type | + | *''data type'' |
+ | |||
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional. | El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional. | ||
− | |||
Línia 190: | Línia 202: | ||
<source lang="java"> | <source lang="java"> | ||
− | function | + | $("button").click(function () { |
− | { | + | $.getJSON("datos.php", { |
− | + | "nombre": "Julio", | |
− | + | "apellido": "Noguera" | |
− | + | }) | |
− | } | + | .done(function (data, textStatus, jqXHR) { |
+ | if (console && console.log) { | ||
+ | console.log("La solicitud se ha completado correctamente."); | ||
+ | console.log(data); //devuelve objeto del servidor | ||
+ | console.log(textStatus); //devuelve 'success' | ||
+ | console.log(jqXHR); //objeto AJAX | ||
+ | } | ||
+ | }) | ||
+ | .fail(function (jqXHR, textStatus, errorThrown) { | ||
+ | if (console && console.log) { | ||
+ | console.log("ha fallado" + textStatus); | ||
+ | } | ||
+ | |||
+ | }); | ||
+ | }); | ||
+ | </source > | ||
+ | |||
+ | //datos.php | ||
+ | <source lang="java"> | ||
+ | <?php | ||
+ | $jsondata = array(); | ||
+ | |||
+ | if( isset($_GET['nombre']) ) { | ||
+ | |||
+ | if( $_GET['nombre'] == 'julio' ) { | ||
+ | |||
+ | $jsondata['success'] = true; | ||
+ | $jsondata['message'] = 'Hola! El valor recibido es correcto.'; | ||
+ | |||
+ | } else { | ||
+ | |||
+ | $jsondata['success'] = false; | ||
+ | $jsondata['message'] = 'Hola! El valor recibido no es correcto.'; | ||
+ | |||
+ | } | ||
− | + | //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo | |
− | + | header('Content-type: application/json; charset=utf-8'); | |
− | + | echo json_encode($jsondata); | |
− | + | exit(); | |
− | |||
− | |||
} | } | ||
− | </source > | + | </source> |
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] === | === [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] === | ||
Línia 251: | Línia 295: | ||
== Exercicis == | == Exercicis == | ||
− | === FOTOS | + | <!-- |
+ | |||
+ | === FOTOS === | ||
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás < y adelante > mostrando su descripción e imágenes. Además de existir un breve buscador por título. | Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás < y adelante > mostrando su descripción e imágenes. Además de existir un breve buscador por título. | ||
Línia 257: | Línia 303: | ||
=== Suma === | === Suma === | ||
− | Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de "processant ..." o pots crear la teva [ | + | Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de "processant ..." o pots crear la teva |
− | + | [https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. | |
+ | |||
+ | |||
+ | :[[exercici ajax post]] | ||
=== Missatge === | === Missatge === | ||
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor. | Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor. | ||
− | + | ||
+ | :[[exercici missatge alerta]] | ||
+ | |||
+ | === Fitxer === | ||
+ | |||
+ | Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes. | ||
+ | |||
+ | <source lang="php"> | ||
+ | $('body').load( "http://hosting.infomerce.es/~jnoguera/jajax/merce.txt" ); | ||
+ | </source> | ||
===Taula Multiplicar I=== | ===Taula Multiplicar I=== | ||
Línia 269: | Línia 327: | ||
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure. | Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure. | ||
− | + | ||
+ | :[[solucio_multiplicar]] | ||
===Taula Multiplicar II=== | ===Taula Multiplicar II=== | ||
Línia 275: | Línia 334: | ||
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició. | En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició. | ||
− | + | ||
+ | :[[solucio_mulitiplicar1]] | ||
=== Formulari === | === Formulari === | ||
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms). | En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms). | ||
− | + | ||
+ | :[[solució formulari ajax]] | ||
=== Chat === | === Chat === | ||
Línia 292: | Línia 353: | ||
'''Podeu trobar al moodle la solució d'aquest exercici''' | '''Podeu trobar al moodle la solució d'aquest exercici''' | ||
+ | |||
+ | --> | ||
+ | |||
+ | == Exercicis curs 2021-2022== | ||
+ | |||
+ | * Exercicis 4 i 6 d'AJAX amb JQuery | ||
+ | |||
+ | == Solucions == | ||
+ | |||
+ | http://wikiserver.infomerce.es/index.php/Exercici4_axax_jquery | ||
+ | |||
+ | http://wikiserver.infomerce.es/index.php/Exercici6_axax_jquery |
Revisió de 17:45, 27 abr 2022
Contingut
Jquery i AJAX
VIDEOTUTORIAL
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:
- $.get()
- $.getScript()
- $.getJSON()
- $.post()
- $.load()
Però tots ells estan basats en el mètode:
- $.ajax()
$.ajax()
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode. Exemple:
$.ajax({
// la URL de la petició
url : 'post.php',
//informació a enviar
// (també es posible utilitzar una cadena de dades)
data : { id : 123 },
// especificar si será una petició POST o GET
type : 'GET',
// el tipus d'informació que s'espera de resposta
dataType : 'json',
// codi a executar si la petició es satisfactoria;
// la resposta es pasada com argument a la funció
success : function(json) {
$('h1').text(json);
},
// codi a executar si la petició falla;
// en pasen com arguments a la funció
// l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat
// de la petició i un text amb la descripció del error que hagi donat el servidor
error : function(jqXHR, status, error) {
alert('hi ha un problema');
},
// codi a executar sense importar si la petició va fallar o no
complete : function(jqXHR, status) {
alert('Petición realizada');
}
});
El mètode $.ajax posseeix moltes opcions de configuració, i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:
Opcions | Explicació |
---|---|
async | Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat. |
jqXHR | es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta. |
textStatus | texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o "parseerror". |
errorThrown | si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”. |
beforeSend | una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats. |
cache | Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició. |
complete | Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror). |
context | Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax. |
data | Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&baz=bim.) |
dataType | una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:
|
error | Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error). |
jsonp | Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. |
succes | Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa. |
timeout | Estableix un temps en mil·lisegons per considerar a una petició com fallada |
traditional | Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/. |
type | una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors. |
url | Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax; |
Dreceres
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:
Realitza una petició GET a una URL proveïda.
$("button").click(function () {
$.get("./datos.php?name=julio&city=valencia", function (data, status) {
alert("Data: " + data + "\nStatus: " + status);
});
});
//dades.php
<?php
if(isset($_GET["name"]) && isset($_GET["city"])){
$nom = $_GET["name"];
$cit = $_GET["city"];
echo $nom . $cit;
exit;
}
echo "ERROR";
?>
Realitza una petició POST a una URL proveïda.
$("button").click(function () {
$.post("datos.php", {
nom: "Julio",
ciutat: "Valencia"
},
function (data, status) {
alert("Data: " + data + "\nStatus: " + status); //data muestra los datos recibidos y muestra el estado
});
});
//dades.php
<?php
if(isset($_POST["nom"]) && isset($_POST["ciutat"])){
$nom = $_POST["nom"];
$cit = $_POST["ciutat"];
echo $nom . $cit;
exit;
}
echo "ERROR";
?>
- $.getScript
Afegeix un script a la pàgina.
$("button").click(function () {
$.getScript("demo_ajax_script.js");
});
//una altra forma
$("button").click(function(){
$.getScript('/static/js/myScript.js', function() {
functionFromMyScript();
});
- $.getJSON
Realitza una petició GET a una URL proveïda i espera que una dada JSON sigui retornat.
$.getJSON([url], [parámetres], [funció que rep les dades])
Els mètodes han de tenir els següents arguments, en ordre:
- url
La URL on es realitzarà la petició. El seu valor és obligatori.
- parámetres
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&baz=bim).
Nota: Aquesta opció no és correcte per al mètode $.getScript.
- success callback
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.
- data type
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.
Nota
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode. Exemples:
$("button").click(function () {
$.getJSON("datos.php", {
"nombre": "Julio",
"apellido": "Noguera"
})
.done(function (data, textStatus, jqXHR) {
if (console && console.log) {
console.log("La solicitud se ha completado correctamente.");
console.log(data); //devuelve objeto del servidor
console.log(textStatus); //devuelve 'success'
console.log(jqXHR); //objeto AJAX
}
})
.fail(function (jqXHR, textStatus, errorThrown) {
if (console && console.log) {
console.log("ha fallado" + textStatus);
}
});
});
//datos.php
<?php
$jsondata = array();
if( isset($_GET['nombre']) ) {
if( $_GET['nombre'] == 'julio' ) {
$jsondata['success'] = true;
$jsondata['message'] = 'Hola! El valor recibido es correcto.';
} else {
$jsondata['success'] = false;
$jsondata['message'] = 'Hola! El valor recibido no es correcto.';
}
//Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo
header('Content-type: application/json; charset=utf-8');
echo json_encode($jsondata);
exit();
}
$.load()
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda.
$(document).ready(function(){
$("button").click(function(){
$("#div1").load("demo_test.txt");
});
});
$(document).ready(function(){
$("button").click(function(){
$("#div1").load("ejemplo.html #p1"); //carga la web e inserta su contenido dentro de #div1
});
});
$(document).ready(function(){
$("button").click(function(){
$("#div1").load("demo_test.txt", function(){
alert("External content loaded successfully!");
});
});
});
Events AJAX ajaxStart ajaxStop
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.
AjaxStart(): Assigna una funció que s'ha d'executar quan comença una consulta AJAX.
AjaxStop(): Assigna una funció que s'executarà cada vegada que acaba una consulta.
$(document) .ajaxStart(function() { $('#loading_indicator').show(); }) .ajaxStop(function() { $('#loading_indicator').hide(); });
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/
Exercicis
Exercicis curs 2021-2022
- Exercicis 4 i 6 d'AJAX amb JQuery
Solucions
http://wikiserver.infomerce.es/index.php/Exercici4_axax_jquery
http://wikiserver.infomerce.es/index.php/Exercici6_axax_jquery