Construiți un cititor de flux RSS cu jQuery și jGFeed

Acest tutorial arată cum se utilizează jQuery și pluginul jGFeed pentru a prelua fluxurile de știri de la distanță și pentru a scrie rezultatele în marcajul existent. jGFeed este un plugin jQuery care vă permite să obțineți "orice" feed RSS din "orice" gazdă și returnează un obiect JSON pentru o utilizare ușoară.

Acest tutorial include un screencast disponibil pentru membrii Tuts + Premium.

Codul exemplu din acest tutorial ar putea să nu funcționeze în Internet Explorer 7 sau mai devreme, dar a fost testat cu succes pe Firefox, Safari, Chrome și IE8.


Pasul 1: Organizarea fișierelor pentru Tutorial

Înainte de a începe să scriem orice cod, să creăm un director în care să plasăm fișierele cititoarelor de feed. Am creat un director pe Desktop numit 'feedreader'. În interiorul acestui director creați un altul numit active.

De asemenea, va trebui să descărcăm o copie a sursei jGFeed. Puteți face acest lucru aici. Pentru acest exemplu, am descărcat versiunea comprimată a fișierului și l-am plasat în directorul "active".

În cele din urmă, să creăm niște fișiere text goale pentru a ține marcajele, javascriptul și stilurile. Am creat următoarea structură de fișier:

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

Structura fișierului ar trebui să arate ca:


Rețineți că index.html, feedreader.js și styles.css ar trebui să fie goale în acest stadiu.


Pasul 2: marcarea

Marcajul nostru pentru acest tutorial va fi foarte simplu și presupunem că deja cunoașteți câteva coduri HTML, așa că le vom prezenta în același timp.

În fișierul index.html vom face legătura cu foaia de stil pe care o vom folosi mai târziu pentru a modela cititorul de fluxuri, apoi adăugăm o listă de linkuri către feedurile pe care dorește să le obținem și, în final, adăugăm fișierele javascript necesare pentru exemplu.

Rețineți că adăugăm fișierele Javascript la sfârșitul corpului. Acest lucru este de a îmbunătăți viteza de încărcare percepută a paginilor dvs., deoarece browserul poate începe să afișeze ieșirea fără a trebui să aștepte încărcarea script-urilor.

Adăugați următoarea marcaj la index.html:

     jQuery + jGFeed AJAX Feed Reader Exemplu    

jQuery + jGFeed AJAX Feed Reader Exemplu

  • .lupomontero
  • Nettuts+
  • jQuery
  • Învățarea jQuery
Faceți clic pe linkurile de mai sus pentru a prelua feedurile

Acum, când deschidem acest fișier în browserul web, ar trebui să vedem următoarea pagină care conține elementele inițiale pentru cititorul nostru de feed-uri.


Rețineți că acest marcaj ar fi perfect funcțional pentru browserele care nu rulează Javascript, în sensul că pagina ar oferi în continuare link-uri valide la feed-uri, dar ar lua în mod evident browserul într-o locație nouă în loc să afișeze fluxurile din cititorul nostru.


Full Screencast



Pasul 3: Înlocuiți Evenimentul Onclick Implicit cu Legăturile

Până acum, când faceți clic pe un link, browserul nostru este direcționat către o nouă locație, locația specificată în atributul "href" al linkului. Acesta este comportamentul normal al legăturilor, însă în acest caz dorim să împiedicăm navigarea de oriunde și să preluăm în mod asincron URL-ul, să procesăm răspunsul și să tipăm datele în marcajul existent, ceea ce înseamnă că nu trebuie să părăsim site-ul iar fluxurile de știri sunt prezentate așa cum vrem.

