PHP 和 AJAX RSS 阅读器

RSS 阅读器用于阅读 RSS Feed。

RSS 允许对新闻和更新进行快速浏览。

AJAX RSS 阅读器

在下面的 AJAX 实例中,我们将演示一个 RSS 阅读器,通过它,来自 RSS 的内容在不进行刷新的情况下载入网页。

HTML 表单

这是 HTML 页面。它包含一个简单的 HTML 表单和执行一个 JavaScript 文件的链接:

  1. <html>
  2. <head>
  3. <script type="text/javascript" src="getrss.js"></script>
  4. </head>
  5. <body>
  6.  
  7. <form>
  8. Select an RSS-Feed:
  9. <select onchange="showRSS(this.value)">
  10. <option value="Google">Google News</option>
  11. <option value="MSNBC">MSNBC News</option>
  12. </select>
  13. </form>
  14.  
  15. <p><div id="rssOutput">
  16. <b>RSS Feed will be listed here.</b></div></p>
  17. </body>
  18. </html>

例子解释 - HTML 表单

正如您看到的,上面的 HTML 页面包含一个简单的 HTML 表单,其中带有一个下拉列表框。

表单是这样工作的:

  • 当用户选择下拉框中的选项时,会触发一个事件
  • 当事件触发时,执行 showRSS() 函数

表单下面是名为 "rssOutput" 的一个 <div>。它用作 showRSS() 函数所返回的数据的占位符。

JavaScript

JavaScript 代码存储在 "getrss.js" 中,它与 HTML 文档相连接:

  1. var xmlHttp
  2.  
  3. function showRSS(str)
  4. {
  5. xmlHttp=GetXmlHttpObject()
  6. if (xmlHttp==null)
  7. {
  8. alert ("Browser does not support HTTP Request")
  9. return
  10. }
  11. var url="getrss.php"
  12. url=url+"?q="+str
  13. url=url+"&sid="+Math.random()
  14. xmlHttp.onreadystatechange=stateChanged
  15. xmlHttp.open("GET",url,true)
  16. xmlHttp.send(null)
  17. }
  18.  
  19. function stateChanged()
  20. {
  21. if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
  22. {
  23. document.getElementById("rssOutput")
  24. .innerHTML=xmlHttp.responseText
  25. }
  26. }
  27.  
  28. function GetXmlHttpObject()
  29. {
  30. var xmlHttp=null;
  31. try
  32. {
  33. // Firefox, Opera 8.0+, Safari
  34. xmlHttp=new XMLHttpRequest();
  35. }
  36. catch (e)
  37. {
  38. // Internet Explorer
  39. try
  40. {
  41. xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  42. }
  43. catch (e)
  44. {
  45. xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  46. }
  47. }
  48. return xmlHttp;
  49. }

例子解释:

stateChanged() 和 GetXmlHttpObject 函数与 PHP 和 AJAX 请求 这一节中的例子相同。

showRSS() 函数

每当在下拉框中选择选择时,该函数就会执行:

  • 定义发送到服务器的 url (文件名)
  • 把参数 (q) 添加到 url,参数内容是下拉框中的被选项
  • 添加一个随机数,以防止服务器缓存文件
  • 调用 GetXmlHttpObject 函数来创建 XMLHTTP 对象,并告知该对象在触发一个改变时去执行 stateChanged 函数
  • 通过给定的 url 来打开 XMLHTTP
  • 把 HTTP 请求发动到服务器

PHP 页面

调用 JavaScript 代码的服务器页面是名为 "getrss.php" 的 PHP 文件:

  1. <?php
  2. //get the q parameter from URL
  3. $q=$_GET["q"];
  4.  
  5. //find out which feed was selected
  6. if($q=="Google")
  7. {
  8. $xml=("http://news.google.com/news?ned=us&topic=h&output=rss");
  9. }
  10. elseif($q=="MSNBC")
  11. {
  12. $xml=("http://rss.msnbc.msn.com/id/3032091/device/rss/rss.xml");
  13. }
  14.  
  15. $xmlDoc = new DOMDocument();
  16. $xmlDoc->load($xml);
  17.  
  18. //get elements from "<channel>"
  19. $channel=$xmlDoc->getElementsByTagName('channel')->item(0);
  20. $channel_title = $channel->getElementsByTagName('title')
  21. ->item(0)->childNodes->item(0)->nodeValue;
  22. $channel_link = $channel->getElementsByTagName('link')
  23. ->item(0)->childNodes->item(0)->nodeValue;
  24. $channel_desc = $channel->getElementsByTagName('description')
  25. ->item(0)->childNodes->item(0)->nodeValue;
  26.  
  27. //output elements from "<channel>"
  28. echo("<p><a href='" . $channel_link
  29. . "'>" . $channel_title . "</a>");
  30. echo("<br />");
  31. echo($channel_desc . "</p>");
  32.  
  33. //get and output "<item>" elements
  34. $x=$xmlDoc->getElementsByTagName('item');
  35. for ($i=0; $i<=2; $i++)
  36. {
  37. $item_title=$x->item($i)->getElementsByTagName('title')
  38. ->item(0)->childNodes->item(0)->nodeValue;
  39. $item_link=$x->item($i)->getElementsByTagName('link')
  40. ->item(0)->childNodes->item(0)->nodeValue;
  41. $item_desc=$x->item($i)->getElementsByTagName('description')
  42. ->item(0)->childNodes->item(0)->nodeValue;
  43.  
  44. echo ("<p><a href='" . $item_link
  45. . "'>" . $item_title . "</a>");
  46. echo ("<br />");
  47. echo ($item_desc . "</p>");
  48. }
  49. ?>

例子解释:

当一个选项从 JavaScript 发送时,会发生:

  • PHP 找出哪个 RSS feed 被选中
  • 为选中的 RSS feed 创建 XML DOM 对象
  • 找到并输出来自 RSS 频道的元素
  • 遍历前三个 RSS 项目中的元素,并进行输出