Bouw een RSS-feedslezer met jQuery en jGFeed

Deze tutorial laat zien hoe je jQuery en de jGFeed plug-in kunt gebruiken om nieuwsfeeds op afstand op te halen en de resultaten in de bestaande opmaak te schrijven. jGFeed is een jQuery-plug-in waarmee u 'elke' RSS-feed van 'elke' host kunt ophalen en een JSON-object retourneert voor eenvoudig gebruik.

Deze tutorial bevat een screencast die beschikbaar is voor leden van Tuts + Premium.

De voorbeeldcode in deze zelfstudie werkt mogelijk niet in Internet Explorer 7 of eerder, maar is met succes getest in Firefox, Safari, Chrome en IE8.


Stap 1: De bestanden voor de zelfstudie ordenen

Voordat we beginnen met het schrijven van een code, laten we een map maken waar de feedlezerbestanden worden geplaatst. Ik heb een map op mijn bureaublad gemaakt met de naam 'feedreader'. In deze map maakt u een nieuwe met de naam assets.

We zullen ook een kopie van de jGFeed-bron moeten downloaden. Je kunt dit hier doen. Voor dit voorbeeld heb ik de gecomprimeerde versie van het bestand gedownload en in de map 'assets' geplaatst.

Laten we tot slot enkele lege tekstbestanden maken om de markup, javascript en stijlen te behouden. Ik heb de volgende bestandsstructuur gemaakt:

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

De bestandsstructuur zou er ongeveer zo uit moeten zien:


Merk op dat index.html, feedreader.js en styles.css in dit stadium leeg moeten zijn.


Stap 2: De markup

Onze opmaak voor deze tutorial zal heel eenvoudig zijn, en we gaan ervan uit dat je al wat HTML kent, dus we introduceren het allemaal tegelijk.

In ons index.html-bestand zullen we linken naar het stylesheet dat we later zullen gebruiken om de feedlezer te stijlen, vervolgens een lijst met links toevoegen aan de feeds die we willen krijgen en tenslotte de javascript-bestanden toevoegen die nodig zijn voor het voorbeeld.

Merk op dat we de Javascript-bestanden aan het einde van de body toevoegen. Dit is om de waargenomen laadsnelheid van uw pagina's te verbeteren, omdat de browser de uitvoer kan weergeven zonder te moeten wachten tot de scripts zijn geladen.

Voeg de volgende markup toe aan index.html:

     jQuery + jGFeed AJAX Feed Reader Voorbeeld    

jQuery + jGFeed AJAX Feed Reader Voorbeeld

  • .lupomontero
  • Nettuts+
  • jQuery
  • JQuery leren
Klik op bovenstaande links om feeds op te halen

Wanneer we nu dit bestand in de webbrowser openen, zien we de volgende pagina met de eerste elementen voor onze feedlezer.


Merk op dat deze opmaak perfect functioneel zou zijn voor browsers die geen Javascript gebruiken, in die zin dat de pagina nog steeds geldige links naar de feeds zou bieden, maar ze zouden de browser natuurlijk naar een nieuwe locatie brengen in plaats van de feeds in onze lezer weer te geven.


Volledige screencast



Stap 3: Overschrijf de standaard Onclick-gebeurtenis van de koppelingen

Tot nu toe, wanneer we op een link klikken, wordt onze browser naar een nieuwe locatie geleid, de locatie die is opgegeven in het kenmerk 'href' van de link. Dit is het normale gedrag van links, maar in dit geval willen we voorkomen dat de browser ergens naartoe gaat en in plaats daarvan de URL asynchroon ophalen, het antwoord verwerken en de gegevens afdrukken binnen de bestaande opmaak, wat betekent dat we de site niet hoeven te verlaten en de nieuwsfeeds worden gepresenteerd zoals we dat willen.

