Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
cordova [2023/12/11 20:33] enric_mieza_sanchez [Exercici Tasklist v0.1] jquery mobile dialog |
cordova [2025/12/04 17:52] (actual) enric_mieza_sanchez [AJAX amb jQuery] |
||
|---|---|---|---|
| Línia 52: | Línia 52: | ||
| ===== Afegint jQuery ===== | ===== Afegint jQuery ===== | ||
| - | jQuery | + | jQuery |
| <WRAP info> | <WRAP info> | ||
| Podeu aprendre més sobre [[jQuery]] <- en aquesta wiki. | Podeu aprendre més sobre [[jQuery]] <- en aquesta wiki. | ||
| - | </ | ||
| - | |||
| - | Com afegir jQuery a la meva pàgina HTML: | ||
| - | - **Instal·lació "a mà" | ||
| - | - Descarregar els arxius de la web oficial http:// | ||
| - | - Utilitzar els repositoris online (CDN). Pots veure com fer-ho en aquest tutorial: | ||
| - | - https:// | ||
| - | - Instal·lació amb el **// | ||
| - | - Està força obsolet, però té alguns // | ||
| - | - https:// | ||
| - | - Instal·la-ho a l' | ||
| - | - Configura el template. | ||
| - | * En Linux executa:< | ||
| - | * En Windows fes des del CMD:< | ||
| - | - Mira com queda la plantilla fent de nou:< | ||
| - | - Prova diversos // | ||
| - | - Ens quedarem amb el '' | ||
| - | * La [[https:// | ||
| - | |||
| - | <WRAP important> | ||
| - | Hi ha un petit error a les plantilles. Quan arrenquis l' | ||
| </ | </ | ||
| \\ | \\ | ||
| - | ===== Cordova no vol inlines ===== | ||
| - | Típicament podríem fer una aplicació en JavaScript en una pàgina HTML i podríem posar botons que cridin a funcions del nostre codi amb un //onclick// (el què coneixem per crida // | ||
| - | |||
| - | Forma de solventar-ho: | ||
| - | <code javascript index.html> | ||
| - | <button id=" | ||
| - | </ | ||
| - | | ||
| - | I després, en el nostre '' | ||
| - | <code javascript index.js> | ||
| - | $('# | ||
| - | </ | ||
| - | |||
| - | En aquest exemple, cridaríem a la funció '' | ||
| - | |||
| - | I un darrer apunt, la crida a aquesta funció no pot anar al principi del document, pq en el //head// encara no existeix el nostre //button//. Tenim 2 solucions: | ||
| - | - Posar el tag ''< | ||
| - | - Posar el codi d' | ||
| - | $(document).ready( function () { | ||
| - | // initialize | ||
| - | $('# | ||
| - | $('# | ||
| - | }); | ||
| - | </ | ||
| - | |||
| - | |||
| - | \\ | ||
| ==== Exercici Tasklist v0.1 ==== | ==== Exercici Tasklist v0.1 ==== | ||
| Línia 115: | Línia 67: | ||
| Tasklist: | Tasklist: | ||
| - Inicia un projecte Cordova. | - Inicia un projecte Cordova. | ||
| - | - Implementa | + | - Crea una llista de tasques d' |
| - | * Es recomana utilitzar la plantilla '' | + | |
| - Implementa el **botó d' | - Implementa el **botó d' | ||
| - | * Necessitaràs conèixer [[jQuery|com utilitzar el DOM amb jQuery]]: | + | * Necessitaràs conèixer [[jQuery|com utilitzar el DOM amb jQuery]]. |
| * Afegir elements. El text el podem agafar amb: | * Afegir elements. El text el podem agafar amb: | ||
| - | | + | |
| - | | + | |
| - | * Posar el '' | + | * Tingues en compte la documentació oficial de la jQuery |
| - | * Tingues en compte la [[https:// | + | |
| </ | </ | ||
| \\ | \\ | ||
| + | |||
| ==== Exercici Tasklist v0.2 ==== | ==== Exercici Tasklist v0.2 ==== | ||
| + | |||
| + | {{tasklist2.png? | ||
| <WRAP todo> | <WRAP todo> | ||
| Continua de l' | Continua de l' | ||
| - Implementa un **botó Elimina** dins de cada element de la llista que esborri aquell element. Convé fer-ho en la pròpia creació de l' | - Implementa un **botó Elimina** dins de cada element de la llista que esborri aquell element. Convé fer-ho en la pròpia creació de l' | ||
| - | * Per saber més [[https://demos.jquerymobile.com/1.4.3/listview/ | + | * Enlloc d' |
| - | * Per eliminar un element del DOM caldrà saber //quin// element està cridant (caller). [[https:// | + | * Per eliminar un element del DOM caldrà saber **//quin// element està cridant (caller)**. [[https:// |
| - | var caller = e.target || e.srcElement; | + | var caller = event.target || event.srcElement; |
| console.log( caller ); | console.log( caller ); | ||
| }</ | }</ | ||
| * Busca la funció jQuery per a eliminar un element. | * Busca la funció jQuery per a eliminar un element. | ||
| * Busca la funció jQuery per a accedir al pare d'un element per poder esborrar el ''< | * Busca la funció jQuery per a accedir al pare d'un element per poder esborrar el ''< | ||
| - | - Implementa un **botó Edita** dins de cada element de la llista | + | - Implementa un **botó Edita** dins de cada element de la llista. |
| - | | + | - La funció d' |
| - | | + | - La més elegant: utilitzar el '' |
| + | | ||
| + | - Demanant amb el //prompt//, que de fet és la opció més senzilla (però també la menys vistosa). | ||
| + | - És probable (depenent de la implementació que hagis fet) que quan vulguis editar el text de la tasca (està dintre d'un <a>) et trobis que et posa també el text dels elements fills (botons d' | ||
| </ | </ | ||
| Línia 175: | Línia 131: | ||
| <WRAP todo> | <WRAP todo> | ||
| Fes la // | Fes la // | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Seguretat en Cordova ===== | ||
| + | <WRAP important> | ||
| + | Cordova ens deixa crear qualsevol pàgina HTML amb el codi que ens sembli bé. Però si ens fixem en la plantilla al crear de zero un projecte, ens trobem algunes particularitats que cal parar atenció, sobretot el **tag META amb el Content-Security-Policy**: | ||
| + | <WRAP prewrap> | ||
| + | <code html> | ||
| + | <meta http-equiv=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Aquest tag META bàsicament ens limita certes accions de l'HTML que podrien fer vulnerable el nostre codi. Entre d' | ||
| + | </ | ||
| + | |||
| + | Típicament podríem fer una aplicació en JavaScript en una pàgina HTML i podríem posar botons que cridin a funcions del nostre codi amb un //onclick// (el què coneixem per crida // | ||
| + | |||
| + | <WRAP alert> | ||
| + | Aquesta solució funcionaria en una web normal, però **no funciona si posem el tag META de Content-Security-Policy**: | ||
| + | |||
| + | <code html>< | ||
| + | |||
| + | </ | ||
| + | |||
| + | Forma de solventar-ho: | ||
| + | <code html index.html> | ||
| + | <button id=" | ||
| + | |||
| + | <!-- al final del body carreguem les llibreries de Cordova i la de la nostra app --> | ||
| + | <script src=" | ||
| + | <script src=" | ||
| + | </ | ||
| + | | ||
| + | I després, en el nostre '' | ||
| + | |||
| + | <tabbox JavaScript> | ||
| + | <code javascript index.js> | ||
| + | <tabbox jQuery> | ||
| + | <code javascript index.js> | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Inicialitzacions ===== | ||
| + | |||
| + | ==== Inicialitzacions HTML ==== | ||
| + | |||
| + | Abans d' | ||
| + | - Posar el tag ''< | ||
| + | - Posar el codi d' | ||
| + | Estil jQuery amb la funció '' | ||
| + | <code javascript> | ||
| + | $(document).ready( function () { | ||
| + | // inicialitzar: | ||
| + | $('# | ||
| + | $('# | ||
| + | }); | ||
| + | </ | ||
| + | <tabbox JavaScript> | ||
| + | <code javascript> | ||
| + | function inicialitza() { | ||
| + | // inicialitzar: | ||
| + | document.getElementById(" | ||
| + | document.getElementById(" | ||
| + | } | ||
| + | |||
| + | // associem l' | ||
| + | window.addEventListener(" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Inicialitzacions Cordova ==== | ||
| + | Cordova necessita inicialitzar el // | ||
| + | |||
| + | <code html index.html> | ||
| + | < | ||
| + | |||
| + | ... | ||
| + | |||
| + | <!-- carreguem les llibreries de Cordova i la de la nostra app --> | ||
| + | <script src=" | ||
| + | <script src=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | La línia del HTML que carrega '' | ||
| + | |||
| + | <code javascript index.js> | ||
| + | document.addEventListener(' | ||
| + | |||
| + | function onDeviceReady() { | ||
| + | // aquí ja podem fer accions amb la càmera, arxius, etc. | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP todo> | ||
| + | Fes una **versió v0.4 de la Tasklist** aplicant el tag META de seguretat i les inicialitzacions pertinents. | ||
| </ | </ | ||
| Línia 224: | Línia 278: | ||
| </ | </ | ||
| - | ==== AJAX amb jQuery | + | ==== Exemple |
| Aquestes mateixes les podem demanar des d'un document/ | Aquestes mateixes les podem demanar des d'un document/ | ||
| + | <tabbox JavaScript> | ||
| + | <code javascript> | ||
| + | fetch(' | ||
| + | .then(response => { | ||
| + | if (!response.ok) { | ||
| + | throw new Error(' | ||
| + | } | ||
| + | return response.json(); | ||
| + | }) | ||
| + | .then(data => { | ||
| + | // iterem pels diversos elements de l' | ||
| + | for( const artist of data.artists ) { | ||
| + | console.log(`${artist.name} (${artist.disambiguation}`) | ||
| + | // pintar l'HTML necessari... | ||
| + | } | ||
| + | }) | ||
| + | .catch(error => { | ||
| + | console.error(' | ||
| + | }); | ||
| + | </ | ||
| + | <tabbox jQuery> | ||
| <code javascript> | <code javascript> | ||
| $.ajax({ | $.ajax({ | ||
| Línia 232: | Línia 307: | ||
| url: " | url: " | ||
| dataType: " | dataType: " | ||
| - | }).done(function (msg) { | + | }).done(function (data) { |
| - | for(let item in msg.artists) { | + | for(let item in data.artists) { |
| - | | + | |
| - | // aquí caldría fer mes coses, of course... | + | var descripcio = data.aritsts[item].disambiguation; |
| + | console.log(`${artista} (${descripcio}`) | ||
| + | // aquí caldria pintar l'HTML necessari | ||
| // ... | // ... | ||
| }; | }; | ||
| Línia 242: | Línia 319: | ||
| }); | }); | ||
| </ | </ | ||
| + | </ | ||
| Cal tenir en compte que les URLs a les que cridis amb AJAX han de tenir habilitada la capçalera de CORS (Cross-Origin Resource Sharing). Les APIs solen tenir-ho habilitat. Totes les APIs públiques ho tenen activat. | Cal tenir en compte que les URLs a les que cridis amb AJAX han de tenir habilitada la capçalera de CORS (Cross-Origin Resource Sharing). Les APIs solen tenir-ho habilitat. Totes les APIs públiques ho tenen activat. | ||
| Línia 282: | Línia 360: | ||
| </ | </ | ||
| - | ==== Public | + | ==== Public |
| <WRAP tip> | <WRAP tip> | ||
| [[https:// | [[https:// | ||
| - | [[https:// | + | [[https:// |
| Fes-li un cop d'ull i troba el teu //hobby// en una API! | Fes-li un cop d'ull i troba el teu //hobby// en una API! | ||
| Línia 298: | Línia 376: | ||
| Aprofitant el codi que hem fet amb l'API de musicbrainz.com , fes una nova app que utilitzi la [[https:// | Aprofitant el codi que hem fet amb l'API de musicbrainz.com , fes una nova app que utilitzi la [[https:// | ||
| * Al **tab1** posa un botó que carregui una llista de notícies (mostrant només el títol). | * Al **tab1** posa un botó que carregui una llista de notícies (mostrant només el títol). | ||
| - | * Utilitza les [[https://materializecss.com/ | + | * Utilitza les [[https://materializeweb.com/ |
| - | * Per saltar al //tab2// necessitaràs consultar la [[https://materializecss.com/ | + | * Per saltar al //tab2// necessitaràs consultar la [[https://materializeweb.com/ |
| - | $('.tabs' | + | var elems = document.getElementsByClassName(' |
| + | var instance = M.Tabs.getInstance(elems[0]); | ||
| + | instance.select('test-swipe-2'); | ||
| </ | </ | ||
| * Al **tab2** posa la notícia complerta amb la imatge. Formata-la adequadament. Probablement hauràs de fer una altra crida a la API per carregar els detalls de l' | * Al **tab2** posa la notícia complerta amb la imatge. Formata-la adequadament. Probablement hauràs de fer una altra crida a la API per carregar els detalls de l' | ||
| * Poseu //links// a les notícies originals. El problema és que salta dins de la pròpia app. En realitat el què voldrem és que l'obri al navegador del mòbil, això ho podem aconseguir així:< | * Poseu //links// a les notícies originals. El problema és que salta dins de la pròpia app. En realitat el què voldrem és que l'obri al navegador del mòbil, això ho podem aconseguir així:< | ||
| <a href="#" | <a href="#" | ||
| - | * Al **tab3** carregarem la llista de notícies amb [[https://materializecss.com/ | + | * Al **tab3** carregarem la llista de notícies amb [[https://materializeweb.com/ |
| </ | </ | ||
| Línia 313: | Línia 393: | ||
| ===== Plugins ===== | ===== Plugins ===== | ||
| - | * [[https:// | + | |
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | | ||
| * [[https:// | * [[https:// | ||
| - | * [[https:// | + | |
| + | | ||
| * Necessitaràs [[https:// | * Necessitaràs [[https:// | ||