Bygg en RSS-feedleser med jQuery og jGFeed

Denne opplæringen viser hvordan du bruker jQuery og jGFeed-plugin for å hente nyhetsfeeder eksternt og skrive resultatene i eksisterende oppslag. jGFeed er en jQuery-plugin som lar deg få 'noen' RSS-feed fra 'noen' vert og returnerer et JSON-objekt for enkel bruk.

Denne opplæringen inneholder en screencast tilgjengelig for Tuts + Premium medlemmer.

Eksempelkoden i denne opplæringen virker kanskje ikke i Internet Explorer 7 eller tidligere, men den har blitt testet på Firefox, Safari, Chrome og IE8.


Trinn 1: Organisering av filene for opplæringen

Før vi begynner å skrive noen kode, la oss lage en katalog hvor du skal plassere feed leserfilene. Jeg har opprettet en katalog i skrivebordet mitt, kalt 'feedreader'. Inne i denne katalogen opprett en annen som heter eiendeler.

Vi må også laste ned en kopi av jGFeed-kilden. Du kan gjøre det her. For dette eksempelet har jeg lastet ned den komprimerte versjonen av filen og plassert den i 'assets'-katalogen.

Til slutt, la oss lage noen tomme tekstfiler for å holde markeringen, javascript og stiler. Jeg har opprettet følgende filstruktur:

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

Filstrukturen skal se ut som:


Vær oppmerksom på at index.html, feedreader.js og styles.css skal være tomme på dette stadiet.


Trinn 2: Markup

Vår oppfølging for denne opplæringen kommer til å være veldig enkel, og vi antar at du allerede kjenner litt HTML, så vi vil presentere alt på en gang.

I vår index.html-fil vil vi lenke til stilarket som vi skal bruke senere for å stilmate leseren, og deretter legge til en liste over koblinger til feeds vi ønsker å få og til slutt legge til javascript-filene som trengs for eksempelet.

Legg merke til at vi legger til Javascript-filene på slutten av kroppen. Dette er å forbedre opplevd lasthastighet på sidene dine, da nettleseren kan begynne å vise utdata uten å måtte vente på at skriptene skal lastes inn.

Legg til følgende merking til index.html:

     jQuery + jGFeed AJAX Feed Reader Eksempel    

jQuery + jGFeed AJAX Feed Reader Eksempel

  • .lupomontero
  • Nettuts+
  • jQuery
  • Læring jQuery
Klikk på koblinger ovenfor for å hente feeds

Nå når vi åpner denne filen i nettleseren, bør vi se følgende side som inneholder de første elementene til vår leser.


Vær oppmerksom på at denne merkingen vil være perfekt for bruk av nettlesere som ikke kjører Javascript, i den forstand at siden fortsatt vil gi gyldige koblinger til feeds, men de ville åpenbart ta nettleseren til en ny plassering i stedet for å vise feeds i leseren vår.


Full Screencast



Trinn 3: Overstyr Linker Standard Onclick Event

Så langt, når vi klikker på en kobling, blir nettleseren din rettet til en ny plassering, stedet som er angitt i linkens href-attributt. Dette er den normale oppførselen til koblinger, men i dette tilfellet vil vi forhindre at nettleseren går hvor som helst og istedenfor henter URL-adressen asynkront, behandler svaret og skriver ut dataene i eksisterende oppslag, noe som betyr at vi ikke trenger å forlate nettstedet og nyhetsfeedene presenteres slik vi ønsker.

