Costruisci un lettore di feed RSS con jQuery e jGFeed

Questo tutorial mostra come utilizzare jQuery e il plugin jGFeed per recuperare i feed di notizie in remoto e scrivere i risultati nel markup esistente. jGFeed è un plugin jQuery che ti permette di ottenere "qualsiasi" feed RSS da qualsiasi host e restituisce un oggetto JSON per un facile utilizzo.

Questo tutorial include uno screencast disponibile per i membri Tuts + Premium.

Il codice di esempio in questa esercitazione potrebbe non funzionare in Internet Explorer 7 o versioni precedenti ma è stato testato con successo su Firefox, Safari, Chrome e IE8.


Passaggio 1: organizzazione dei file per il tutorial

Prima di iniziare a scrivere qualsiasi codice, creiamo una directory in cui posizionare i file del lettore di feed. Ho creato una directory nel mio desktop chiamata "feedreader". All'interno di questa directory crea un altro chiamato asset.

Dovremo anche scaricare una copia della sorgente jGFeed. È possibile farlo qui. Per questo esempio ho scaricato la versione compressa del file e l'ho inserita nella directory 'assets'.

Infine, creiamo alcuni file di testo vuoti per contenere markup, javascript e stili. Ho creato la seguente struttura di file:

 | - beni | | - feedreader.js | | - jquery.jgfeed-min.js | '- styles.css' - index.html

La struttura del file dovrebbe assomigliare a:


Nota che index.html, feedreader.js e styles.css dovrebbero essere vuoti in questa fase.


Passaggio 2: il markup

Il nostro markup per questo tutorial sarà molto semplice, e stiamo assumendo che tu conosca già un po 'di HTML, quindi lo introdurremo tutto in una volta.

Nel nostro file index.html ci collegheremo al foglio di stile che utilizzeremo in seguito per modellare il lettore di feed, quindi aggiungeremo un elenco di link ai feed che vogliamo ottenere e infine aggiungeremo i file javascript necessari per l'esempio.

Si noti che aggiungiamo i file Javascript alla fine del corpo. Questo per migliorare la velocità di caricamento percepita delle tue pagine, poiché il browser può iniziare a visualizzare l'output senza dover attendere il caricamento degli script.

Aggiungi il seguente markup a index.html:

     Esempio di lettore di feed jQuery + jGFeed AJAX    

Esempio di lettore di feed jQuery + jGFeed AJAX

  • .lupomontero
  • Nettuts+
  • jQuery
  • Imparare jQuery
Clicca sui link qui sopra per scaricare i feed

Ora quando apriamo questo file nel browser web dovremmo vedere la seguente pagina contenente gli elementi iniziali per il nostro lettore di feed.


Si noti che questo markup sarebbe perfetto per i browser che non eseguono Javascript, nel senso che la pagina offre comunque collegamenti validi ai feed, ma ovviamente porterebbero il browser in una nuova posizione invece di visualizzare i feed all'interno del nostro lettore.


Screencast completo



Passaggio 3: Sostituisci l'evento Onclick predefinito dei collegamenti

Finora, quando facciamo clic su un collegamento, il nostro browser viene indirizzato a una nuova posizione, la posizione specificata nell'attributo "href" del collegamento. Questo è il normale comportamento dei link, ma in questo caso vogliamo impedire al browser di andare ovunque e recuperare l'URL in modo asincrono, elaborare la risposta e stampare i dati all'interno del markup esistente, il che significa che non dobbiamo lasciare il sito e i feed di notizie sono presentati nel modo che vogliamo.

