Ce tutoriel montre comment utiliser jQuery et le plugin jGFeed pour récupérer des flux de nouvelles à distance et écrire les résultats dans le balisage existant. jGFeed est un plugin jQuery qui vous permet d'obtenir «n'importe quel flux RSS depuis un hôte» et de retourner un objet JSON pour une utilisation facile..
Ce tutoriel comprend un screencast disponible pour les membres Tuts + Premium.
L'exemple de code de ce didacticiel peut ne pas fonctionner dans Internet Explorer 7 ou une version antérieure, mais il a été testé avec succès sur Firefox, Safari, Chrome et IE8..
Avant de commencer à écrire du code, créons un répertoire dans lequel placer les fichiers du lecteur de flux. J'ai créé un répertoire dans mon bureau appelé "feedreader". Dans ce répertoire, créez-en un autre appelé actifs.
Nous devrons également télécharger une copie de la source jGFeed. Vous pouvez le faire ici. Pour cet exemple, j'ai téléchargé la version compressée du fichier et l'ai placée dans le répertoire "assets"..
Enfin, créons des fichiers texte vides pour contenir le balisage, le javascript et les styles. J'ai créé la structure de fichier suivante:
| - actifs | | - feedreader.js | | - jquery.jgfeed-min.js | '- styles.css' - index.html
La structure du fichier devrait ressembler à quelque chose comme:
Notez que index.html, feedreader.js et styles.css doivent être vides à ce stade..
Notre balisage pour ce tutoriel va être très simple, et nous supposons que vous connaissez déjà un peu le HTML, nous allons donc tout présenter en même temps..
Dans notre fichier index.html, nous allons créer un lien vers la feuille de style que nous utiliserons plus tard pour nommer le lecteur de flux, puis ajouter une liste de liens aux flux que nous voulons obtenir et enfin ajouter les fichiers javascript nécessaires à l'exemple..
Notez que nous ajoutons les fichiers Javascript à la fin du corps. Cela améliore la vitesse de chargement perçue de vos pages, car le navigateur peut commencer à afficher les résultats sans avoir à attendre que les scripts soient chargés..
Ajoutez le balisage suivant à index.html:
jQuery + jGFeed Exemple de lecteur de flux AJAX jQuery + jGFeed Exemple de lecteur de flux AJAX
Maintenant, lorsque nous ouvrons ce fichier dans le navigateur Web, la page suivante devrait contenir les éléments initiaux de notre lecteur de flux..
Notez que ce balisage serait parfaitement fonctionnel pour les navigateurs n’exécutant pas le langage javascript, en ce sens que la page offrirait toujours des liens valides vers les flux, mais qu’ils emmèneraient évidemment le navigateur dans un nouvel emplacement au lieu d’afficher les flux dans notre lecteur..
Jusqu'à présent, lorsque nous cliquons sur un lien, notre navigateur est dirigé vers un nouvel emplacement, l'emplacement spécifié dans l'attribut 'href' du lien. C'est le comportement normal des liens, mais dans ce cas, nous voulons empêcher le navigateur de naviguer n'importe où. Nous allons plutôt récupérer l'URL de manière asynchrone, traiter la réponse et imprimer les données dans le balisage existant, ce qui signifie que nous ne devons pas quitter le site. et les flux de nouvelles sont présentés comme nous le voulons.
Ouvrez le fichier vide que nous avons enregistré sous assets / feedreader.js (c'est ici que nous allons écrire notre script) et ajoutez le javascript suivant:
$ (document) .ready (function () // Accroche à l'événement click pour les liens ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (fonction (e) // Empêche l'action de clic par défaut e.preventDefault (); // Stocke la référence à un objet conteneur dans une variable var var conteneur = $ ('# ajax-feed-container'); // vide la div du conteneur et ajoute temporairement le style "chargement" conteneur.empty (). addClass ('loading'); // Obtenir les liens href attribut var href = $ (this) .attr ('href'); alert (href); // Obtenir le flux en utilisant jGFeed); // End a.ajax-feed- déclencher un événement de clic);
Le code ci-dessus annule le comportement par défaut de l'événement links onclick à l'aide de la méthode de clic de jQuery sur toutes les balises 'a' de la classe 'déclencheur ajax-feed'. Dans la méthode click, la première chose à faire est d’empêcher le comportement par défaut à l’aide de preventDefault () de javascript, puis nous vidons le conteneur div, ajoutons la classe de chargement qui nous permettra de styliser le «statut» de chargement et pour l’instant nous affichons simplement la valeur de l'attribut href du lien cliqué. Nous allons utiliser un appel à alert () pour vérifier que notre code fonctionne jusqu'à présent.
De retour dans le navigateur, lorsque nous cliquons sur les liens, nous devrions voir une boîte de dialogue d'alerte avec l'URL du lien cliqué..
La prochaine étape consistera à envoyer la requête HTTP réelle avec jGFeed et à vérifier que nous avons obtenu la réponse attendue..
Le plugin jGFeed prend les arguments suivants:
Plus d'infos sur jGFeed:
http://jquery-howto.blogspot.com/2009/05/google-feeds-api-jquery-plugin.html
Dans cet exemple, nous allons passer la valeur de l'attribut href du lien sous la forme de l'URL, une fonction de rappel anonyme, et indiquer que nous voulons limiter les résultats à 5..
Dans assets / feedreader.js, ajoutez l'appel à jGFeed afin que le script ressemble maintenant à la liste ci-dessous:
$ (document) .ready (function () // Accroche à l'événement click pour les liens ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (fonction (e) // Empêche l'action de clic par défaut e.preventDefault (); // Stocke la référence à un objet conteneur dans une variable var var conteneur = $ ('# ajax-feed-container'); // vide la div du conteneur et ajoute temporairement le style "chargement" conteneur.empty (). addClass ('loading'); // Obtenir les liens href attribut var href = $ (this) .attr ('href'); // Obtenir le flux en utilisant jGFeed $ .jGFeed (href, function (feeds) // Vérifie les erreurs si (! feeds) // une erreur est survenue container.append ('Erreur lors de la récupération du flux.'); return false;, 5); // End jGFeed); // Fin d'un clic sur un fichier.ajax-feed-trigger un événement );
Nous pouvons maintenant utiliser Firebug pour voir ce que fait jGFeed. Cliquez sur l'un des liens, ouvrez l'onglet "Net" dans Firebug et localisez la demande JSON. Il devrait dire quelque chose comme 'GET load? V1.0 & callback = jsonp12'. Si vous développez la vue, vous devriez pouvoir voir l’objet JSON et les données qu’il contient..
Maintenant que nous savons que nous obtenons les données, nous pouvons procéder avec quelque chose. Dans ce cas, nous souhaitons parcourir les entrées du flux et ajouter une chaîne avec un balisage HTML au conteneur existant créé dans notre fichier index.html..
Cependant, avant de parcourir les entrées, nous devons préparer le conteneur. Nous masquons la div pour nous assurer de ne rien voir jusqu'à ce que nous ayons fini de manipuler le contenu de la balise conteneur. Nous supprimons également la classe de chargement car la div est maintenant masquée et ajoutons le titre du flux dans une balise de titre.
Nous utilisons une boucle for pour parcourir la propriété entry de l'objet feeds renvoyé par jGFeed à notre fonction de rappel. Dans la boucle, nous construisons simplement une chaîne avec une balise HTML pour afficher les propriétés de chaque entrée. A la fin de chaque itération, nous ajoutons cette chaîne HTML au conteneur de flux..
Une fois que nous avons fini de renseigner le conteneur div avec toutes les entrées, nous appelons la méthode show () de JQuery pour afficher en fondu le div et le rendre à nouveau visible..
$ (document) .ready (function () // Accroche à l'événement click pour les liens ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (fonction (e) // Empêche l'action de clic par défaut e.preventDefault (); // Stocke la référence à un objet conteneur dans une variable var var conteneur = $ ('# ajax-feed-container'); // vide la div du conteneur et ajoute temporairement le style "chargement" conteneur.empty (). addClass ('loading'); // Obtenir les liens href attribut var href = $ (this) .attr ('href'); // Obtenir le flux en utilisant jGFeed $ .jGFeed (href, function (feeds) // Vérifie les erreurs si (! feeds) // une erreur s'est produite container.append ('Erreur lors de l'extraction du flux.'); return false; container.hide (); container.removeClass ('loading'); container.append (''+ feeds.title +'
'); // Traiter les entrées de flux pour (var i = 0; i'; html + = entry.title + '
'; html + = ''; html + = entry.publishedDate + ''; html + = 'Posté par '; html + = entry.author + ''; html + = ''; html + = entry.contentSnippet + ''; html + = '
Si vous cliquez sur l'un des liens maintenant, vous devriez voir les flux de nouvelles, comme indiqué dans la capture d'écran ci-dessous..
Ok, l'exemple semble fonctionner plutôt bien, mais nous pouvons encore apporter beaucoup de modifications. Dans ce cas, nous allons ajouter un type de lien "lire plus" qui affichera le contenu complet de l'entrée. Jusqu'à présent, nous n'avions utilisé que la propriété contentSnippet dans chaque objet d'entrée. Ceci est utile car nous souhaitons afficher les entrées dans une liste compacte, mais nous avons également le contenu complet dans une autre propriété appelée 'contenu'. Nous allons donc ajouter un lien en savoir plus (+/-) qui basculera entre les extrait et le contenu complet afin que nous puissions lire l’entrée entière du flux sans quitter notre page.
Pour ce faire, nous devons d’abord ajouter le contenu à la chaîne HTML que nous étions en train de construire à l’intérieur de la boucle, mais nous allons définir la hauteur des div du contenu à zéro et leur débordement à «masqué» afin de les masquer car vont seulement les utiliser pour contenir les données réelles. Notre lien échangera simplement le contenu de la div de l'extrait 'visible' avec la div de contenu 'invisible'.
Juste avant d'afficher le flux à la fin de la fonction de rappel que nous avons transmise à jGFeed, nous devrons également ajouter le gestionnaire d'événements onclick pour nos liens "En savoir plus". Nous procédons de la même manière que nous le faisions avec les liens que nous utilisons pour récupérer le flux, en utilisant la méthode click () de jQuery..
$ (document) .ready (function () // Accroche à l'événement click pour les liens ajax-feed-trigger $ ('a.ajax-feed-trigger'). click (fonction (e) // Empêche l'action de clic par défaut e.preventDefault (); // Stocke la référence à un objet conteneur dans une variable var var conteneur = $ ('# ajax-feed-container'); // vide la div du conteneur et ajoute temporairement le style "chargement" conteneur.empty (). addClass ('loading'); // Obtenir les liens href attribut var href = $ (this) .attr ('href'); // Obtenir le flux en utilisant jGFeed $ .jGFeed (href, function (feeds) // Vérifie les erreurs si (! feeds) // une erreur s'est produite container.append ('Erreur lors de l'extraction du flux.'); return false; container.hide (); container.removeClass ('loading'); container.append (''+ feeds.title +'
'); // Traiter les entrées de flux pour (var i = 0; i'; html + = entry.title + '
'; html + = ''; html + = entry.publishedDate + ''; html + = 'Posté par '; html + = entry.author + ''; html + = ''; html + = entry.contentSnippet + ''; html + = ''; html + = entry.content + ''; html + = '+'; html + = '
Le lecteur doit maintenant afficher les boutons '+' et '-' qui permettent de basculer entre l'extrait de contenu et le contenu complet de chaque entrée..
Le lecteur de flux fonctionne maintenant… hourra! Mais soyons honnêtes, ça n'a pas l'air bien. Alors mettons la cerise sur le gâteau. Ci-dessous, j'ai inclus quelques styles comme exemple de la manière dont le lecteur pourrait être dépouillé. Vous avez peut-être remarqué que nous utilisions des classes pour chacun des éléments de notre balisage. Il devrait donc être relativement facile de faire référence à chaque élément à l'aide de sélecteurs CSS de la même manière que nous les avions sélectionnés avec jQuery..
/ * Couleurs: rouge: # C74C44 rouge foncé: # 8C413A gris: # 3F474C beige foncé: # B5B095 beige: # DBD5B6 * / html color: # F0F0F0; couleur de fond: # 8C413A; font-family: "Helvetica", sans-serif; body taille de la police: 12px; marge: 10px 20% 30px 20%; div, ul, li margin: 0; rembourrage: 0; img border: 0; li style de liste: aucun; h1, h2, h3 taille de la police: 100%; poids de police: normal; h1 color: # DBD5B6; taille de police: 4.6em; hauteur de ligne: 1.1em; text-shadow: 1px 1px 0.3em # 3F474C; background-image: url (logo.png); répétition de fond: non répétée; remplissage: 16px 0 0 148px; marge: 0px; hauteur: 114px; h2 color: # DBD5B6; taille de police: 2.6em; ombre du texte: 1px 1px # 3F474C; rembourrage: 0; marge: 0 0 25 pixels 0; a color: # DBD5B6; texte-décoration: aucun; ul.menu margin: 44px 0px 24px 0px; remplissage: 0px; ul.menu li display: inline; marge: 0px 5px 0px 0px; rembourrage: 12px; couleur de fond: # 3F474C; bordure: solide 1px # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px; taille de police: 1.2em; ombre du texte: 1px 1px # 3F474C; ul.menu li: survoler background-color: # B5B095; ombre du texte: 1px 1px 0.2em # 3F474C; div # ajax-feed-wrapper padding: 20px; débordement caché; couleur de fond: # C74C44; bordure: solide 1px # B5B095; -moz-border-radius: 5px; -webkit-border-radius: 5px; .loading width: 36px; hauteur: 36px; image d’arrière-plan: url (ajax-loader.gif); répétition de fond: non répétée; position de fond: 20px 20px; div.ajax-feed-item background-color: # 8C413A; rembourrage: 10px; marge inférieure: 10px; div.ajax-feed-item h3 taille de la police: 1.8em; text-shadow: 1px 1px 0.3em # 3F474C; rembourrage: 0; marge: 3px 0 15px 0; div.ajax-feed-date, div.ajax-feed-author taille de la police: 0.8em; div.ajax-feed-content-snippet marge: 3px 0px 10px 0px; remplissage: 15px 5px 5px 5px; bord supérieur: solide 1px # C74C44; ombre du texte: 1px 1px # 3F474C; a.ajax-feed-readmore display: table-cell; rembourrage: 1px 5px; bordure: 1px solide # DBD5B6; a.ajax-feed-readmore: survoler background-color: # B5B095;
Voila! Cela semble déjà beaucoup mieux ;-)