Deschideți fișierul gol pe care l-am salvat ca active / feedreader.js (aici vom scrie scriptul) și adăugați următoarele javascript:

 $ (document) .ready (function () // Hook to click pentru linkurile ajax-feed-trigger links $ ('a.ajax-feed-trigger'). e.preventDefault (); // Stocați referința la obiectul containerului în local var var container = $ ('# ajax-feed-container'); // Goliți containerul div și temporar adăugați containerul container.empty (). ('href'); alert (href); / / Get feed folosind jGFeed); // End a.ajax-feed- declanșează evenimentul de clic);

Codul de mai sus suprascrie comportamentul implicit al legăturilor pe evenimentul onclick folosind metoda clic a lui jQuery pe toate etichetele "a" ale clasei "ajax-feed trigger". În interiorul metodei de clic, primul lucru pe care îl facem este să împiedicăm comportamentul implicit folosind funcția preventDefault () a lui javascript, apoi goliți containerul div, adăugăm clasa de încărcare care ne va permite să modelam starea de încărcare și pentru moment vom arăta valoarea din atributul href al link-ului clicked. Vom folosi un apel pentru alertă () pentru a verifica dacă codul nostru funcționează până acum.

Înapoi în browser, când dăm clic pe link-uri, ar trebui să vedem un dialog de alertă cu adresa URL a link-ului clicat.



Pasul 4: Obținerea fluxului de știri ca obiect JSON folosind jGFeed

Următorul pas va fi să trimiteți cererea HTTP actuală cu jGFeed și să verificați dacă am primit răspunsul pe care l-am așteptat.

Pluginul jGFeed ia următoarele argumente:

  • url - Adresa URL a fluxului pe care doriți să îl încărcați
  • apel invers - funcția de apel invers pentru a apela după ce este încărcat fluxul RSS
  • num (opțional) - numărul intrărilor de blog care se încarcă (implicit la 3)
  • cheie (opțional) - cheia API Google pentru a fi utilizată în timpul încărcării fluxurilor RSS.

Mai multe informații despre jGFeed:
http://jquery-howto.blogspot.com/2009/05/google-feeds-api-jquery-plugin.html

În acest exemplu vom transmite valoarea atributului href al link-ului ca url, o funcție anonimă de apel invers și vom specifica că dorim să limităm rezultatele la 5.

În assets / feedreader.js adăugați apelul la jGFeed astfel încât scriptul ar trebui să arate acum ca lista de mai jos:

 $ (document) .ready (function () // Hook to click pentru linkurile ajax-feed-trigger links $ ('a.ajax-feed-trigger'). e.preventDefault (); // Stocați referința la obiectul containerului în local var var container = $ ('# ajax-feed-container'); // Goliți containerul div și temporar adăugați containerul container.empty (). ('href'); // Obțineți feed folosind jGFeed $ .jGFeed (href, function (feeds) // Verificați dacă există erori dacă (! feeds) // a existat o eroare container.append ('Eroare la preluarea feedului'); return false;, 5); // End jGFeed); // End a.ajax-feed-trigger click event);

Acum putem folosi Firebug pentru a vedea ce face jGFeed. Faceți clic pe oricare dintre link-uri, deschideți fila "Net" din Firebug și găsiți solicitarea JSON. Ar trebui să spună ceva ca "Încărcare GET? V1.0 & callback = jsonp12". Dacă extindeți vizualizarea, ar trebui să puteți vedea obiectul JSON și datele din interiorul acestuia.



Pasul 5: Crearea dinamică a marcajului pentru fiecare intrare de alimentare

Acum, că știm că primim datele, putem continua să facem ceva cu ea. În acest caz, dorim să iterăm prin intrările din feed și să adăugăm un șir cu marcaj HTML containerului existent pe care l-am creat în fișierul index.html.

Cu toate acestea, înainte de iterarea prin intrări trebuie să pregătim containerul. Ascundem div, pentru a ne asigura că nu vedem nimic până nu terminăm să manipulăm conținutul etichetei recipientului. De asemenea, eliminăm clasa de încărcare ca acum div divizată și adăugăm titlul feedului într-o etichetă de titlu.

Utilizăm o buclă pentru a itera peste proprietatea de intrări a obiectului fluxurilor care este returnată de jGFeed la funcția noastră de apel invers. În cadrul buclă, construim pur și simplu un șir cu câteva marcări HTML pentru a afișa proprietățile fiecărei intrări. La sfârșitul fiecărei iterații adăugăm acest șir HTML la containerul de alimentare.

Odata ce am terminat popularea containerului div cu toate intrarile pe care le numim metoda show () a lui JQuery pentru a se estompa in div si in cele din urma a face din nou vizibila.

 $ (document) .ready (function () // Hook to click pentru linkurile ajax-feed-trigger links $ ('a.ajax-feed-trigger'). e.preventDefault (); // Stocați referința la obiectul containerului în local var var container = $ ('# ajax-feed-container'); // Goliți containerul div și temporar adăugați containerul container.empty (). ('href'); // Obțineți feed folosind jGFeed $ .jGFeed (href, function (feeds) // Verificați dacă există erori dacă (! feeds) // a existat o eroare container.append ('Eroare la preluarea feedului'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

„); // Intrările de feed de proces pentru (var i = 0; i

„; html + = input.title + '

„; html + = '
„; html + = entry.publishedDate + '
„; html + = '
Postat de '; html + = entry.author + '
„; html + = '
„; html + = entry.contentSnippet + '
„; html + = '
„; container.append (html); container.show ('slow'); , 5); // End jGFeed); // Încheiați evenimentul cu click-trigger a.ajax-trigger);

Dacă faceți clic pe oricare dintre link-uri, acum ar trebui să vedeți fluxurile de știri așa cum se arată în imaginea de mai jos.



Pasul 6: Adăugarea unei linkuri "Citește mai mult" pentru a afișa conținutul complet al intrărilor în feeduri

Ok, exemplul pare să funcționeze destul de bine, dar putem încă să facem multă ameliorare. În acest caz, vom adăuga un link "citiți mai mult" care va afișa întregul conținut al înregistrării. Până acum, am folosit numai proprietatea contentSnippet în fiecare obiect de intrare. Acest lucru este util deoarece dorim să afișăm intrările într-o listă compactă, dar avem și întregul conținut dintr-o altă proprietate numită "conținut", așa că vom adăuga o legătură mai mult (+/-) care va comuta între fragmentul și întregul conținut, astfel încât să putem citi întreaga intrare de alimentare fără a părăsi pagina noastră.

Pentru a face acest lucru, trebuie mai întâi să adăugăm conținutul în șirul HTML pe care-l construim în interiorul bucla, dar vom seta înălțimea conținutului divs la zero și depășirea acestora la "ascuns" pentru a le ascunde ca și noi vor folosi doar pentru a ține datele reale. Legătura noastră va schimba pur și simplu conținutul fragmentului divizor "vizibil" cu conținutul "invizibil" div.

Chiar înainte de a afișa feed-ul la sfârșitul funcției de apel invers am trecut pe jGFeed, va trebui, de asemenea, să adăugăm un handler de evenimente onclick pentru link-urile noastre "citiți mai multe". Facem acest lucru la fel ca în cazul legăturilor pe care le folosim pentru a prelua fluxul, utilizând metoda clic () a lui jQuery.

 $ (document) .ready (function () // Hook to click pentru linkurile ajax-feed-trigger links $ ('a.ajax-feed-trigger'). e.preventDefault (); // Stocați referința la obiectul containerului în local var var container = $ ('# ajax-feed-container'); // Goliți containerul div și temporar adăugați containerul container.empty (). ('href'); // Obțineți feed folosind jGFeed $ .jGFeed (href, function (feeds) // Verificați dacă există erori dacă (! feeds) // a existat o eroare container.append ('Eroare la preluarea feedului'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

„); // Intrările de feed de proces pentru (var i = 0; i

„; html + = input.title + '

„; html + = '
„; html + = entry.publishedDate + '
„; html + = '
Postat de '; html + = entry.author + '
„; html + = '
„; html + = entry.contentSnippet + '
„; html + = '
„; html + = '
+
„; html + = '
„; container.append (html); // Ajungeți la evenimentul clic pentru linkurile ajax-feed-trigger $ ('a.ajax-feed-readmore') .Click (funcția (e) // Preveniți acțiunea implicită de clic e.preventDefault (); (aceasta) .attr ('href'); var div_id = 'ajax-feed-content-' + conținut_id; var content_div = $ ('#' + div_id); var content_txt = content_div.html () () (.) () () () () () () (Acest lucru este incomplet) ') $ (acest) .html (' + '); altceva $ (this) .html (' - ');); container.show ( 'lent'); , 5); // End jGFeed); // Încheiați evenimentul cu click-trigger a.ajax-trigger);

Cititorul trebuie să afișeze acum un buton "+" și "-" care comută între fragmentul de conținut și conținutul complet pentru fiecare intrare.



Pasul 7: Modelarea cititorului

Cititorul feedurilor funcționează acum ... ura! Dar să fim cinstiți, nu arată foarte bine. Deci, să punem cireasa pe tort. Mai jos am inclus câteva stiluri ca un exemplu în care cititorul ar putea fi jupuit. S-ar putea să fi observat că am folosit clase pentru fiecare dintre elementele din marcajul nostru, așa că ar trebui să fie relativ ușor să se refere la fiecare element selectorii CSS în același mod în care le-am selectat cu jQuery.

 / * Culori: roșu: # C74C44 roșu închis: # 8C413A gri: # 3F474C bej închis: # B5B095 bej: # DBD5B6 * / html culoare: # F0F0F0; fundal-culoare: # 8C413A; font-family: "Helvetica", sans-serif;  corp font-size: 12px; margine: 10px 20% 30px 20%;  div, ul, li margine: 0; umplutura: 0;  img frontieră: 0;  li stil-style: none;  h1, h2, h3 font-size: 100%; font-weight: normal;  h1 culoare: # DBD5B6; font-size: 4.6; linia-înălțime: 1.1em; text-shadow: 1px 1px 0.3em # 3F474C; fundal-imagine: url (logo.png); background-repeat: nu-repeta; umplutură: 16px 0 0 148px; margine: 0px; înălțime: 114px;  h2 culoare: # DBD5B6; font-size: 2.6; text-shadow: 1px 1px # 3F474C; umplutura: 0; marcă: 0 0 25px 0;  a culoare: # DBD5B6; text-decoration: nici unul;  ul.menu marja: 44px 0px 24px 0px; padding: 0px;  ul.menu li afișare: inline; margine: 0px 5px 0px 0px; padding: 12px; fundal-culoare: # 3F474C; frontieră: 1px solid # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px; font-size: 1.2m; text-shadow: 1px 1px # 3F474C;  ul.menu li: mutați background-color: # B5B095; text-shadow: 1px 1px 0.2em # 3F474C;  div # ajax-feed-wrapper umplutură: 20px; overflow: ascuns; fundal-culoare: # C74C44; frontieră: 1px solid # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px;  încărcare lățime: 36px; înălțime: 36px; fundal-imagine: url (ajax-loader.gif); background-repeat: nu-repeta; pozitie pozitie: 20px 20px;  div.ajax-feed-item background-color: # 8C413A; padding: 10px; margin-bottom: 10px;  div.ajax-feed-item h3 font-size: 1.8; text-shadow: 1px 1px 0.3em # 3F474C; umplutura: 0; margine: 3px 0 15px 0;  div.ajax-feed-date, div.ajax-feed-autor font-size: 0.8;  div.ajax-feed-content-snippet margine: 3px 0px 10px 0px; umplutura: 15px 5px 5px 5px; frontieră: 1px solid # C74C44; text-shadow: 1px 1px # 3F474C;  a.ajax-feed-readmore afișare: table-cell; padding: 1px 5px; frontieră: 1px solid # DBD5B6;  a.ajax-feed-readmore: hover fundal-culoare: # B5B095; 

Voila! Asta arata deja mult mai bine ;-)


Cod