国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
實(shí)現(xiàn)讀取RSS 2.0的Javascript類

這幾天在學(xué)習(xí)一些Javascript的東西,新入手,很差,只好自己寫一些小例子練手。嗯,放在這里做備份吧。

這是一個(gè)能夠用于讀取RSS 2.0信息,并把讀到的東西變成Javascript對(duì)象的類。和網(wǎng)上能搜到的代碼相比,我這個(gè)非常的粗糙,封裝的也不一定合理,反正作為練習(xí)嘛,達(dá)到目的就成

首先當(dāng)然是要搞清楚RSS 2.0的結(jié)構(gòu),它最基本的骨架如下:


<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title></title>
    <link></link>
    <description></description>
    <item>
      <author></author>
      <title></title>
      <description></description>
      <link></link>
      <pubDate></pubDate>
    </item>
  </channel>
</rss>


嗯,這并不是最標(biāo)準(zhǔn)的RSS,而是最簡單的RSS。實(shí)際的RSS標(biāo)準(zhǔn)可以看http://blogs.law.harvard.edu/tech/rss,還是很復(fù)雜的!

然后,為了方便讀取RSS的XML中每一個(gè)結(jié)點(diǎn)的內(nèi)容,做了一個(gè)直接從XML轉(zhuǎn)成Javascript對(duì)象的函數(shù),嗯,這個(gè)函數(shù)可以直接根據(jù)Javascript對(duì)象的結(jié)構(gòu)來獲取數(shù)據(jù)哦,也就是類似于ORM的東西啦。


function getXmlData(xml, obj) {
  for (o in obj) {
    if ("object" == typeof(obj[o])) {
      getXmlData(xml.getElementsByTagName(o), obj[o]);
    } else {
      obj[o] = getXmlNodeText(xml.getElementsByTagName(o).item(0));
    }
  }
}


哦,對(duì)了,還有個(gè)函數(shù)getXmlNodeText沒寫,這是用來讀取XML結(jié)點(diǎn)內(nèi)容的函數(shù)。說起來真的很不爽,IE和Gecko在XML DOM的接口方面實(shí)在太不統(tǒng)一了,連獲取一個(gè)結(jié)點(diǎn)的內(nèi)容都不同,IE是.text,Gecko是.textContent。沒辦法,只好寫個(gè)函數(shù)封裝一下了……


function getXmlNodeText(node) {
  var undefined;

  if (undefined !== node.text) {
    return node.text;
  } else if (undefined !== node.textContent) {
    return node.textContent;
  }
 
  return undefined;
}


接下來就是要寫這個(gè)RSS類了。為了把數(shù)據(jù)和控制分離,這個(gè)RSS類并不包含任何遠(yuǎn)程訪問的代碼,僅僅是根據(jù)輸入的xml結(jié)點(diǎn)來獲取里面所有的數(shù)據(jù)。哦,對(duì)了,這個(gè)類幾乎完全沒有考慮異常保護(hù)的問題……


function RssReader(xml) {
  /** Retrieve the information of the tag "channel" in RSS.
    @param[in] channel The <channel> node, which is the direct child of <rss>
    @return Header object, including title, link and description.
  */
  function getHeader(channel) {
    var header = {
      title: 0,
      link: 0,
      description: 0
    };
   
    getXmlData(channel, header);
  
    return header;
  }
 
  /** Retrieve the information of the tag "item" in RSS.
    @param[in] item The <item> node, which is the direct child of <channel>
    @return Item object, including author, title, link, description and pubDate.
  */
  function getItem(item) {
    var info = {
      author: 0,
      title: 0,
      link: 0,
      description: 0,
      pubDate: 0
    };
   
    getXmlData(item, info);
   
    return info;
  }

  var rss = xml.documentElement;
  var channel = rss.getElementsByTagName("channel").item(0);

  this.header = getHeader(channel);
  this.items = [];
 
  var item = channel.getElementsByTagName("item");
 
  for (var i = 0; i < item.length; i++) {
    this.items.push(getItem(item.item(i)));
  }
}


好了,到最后了!當(dāng)然是要開始訪問遠(yuǎn)程的RSS Feed了。嗯,這個(gè)東西當(dāng)然就和XMLHTTP的使用有關(guān)了,相關(guān)的內(nèi)容已經(jīng)很成熟了,我也差不多只是CP了一下而已,所以當(dāng)然就在此略去了。

完成之后,寫一點(diǎn)總結(jié)和體會(huì):

Javascript中做ORM很簡單,甚至于非常的理所當(dāng)然。這是因?yàn)閷?duì)于任意一個(gè)Object(假設(shè)叫obj),它的屬性(假設(shè)叫attrib)天生就有兩種訪問方式,obj.attrib和obj["attrib"]。再加上for..in的強(qiáng)大功能,從XML到Javascript Object很容易就無敵了。
從XML到Javascript 對(duì)象的過程其實(shí)也可以看作從XML到JSON的過程,反過來也很容易實(shí)現(xiàn)。嗯,如果把getXmlData加強(qiáng),就可以得到一個(gè)XML直接映射到JSON的解決方案,貌似挺不錯(cuò)的。
一開始我并不了解XMLHTTP的安全性問題,所以相反比較浪漫……后來略微瀏覽了一下AJAX in Action才了解這些細(xì)節(jié)的東西……原來,XMLHTTP對(duì)象不能夠隨便訪問任意一個(gè)網(wǎng)站,只能訪問當(dāng)前網(wǎng)站下的其他網(wǎng)頁。如果這樣做了,瀏覽器就會(huì)報(bào)錯(cuò)。嗯,我還試過,如果服務(wù)器Redirect到其他URL,XMLHTTP能夠自動(dòng)去訪問其他URL,不過在安全性上面還是遵循上面的原則。
嗯,Javascript的東西,真的比較好玩~

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
+ JavaScript の質(zhì)問用スレッド vol.76 + | Rちゃんねる
java視線論壇 :: 閱讀主題 - ajax三言兩語
JAVASCRIPT圖片切換代碼
從JavaScript 數(shù)組去重談性能優(yōu)化
MVC下實(shí)現(xiàn)LayUI分頁的Demo
Javascript之旅——第十站:為什么都說閉包難理解呢?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服