Apri il file vuoto che abbiamo salvato come assets / feedreader.js (questo è dove scriveremo il nostro script) e aggiungi il seguente javascript:

 $ (document) .ready (function () // Agganciato all'evento click per i link ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (function (e) // Previene l'azione di clic predefinita e.preventDefault (); // Memorizza il riferimento all'oggetto contenitore in var var container = $ ('# ajax-feed-container'); // Vuota div contenitore e aggiunge temporaneamente lo stile "loading" container.empty (). addClass ('caricamento'); // Ottieni collegamenti href attributo var href = $ (this) .attr ('href'); alert (href); // Ottieni feed utilizzando jGFeed); // Termina a.ajax-feed- evento click trigger);

Il codice sopra sovrascrive il comportamento predefinito dell'evento onclick dei link utilizzando il metodo click di jQuery su tutti i tag 'a' di classe 'trigger' ajax-feed '. All'interno del metodo click la prima cosa che facciamo è impedire il comportamento predefinito usando preventDefault () di javascript, quindi svuotiamo il contenitore div, aggiungiamo la classe di caricamento che ci permetterà di disegnare lo 'stato' di caricamento e per ora mostriamo solo il valore dell'attributo href del link cliccato. Useremo una chiamata per avvisare () per verificare che il nostro codice funzioni fino a quel momento.

Di nuovo nel browser, quando clicchiamo sui link dovremmo vedere una finestra di avviso con l'URL del link cliccato.



Passaggio 4: Ottenere il feed delle notizie come un oggetto JSON utilizzando jGFeed

Il prossimo passo sarà inviare la richiesta HTTP effettiva con jGFeed e controllare che abbiamo ottenuto la risposta che ci aspettavamo.

Il plugin jGFeed accetta i seguenti argomenti:

  • url: l'URL del feed che desideri caricare
  • richiamata - funzione di richiamata per chiamare dopo che è stato caricato il feed RSS
  • num (opzionale) - numero di post di blog da caricare (il valore predefinito è 3)
  • chiave (facoltativo): la chiave API di Google da utilizzare durante il caricamento dei feed RSS.

Maggiori informazioni su jGFeed:
http://jquery-howto.blogspot.com/2009/05/google-feeds-api-jquery-plugin.html

In questo esempio passeremo il valore dell'attributo href del link come url, una funzione di callback anonimo e specificheremo che vogliamo limitare i risultati a 5.

In assets / feedreader.js aggiungi la chiamata a jGFeed in modo che lo script ora assomigli alla seguente lista:

 $ (document) .ready (function () // Agganciato all'evento click per i link ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (function (e) // Previene l'azione di clic predefinita e.preventDefault (); // Memorizza il riferimento all'oggetto contenitore in var var container = $ ('# ajax-feed-container'); // Vuota div contenitore e aggiunge temporaneamente lo stile "loading" container.empty (). addClass ('caricamento'); // Ottieni collegamenti href attributo var href = $ (this) .attr ('href'); // Ottieni feed usando jGFeed $ .jGFeed (href, function (feeds) // Controlla gli errori se (! feeds) // si è verificato un errore container.append ('Errore durante il recupero del feed.'); return false;, 5); // End jGFeed); // End a.ajax-feed-trigger click evento);

Ora possiamo usare Firebug per vedere cosa sta facendo jGFeed. Fare clic su uno dei collegamenti, aprire la scheda "Rete" in Firebug e individuare la richiesta JSON. Dovrebbe dire qualcosa come 'GET load? V1.0 & callback = jsonp12'. Se si espande la vista, si dovrebbe essere in grado di vedere l'oggetto JSON e i dati al suo interno.



Passaggio 5: creazione del markup per ogni voce di feed in modo dinamico

Ora che sappiamo che stiamo ottenendo i dati possiamo procedere a fare qualcosa con esso. In questo caso vogliamo ripetere le voci nel feed e aggiungere una stringa con markup HTML al contenitore esistente che abbiamo creato nel nostro file index.html.

Tuttavia, prima di scorrere le voci, è necessario preparare il contenitore. Nascondiamo il div per assicurarci di non vedere nulla finché non avremo finito di manipolare il contenuto del tag del contenitore. Rimuoviamo anche la classe di caricamento poiché ora il div è nascosto e aggiunge il titolo del feed in un tag di intestazione.

Usiamo un ciclo for per iterare sulla proprietà delle voci dell'oggetto feed che viene restituito da jGFeed alla nostra funzione di callback. All'interno del ciclo costruiamo semplicemente una stringa con alcuni markup HTML per visualizzare le proprietà di ogni voce. Alla fine di ogni iterazione aggiungiamo questa stringa HTML al contenitore del feed.

Una volta terminato di compilare il contenitore div con tutte le voci, chiamiamo il metodo show () di JQuery per dissolvere il div e renderlo finalmente visibile.

 $ (document) .ready (function () // Agganciato all'evento click per i link ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (function (e) // Previene l'azione di clic predefinita e.preventDefault (); // Memorizza il riferimento all'oggetto contenitore in var var container = $ ('# ajax-feed-container'); // Vuota div contenitore e aggiunge temporaneamente lo stile "loading" container.empty (). addClass ('caricamento'); // Ottieni collegamenti href attributo var href = $ (this) .attr ('href'); // Ottieni feed usando jGFeed $ .jGFeed (href, function (feeds) // Controlla gli errori se (! feeds) // si è verificato un errore container.append ('Errore durante il recupero del feed.'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

'); // Elabora le voci del feed per (var i = 0; i'; html + = '
'; html + = entry.publishedDate + '
'; html + = '
Pubblicato da '; html + = entry.author + '
'; html + = '
'; html + = entry.contentSnippet + '
'; html + = '
'; container.append (html); container.show ('slow'); , 5); // Fine jGFeed); // Termina evento click click a.ajax-feed-trigger);

Se clicchi su uno qualsiasi dei link ora dovresti vedere i feed di notizie come mostrato nello screenshot qui sotto.



Passaggio 6: aggiunta di un collegamento "Leggi di più" per visualizzare il contenuto completo delle voci del feed

Ok, l'esempio sembra funzionare abbastanza bene, ma c'è ancora un sacco di modifiche che potremmo fare. In questo caso aggiungeremo un tipo di collegamento "leggi più" che visualizzerà l'intero contenuto della voce. Fino ad ora abbiamo utilizzato solo la proprietà contentSnippet in ogni oggetto entry. Questo è utile perché vogliamo visualizzare le voci in una lista compatta, ma abbiamo anche il contenuto completo in un'altra proprietà chiamata 'contenuto', quindi aggiungeremo un link di lettura più (+/-) che si alternerà tra snippet e il contenuto completo in modo che possiamo leggere l'intera voce del feed senza uscire dalla nostra pagina.

Per fare ciò, dobbiamo prima aggiungere il contenuto alla stringa HTML che stavamo costruendo all'interno del ciclo, ma imposteremo l'altezza dei div del contenuto a zero e il loro overflow su "hidden" per nasconderli come li useranno solo per contenere i dati effettivi. Il nostro link scambierà semplicemente il contenuto del div "visibile" snippet con il contenuto div invisibile.

Poco prima di mostrare il feed alla fine della funzione di callback passato a jGFeed, dovremo aggiungere anche il gestore di eventi onclick per i nostri link "leggi di più". Lo facciamo nello stesso modo in cui lo abbiamo fatto con i link che stiamo usando per recuperare il feed, usando il metodo click () di jQuery.

 $ (document) .ready (function () // Agganciato all'evento click per i link ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (function (e) // Previene l'azione di clic predefinita e.preventDefault (); // Memorizza il riferimento all'oggetto contenitore in var var container = $ ('# ajax-feed-container'); // Vuota div contenitore e aggiunge temporaneamente lo stile "loading" container.empty (). addClass ('caricamento'); // Ottieni collegamenti href attributo var href = $ (this) .attr ('href'); // Ottieni feed usando jGFeed $ .jGFeed (href, function (feeds) // Controlla gli errori se (! feeds) // si è verificato un errore container.append ('Errore durante il recupero del feed.'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

'); // Elabora le voci del feed per (var i = 0; i'; html + = '
'; html + = entry.publishedDate + '
'; html + = '
Pubblicato da '; html + = entry.author + '
'; html + = '
'; html + = entry.contentSnippet + '
'; html + = '
'; html + = '
+
'; html + = '
'; container.append (html); // Hook to click event per i link ajax-feed-trigger $ ('a.ajax-feed-readmore'). Click (function (e) // Previene l'azione di clic predefinita e.preventDefault (); var content_id = $ (this) .attr ('href'); var div_id = 'ajax-feed-content-' + content_id; var content_div = $ ('#' + div_id); var content_txt = content_div.html (); var snippet_div = content_div .prev (); var snippet_txt = snippet_div.html (); // Scambia il contenuto del testo tra i div content_div.html (snippet_txt); snippet_div.html (content_txt); if ($ (this) .html () === '- ') $ (this) .html (' + '); else $ (this) .html (' - ');); container.show ( 'slow'); , 5); // Fine jGFeed); // Termina evento click click a.ajax-feed-trigger);

Il lettore dovrebbe ora visualizzare un pulsante '+' e '-' che alterna tra lo snippet di contenuto e il contenuto completo per ogni voce.



Step 7: Styling del Reader

Il lettore di feed ora funziona ... evviva! Ma siamo onesti, non sembra molto buono. Quindi mettiamo la ciliegina sulla torta. Di seguito ho incluso alcuni stili come esempio di come il lettore potrebbe essere scorticato. Potresti aver notato che abbiamo usato le classi per ciascuno degli elementi nel nostro markup, quindi dovrebbe essere relativamente facile riferirsi a ciascun elemento nei selettori CSS nello stesso modo in cui li abbiamo selezionati con jQuery.

 / * Colori: rosso: # C74C44 rosso scuro: # 8C413A grigio: # 3F474C beige scuro: # B5B095 beige: # DBD5B6 * / html colore: # F0F0F0; background-color: # 8C413A; font-family: "Helvetica", sans-serif;  body font-size: 12px; margine: 10px 20% 30px 20%;  div, ul, li margin: 0; padding: 0;  img border: 0;  li list-style: none;  h1, h2, h3 dimensione carattere: 100%; font-weight: normal;  h1 color: # DBD5B6; font-size: 4.6em; line-height: 1.1em; text-shadow: 1px 1px 0.3em # 3F474C; background-image: url (logo.png); background-repeat: no-repeat; imbottitura: 16px 0 0 148px; margine: 0px; altezza: 114px;  h2 color: # DBD5B6; dimensione del font: 2.6em; text-shadow: 1px 1px # 3F474C; padding: 0; margine: 0 0 25 px 0;  a color: # DBD5B6; decorazione del testo: nessuna;  ul.menu margin: 44px 0px 24px 0px; imbottitura: 0px;  ul.menu li display: inline; margine: 0px 5px 0px 0px; imbottitura: 12px; background-color: # 3F474C; border: 1px solid # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px; font-size: 1.2em; text-shadow: 1px 1px # 3F474C;  ul.menu li: hover background-color: # B5B095; text-shadow: 1px 1px 0.2em # 3F474C;  div # ajax-feed-wrapper padding: 20px; overflow: nascosto; background-color: # C74C44; border: 1px solid # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px;  .loading width: 36px; altezza: 36px; background-image: url (ajax-loader.gif); background-repeat: no-repeat; posizione di sfondo: 20px 20px;  div.ajax-feed-item background-color: # 8C413A; imbottitura: 10px; margin-bottom: 10px;  div.ajax-feed-item h3 font-size: 1.8em; text-shadow: 1px 1px 0.3em # 3F474C; padding: 0; margine: 3px 0 15px 0;  div.ajax-feed-date, div.ajax-feed-author font-size: 0.8em;  div.ajax-feed-content-snippet margin: 3px 0px 10px 0px; imbottitura: 15px 5px 5px 5px; border-top: 1px solid # C74C44; text-shadow: 1px 1px # 3F474C;  a.ajax-feed-readmore display: table-cell; imbottitura: 1px 5px; border: 1px solid # DBD5B6;  a.ajax-feed-readmore: hover background-color: # B5B095; 

Ecco! Sembra già molto meglio ;-)