Åpne den tomme filen vi lagret som assets / feedreader.js (dette er hvor vi skal skrive skriptet vårt) og legg til følgende javascript:

 $ (dokument) .ready (funksjon () // Hook for å klikke hendelsen for ajax-feed-trigger-koblinger $ ('a.ajax-feed-trigger'). klikk (funksjon (e) // Forhindre standard klikk handling e.preventDefault (); // Store referanse til containerobjekt i lokal var var container = $ ('# ajax-feed-container'); // Tom beholder div og midlertidig legge til "loading" style container.empty (). addClass ('loading'); // Få lenker href attributt var href = $ (dette) .attr ('href'); varsel (href); // Få feed ved hjelp av jGFeed); / End a.ajax-feed- utløser klikkhendelse);

Koden ovenfor overstyrer standard oppførselen til linkene onclick-hendelsen ved hjelp av jQuery's klikkmetode på alle 'a' -koder av klasse 'ajax-feederutløser'. Innenfor klikkmetoden er det første som vi gjør, å forhindre at standardadferdene bruker javascript's preventDefault (), så tømmer vi container div, legger til lasteklassen som lar oss stilere lastetilstanden og for nå viser vi bare verdien av href-attributtet til den klikkte lenken. Vi vil bruke et anrop for å varsle () for å sjekke at koden fungerer så langt.

Tilbake i nettleseren, når vi klikker på koblingene, bør vi se en varslingsdialog med nettadressen til den klikkte lenken.



Trinn 4: Få nyhetsfeed som et JSON-objekt ved hjelp av jGFeed

Det neste trinnet vil være å sende den faktiske HTTP-forespørselen med jGFeed og sjekke at vi fikk svaret vi forventet.

JGFeed-pluginet tar følgende argumenter:

  • URL - URL til feedet du vil laste inn
  • tilbakeringing - tilbakeringingsfunksjon for å ringe etter at RSS-feed er lastet
  • num (valgfritt) - antall blogginnlegg å laste (standard til 3)
  • nøkkel (valgfritt) - Google API-nøkkel for bruk mens du laster inn RSS-feeder.

Mer informasjon om jGFeed:
http://jquery-howto.blogspot.com/2009/05/google-feeds-api-jquery-plugin.html

I dette eksemplet vil vi passere verdien av linkens href-attributt som url, en anonym tilbakeringingsfunksjon, og vi vil spesifisere at vi vil begrense resultatene til 5.

I aktiva / feedreader.js legger du anropet til jGFeed slik at manuskriptet nå skal se ut som oppføringen nedenfor:

 $ (dokument) .ready (funksjon () // Hook for å klikke hendelsen for ajax-feed-trigger-koblinger $ ('a.ajax-feed-trigger'). klikk (funksjon (e) // Forhindre standard klikk handling e.preventDefault (); // Store referanse til containerobjekt i lokal var var container = $ ('# ajax-feed-container'); // Tom beholder div og midlertidig legge til "loading" style container.empty (). addClass ('loading'); // Få linker href attributt var href = $ (dette) .attr ('href'); // Få feed ved hjelp av jGFeed $ .jGFeed (href, funksjon (feeds) // Se etter feil hvis (! feeds) // det oppstod en feil container.append ('Feil henter feed'); return false;, 5); // End jGFeed); // End a.ajax-feed-trigger-klikk begivenhet );

Vi kan nå bruke Firebug for å se hva jGFeed gjør. Klikk på noen av koblingene, åpne fanen 'Net' i Firebug og finn JSON-forespørselen. Det burde si noe som 'GET load? V1.0 & callback = jsonp12'. Hvis du utvider visningen, bør du kunne se JSON-objektet og dataene i den.



Trinn 5: Bygg opp merkingen for hver innmatning dynamisk

Nå som vi vet at vi får dataene, kan vi fortsette å gjøre noe med det. I dette tilfellet ønsker vi å iterere gjennom oppføringene i feedet og legge til en streng med HTML-merking til den eksisterende beholderen vi opprettet i vår index.html-fil.

Men før det gjennomføres gjennom oppføringene, må vi forberede beholderen. Vi skjuler diven for å sikre at vi ikke ser noe før vi er ferdig med å manipulere innholdet i containeretiketten. Vi fjerner også laste klassen som nå div er skjult og legger til fôrtittelen i en overskrift tag.

Vi bruker en for-løkke til å iterere over oppføringsegenskapene til feedsobjektet som returneres av jGFeed til vår tilbakeringingsfunksjon. Innenfor løkken bygger vi bare en streng med noe HTML-oppslag for å vise egenskapene til hver oppføring. Ved slutten av hver iterasjon legger vi til denne HTML-strengen i feedbeholderen.

Når vi er ferdig med å fylle container div med alle oppføringene, kaller vi JQuery's show () -metode for å falme i div og endelig gjøre den synlig igjen.

 $ (dokument) .ready (funksjon () // Hook for å klikke hendelsen for ajax-feed-trigger-koblinger $ ('a.ajax-feed-trigger'). klikk (funksjon (e) // Forhindre standard klikk handling e.preventDefault (); // Store referanse til containerobjekt i lokal var var container = $ ('# ajax-feed-container'); // Tom beholder div og midlertidig legge til "loading" style container.empty (). addClass ('loading'); // Få linker href attributt var href = $ (dette) .attr ('href'); // Få feed ved hjelp av jGFeed $ .jGFeed (href, funksjon (feeds) // Se etter feil hvis (! feeds) // det oppstod en feil container.append ('Feil henter feed'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

'); // Prosessmatoppføringer for (var i = 0; i'; html + = '
'; html + = entry.publishedDate + '
'; html + = '
Postet av '; html + = entry.author + '
'; html + = '
'; html + = entry.contentSnippet + '
'; html + = '
'; container.append (html); container.show ('slow'); , 5); // End jGFeed); // End a.ajax-feed-trigger-hendelsen;

Hvis du klikker på noen av koblingene, bør du se nyhetsfeedene som vist på skjermbildet nedenfor.



Trinn 6: Legge til en 'Les mer' -link for å vise hele innholdet i feedinnlegg

Ok, eksemplet ser ut til å fungere ganske bra, men det er fortsatt mye tweaking vi kunne gjøre. I dette tilfellet skal vi legge til en "les mer" type lenke som vil vise hele innholdet i oppføringen. Hittil har vi bare brukt innholdsneddelegenskapen i hvert oppføringsobjekt. Dette er nyttig fordi vi vil vise oppføringene i en kompakt liste, men vi har også det fulle innholdet i en annen egenskap som heter «innhold», så vi skal legge til en les mer (+/-) lenke som vil bytte mellom kutt og hele innholdet slik at vi kan lese hele innmatingsoppføringen uten å forlate siden vår.

For å gjøre dette må vi først legge til innholdet i HTML-strengen vi bygde inne i løkken, men vi skal sette høyden på innholdsdelene til null og deres overløp til "skjult" for å skjule dem som vi skal bare bruke dem til å holde de faktiske dataene. Vår lenke vil bare bytte innholdet i den "synlige" utdragsdivisjonen med den "usynlige" innholdsdivisjonen.

Like før vi viser feedet på slutten av tilbakeringingsfunksjonen vi passerte til jGFeed, må vi også legge til onclick event handler for våre "read more" linker. Vi gjør dette på samme måte som vi gjorde med koblingene vi bruker for å hente feedet, ved hjelp av jQuery's click () metode.

 $ (dokument) .ready (funksjon () // Hook for å klikke hendelsen for ajax-feed-trigger-koblinger $ ('a.ajax-feed-trigger'). klikk (funksjon (e) // Forhindre standard klikk handling e.preventDefault (); // Store referanse til containerobjekt i lokal var var container = $ ('# ajax-feed-container'); // Tom beholder div og midlertidig legge til "loading" style container.empty (). addClass ('loading'); // Få linker href attributt var href = $ (dette) .attr ('href'); // Få feed ved hjelp av jGFeed $ .jGFeed (href, funksjon (feeds) // Se etter feil hvis (! feeds) // det oppstod en feil container.append ('Feil henter feed'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

'); // Prosessmatoppføringer for (var i = 0; i'; html + = '
'; html + = entry.publishedDate + '
'; html + = '
Postet av '; html + = entry.author + '
'; html + = '
'; html + = entry.contentSnippet + '
'; html + = '
'; html + = '
+
'; html + = '
'; container.append (html); // Hook for å klikke hendelsen for ajax-feed-trigger-koblinger $ ('a.ajax-feed-readmore'). Klikk (funksjon (e) // Forhindre standard klikk handling e.preventDefault (); var content_id = $ (dette) .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 (); // Bytt tekstinnhold mellom divs content_div.html (snippet_txt); snippet_div.html (content_txt); hvis ($ (dette) .html () === '- ') $ (dette) .html (' + '); annet $ (dette) .html (' - ');); container.show ( 'sakte'); , 5); // End jGFeed); // End a.ajax-feed-trigger-hendelsen;

Leseren skal nå vise en '+' og '-' -knapp som skifter mellom innholdsbutt og hele innholdet for hver oppføring.



Trinn 7: Styling av leseren

Fôrleseren jobber nå ... hurra! Men la oss være ærlige, det ser ikke bra ut. Så la oss sette glasset på kaken. Nedenfor har jeg tatt med noen stilarter som et eksempel på hvordan leseren kunne bli skinnet. Du har kanskje lagt merke til at vi brukte klasser for hver av elementene i vår oppdeling, så det bør være relativt enkelt å referere til hvert element usin CSS selectors på samme måte som vi valgte dem med jQuery.

 / * Farger: rød: # C74C44 mørk rød: # 8C413A grå: # 3F474C mørk beige: # B5B095 beige: # DBD5B6 * / html farge: # F0F0F0; bakgrunnsfarge: # 8C413A; font-familie: "Helvetica", sans-serif;  kropp font-size: 12px; margin: 10px 20% 30px 20%;  div, ul, li margin: 0; polstring: 0;  img grense: 0;  li listestil: none;  h1, h2, h3 skriftstørrelse: 100%; font-weight: normal;  h1 farge: # DBD5B6; fontstørrelse: 4.6em; linjehøyde: 1.1em; tekstskygge: 1px 1px 0.3em # 3F474C; bakgrunnsbilde: url (logo.png); bakgrunn-gjentak: ikke-gjenta; polstring: 16px 0 0 148px; margin: 0px; høyde: 114px;  h2 farge: # DBD5B6; skriftstørrelse: 2.6em; tekstskygge: 1px 1px # 3F474C; polstring: 0; margin: 0 0 25px 0;  en farge: # DBD5B6; tekst-dekorasjon: ingen;  ul.menu margin: 44px 0px 24px 0px; polstring: 0px;  ul.menu li display: inline; margin: 0px 5px 0px 0px; polstring: 12px; bakgrunnsfarge: # 3F474C; grense: 1px solid # B5B095; -moz-grense-radius: 5px; -webkit-grense-radius: 5px; fontstørrelse: 1.2em; tekstskygge: 1px 1px # 3F474C;  ul.menu li: svever bakgrunnsfarge: # B5B095; tekstskygge: 1px 1px 0.2em # 3F474C;  div # ajax-feed-wrapper polstring: 20px; overløp: skjult; bakgrunnsfarge: # C74C44; grense: 1px solid # B5B095; -moz-grense-radius: 5px; -webkit-grense-radius: 5px;  .loading width: 36px; høyde: 36px; bakgrunnsbilde: url (ajax-loader.gif); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: 20px 20px;  div.ajax-feed-element bakgrunnsfarge: # 8C413A; polstring: 10px; margin-bunn: 10px;  div.ajax-feed-element h3 font-size: 1.8em; tekstskygge: 1px 1px 0.3em # 3F474C; polstring: 0; margin: 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; polstring: 15px 5px 5px 5px; border-top: 1px solid # C74C44; tekstskygge: 1px 1px # 3F474C;  a.ajax-feed-readmore display: tabell-celle; polstring: 1px 5px; grense: 1px solid # DBD5B6;  a.ajax-feed-readmore: svever bakgrunnsfargen: # B5B095; 

Voila! Det ser allerede mye bedre ut ;-)