Open het lege bestand dat we hebben opgeslagen als assets / feedreader.js (dit is waar we ons script gaan schrijven) en voeg het volgende javascript toe:

 $ (document) .ready (function () // Hook-to-click-gebeurtenis voor ajax-feed-trigger-links $ ('a.ajax-feed-trigger'). klik (functie (e) // Voorkomen dat standaard klikactie e.preventDefault (); // Bewaar verwijzing naar containerobject in lokale var var container = $ ('# ajax-feed-container'); // Maak container-div leeg en voeg tijdelijk "laden" -stijl toe container.empty (). addClass ('laden') // Koppelingen krijgen href-kenmerk var href = $ (this) .attr ('href'); alert (href); // Haal feed op met jGFeed); // End a.ajax-feed- trigger klikgebeurtenis);

De bovenstaande code overschrijft het standaardgedrag van de onclick-gebeurtenis met links met behulp van de klikmethode van jQuery op alle 'a'-tags van klasse' ajax-feed trigger '. Binnen de klikmethode is het eerste wat we doen het voorkomen van het standaardgedrag met behulp van javascript's preventDefault (), dan legen we de container div, voegen we de laadklasse toe die ons in staat zal stellen om de ladende 'staat' te stylen en nu laten we alleen de waarde zien van het href-kenmerk van de aangeklikte koppeling. We gebruiken een oproep om te waarschuwen () om te controleren of onze code tot nu toe werkt.

Terug in de browser, wanneer we op de links klikken, zouden we een waarschuwingsdialoog moeten zien met de URL van de geklikte link.



Stap 4: De nieuwsfeed verkrijgen als een JSON-object met jGFeed

De volgende stap is om het daadwerkelijke HTTP-verzoek met jGFeed te verzenden en te controleren of we het antwoord hebben dat we verwachtten.

De jGFeed-plug-in neemt de volgende argumenten:

  • url - URL van de feed die u wilt laden
  • callback - callback-functie om te bellen nadat RSS-feed is geladen
  • aantal (optioneel) - aantal te laden blogitems (standaard 3)
  • sleutel (optioneel) - Google API-sleutel om te gebruiken tijdens het laden van RSS-feeds.

Meer info over jGFeed:
http://jquery-howto.blogspot.com/2009/05/google-feeds-api-jquery-plugin.html

In dit voorbeeld zullen we de waarde van het href-kenmerk van de link doorgeven als de URL, een anonieme callback-functie en we zullen specificeren dat we de resultaten willen beperken tot 5.

Voeg in assets / feedreader.js de aanroep toe aan jGFeed, zodat het script er nu als volgt uit moet zien te zien:

 $ (document) .ready (function () // Hook-to-click-gebeurtenis voor ajax-feed-trigger-links $ ('a.ajax-feed-trigger'). klik (functie (e) // Voorkomen dat standaard klikactie e.preventDefault (); // Bewaar verwijzing naar containerobject in lokale var var container = $ ('# ajax-feed-container'); // Maak container-div leeg en voeg tijdelijk "laden" -stijl toe container.empty (). addClass ('laden'); // Koppelingen krijgen href-kenmerk var href = $ (this) .attr ('href'); // Krijg feed met jGFeed $ .jGFeed (href, function (feeds) // Controleer op fouten als (! feeds) // er was een fout container.append ('Fout bij ophalen feeds'); return false;, 5); // End jGFeed); // End a.ajax-feed-trigger klik event);

We kunnen nu Firebug gebruiken om te zien wat jGFeed aan het doen is. Klik op een van de koppelingen, open het tabblad 'Net' in Firebug en zoek het JSON-verzoek. Het zou iets moeten zeggen als 'GET load? V1.0 & callback = jsonp12'. Als u de weergave uitvouwt, moet u het JSON-object en de gegevens erin kunnen zien.



Stap 5: De markup voor elke feedvermelding dynamisch opbouwen

Nu we weten dat we de gegevens krijgen, kunnen we er iets mee doen. In dit geval willen we de invoer in de feed herhalen en een tekenreeks met HTML-markering toevoegen aan de bestaande container die we hebben gemaakt in ons index.html-bestand.

Voordat we echter de items doorlopen, moeten we de container voorbereiden. We verbergen de div om ervoor te zorgen dat we niets zien totdat we klaar zijn met het manipuleren van de inhoud van de containertag. We verwijderen ook de laadklasse zoals nu de div verborgen is en voegen de feedtitel toe aan een heading-tag.

We gebruiken een for-lus om de eigenschappen entry van het feeds-object dat door jGFeed is geretourneerd naar onze callback-functie te herhalen. Binnen de lus bouwen we eenvoudig een string met een beetje HTML-markering om de eigenschappen van elk item weer te geven. Aan het einde van elke iteratie voegen we deze HTML-tekenreeks toe aan de feedcontainer.

Zodra we klaar zijn met het vullen van de container-div met alle ingangen die we JQuery's show () -methode noemen om de div in te faden en deze eindelijk weer zichtbaar te maken.

 $ (document) .ready (function () // Hook-to-click-gebeurtenis voor ajax-feed-trigger-links $ ('a.ajax-feed-trigger'). klik (functie (e) // Voorkomen dat standaard klikactie e.preventDefault (); // Bewaar verwijzing naar containerobject in lokale var var container = $ ('# ajax-feed-container'); // Maak container-div leeg en voeg tijdelijk "laden" -stijl toe container.empty (). addClass ('laden'); // Koppelingen krijgen href-kenmerk var href = $ (this) .attr ('href'); // Krijg feed met jGFeed $ .jGFeed (href, function (feeds) // Controleer op fouten als (! feeds) // er was een fout container.append ('Fout bij ophalen feeds.'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

'); // Process feed entries for (var i = 0; i'; html + = '
'; html + = entry.publishedDate + '
'; html + = '
Gepost door '; html + = entry.author + '
'; html + = '
'; html + = entry.contentSnippet + '
'; html + = '
'; container.append (html); container.show ('langzaam'); , 5); // End jGFeed); // Beëindig a.ajax-feed-trigger klikgebeurtenis);

Als u nu op een van de links klikt, ziet u de nieuwsfeeds zoals weergegeven in de onderstaande schermafbeelding.



Stap 6: Een link 'Meer lezen' toevoegen om de volledige inhoud van feedinvoer weer te geven

Ok, het voorbeeld lijkt vrij goed te werken, maar er kan nog steeds veel worden aangepast. In dit geval gaan we een 'lees meer' type koppeling toevoegen die de volledige inhoud van het item weergeeft. Tot nu toe hebben we alleen de eigenschap contentSnippet in elk invoerobject gebruikt. Dit is handig omdat we de vermeldingen in een compacte lijst willen weergeven, maar we hebben ook de volledige inhoud in een andere eigenschap met de naam 'inhoud', dus we gaan een lees meer (+/-) koppeling toevoegen die zal schakelen tussen de snippet en de volledige inhoud, zodat we de hele feed kunnen lezen zonder onze pagina te verlaten.

Om dit te doen, moeten we eerst de inhoud toevoegen aan de HTML-reeks die we in de loop bouwden, maar we gaan de hoogte van de content-divs op nul zetten en hun overloop naar 'hidden' om ze te verbergen als we zullen ze alleen gebruiken om de feitelijke gegevens te bewaren. Onze link zal eenvoudigweg de inhoud van de 'zichtbare' snippet div vervangen door de 'invisible' content div.

Vlak voordat we de feed laten zien aan het einde van de callback-functie die we hebben doorgegeven aan jGFeed, moeten we ook de onclick event-handler toevoegen voor onze 'lees meer'-links. We doen dit op dezelfde manier als we deden met de links die we gebruiken om de feed op te halen, met behulp van jQuery's click () methode.

 $ (document) .ready (function () // Hook-to-click-gebeurtenis voor ajax-feed-trigger-links $ ('a.ajax-feed-trigger'). klik (functie (e) // Voorkomen dat standaard klikactie e.preventDefault (); // Bewaar verwijzing naar containerobject in lokale var var container = $ ('# ajax-feed-container'); // Maak container-div leeg en voeg tijdelijk "laden" -stijl toe container.empty (). addClass ('laden'); // Koppelingen krijgen href-kenmerk var href = $ (this) .attr ('href'); // Krijg feed met jGFeed $ .jGFeed (href, function (feeds) // Controleer op fouten als (! feeds) // er was een fout container.append ('Fout bij ophalen feeds.'); return false; container.hide (); container.removeClass ('loading'); container.append ('

'+ feeds.title +'

'); // Process feed entries for (var i = 0; i'; html + = '
'; html + = entry.publishedDate + '
'; html + = '
Gepost door '; html + = entry.author + '
'; html + = '
'; html + = entry.contentSnippet + '
'; html + = '
'; html + = '
+
'; html + = '
'; container.append (html); // Hook-to-click-gebeurtenis voor ajax-feed-trigger links $ ('a.ajax-feed-readmore'). Klik (functie (e) // Voorkomen van standaard klikactie 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 (); // Wissel tekstinhoud uit tussen divs content_div.html (snippet_txt); snippet_div.html (content_txt); if ($ (this) .html () === '- ') $ (this) .html (' + '); else $ (this) .html (' - ');); container.show ( 'slow'); , 5); // End jGFeed); // Beëindig a.ajax-feed-trigger klikgebeurtenis);

De lezer moet nu een '+' en '-' knop weergeven die schakelt tussen het inhoudsfragment en de volledige inhoud voor elk item.



Stap 7: De Reader stylen

De feedlezer werkt nu ... hoera! Maar laten we eerlijk zijn, het ziet er niet erg goed uit. Dus laten we de kers op de taart zetten. Hieronder heb ik enkele stijlen opgenomen als een voorbeeld van hoe de lezer gevild kan worden. Het is je misschien opgevallen dat we klassen hebben gebruikt voor elk van de elementen in onze markup, dus het zou relatief eenvoudig moeten zijn om naar elk element te verwijzen dat gebruik maakt van CSS selectors op dezelfde manier als dat we ze met jQuery hebben geselecteerd.

 / * Kleuren: rood: # C74C44 donkerrood: # 8C413A grijs: # 3F474C donker beige: # B5B095 beige: # DBD5B6 * / html color: # F0F0F0; achtergrondkleur: # 8C413A; font-family: "Helvetica", sans-serif;  body font-size: 12px; marge: 10px 20% 30px 20%;  div, ul, li margin: 0; opvulling: 0;  img border: 0;  li list-style: none;  h1, h2, h3 font-size: 100%; font-gewicht: normaal;  h1 color: # DBD5B6; font-size: 4.6em; regelhoogte: 1.1em; tekstschaduw: 1px 1px 0.3em # 3F474C; achtergrondafbeelding: url (logo.png); achtergrondherhaling: geen herhaling; opvulling: 16px 0 0 148px; marge: 0px; hoogte: 114 px;  h2 color: # DBD5B6; lettergrootte: 2,6 em; tekstschaduw: 1px 1px # 3F474C; opvulling: 0; marge: 0 0 25px 0;  a color: # DBD5B6; tekstdecoratie: geen;  ul.menu marge: 44px 0px 24px 0px; opvulling: 0px;  ul.menu li display: inline; marge: 0px 5px 0px 0px; opvulling: 12px; achtergrondkleur: # 3F474C; rand: 1px vast # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px; lettergrootte: 1.2em; tekstschaduw: 1px 1px # 3F474C;  ul.menu li: hover background-colour: # B5B095; tekstschaduw: 1px 1px 0.2em # 3F474C;  div # ajax-feed-wrapper opvulling: 20px; overloop verborgen; achtergrondkleur: # C74C44; rand: 1px vast # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px;  .loading width: 36px; hoogte: 36px; background-image: url (ajax-loader.gif); achtergrondherhaling: geen herhaling; achtergrond-positie: 20px 20px;  div.ajax-feed-item achtergrondkleur: # 8C413A; opvulling: 10px; margin-bottom: 10px;  div.ajax-feed-item h3 font-size: 1.8em; tekstschaduw: 1px 1px 0.3em # 3F474C; opvulling: 0; marge: 3px 0 15px 0;  div.ajax-feed-date, div.ajax-feed-auteur font-size: 0.8em;  div.ajax-feed-content-snippet margin: 3px 0px 10px 0px; opvulling: 15px 5px 5px 5px; border-top: 1px solid # C74C44; tekstschaduw: 1px 1px # 3F474C;  a.ajax-feed-readmore display: table-cell; opvulling: 1px 5px; rand: 1px vast # DBD5B6;  a.ajax-feed-readmore: hover background-colour: # B5B095; 

Voila! Dat ziet er al een stuk beter uit ;-)