2009-10-08 93 views
0

我的代碼列出了rss訂閱到html頁面的項目。雖然,Java腳本有點挑剔。它不會讀取一些xml提要,通常包含超過25的列表項的提要。我只需要另一組眼睛來查看代碼並告訴我是否缺少明顯的東西。javascript問題,RSS訂閱顯示

.js file----------------------------------------------- 
//XML CODE 

var http_request = false; 
var dataFileName = new Array(); 
dataFileName[1] = "http://newsrss.bbc.co.uk/rss/newsonline_world_edition/americas/rss.xml"; 
//dataFileName[2] = "http://newsrss.bbc.co.uk/rss/newsonline_world_edition/uk_news/magazine/rss.xml"; 
//dataFileName[3] = "http://newsrss.bbc.co.uk/rss/newsonline_world_edition/business/rss.xml"; 




function getData(dataFileIndex) { 
    if (window.ActiveXObject) { //IE 
     http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
    } else if (window.XMLHttpRequest) { //other 
     http_request = new XMLHttpRequest(); 
    } else { 
     alert("your browser does not support AJAX"); 
    } 
    http_request.open("GET",dataFileName[dataFileIndex],true); 
    http_request.setRequestHeader("Cache-Control", "no-cache"); 
    http_request.setRequestHeader("Pragma", "no-cache"); 
    http_request.onreadystatechange = function() { 
     if (http_request.readyState == 4) { 
      if (http_request.status == 200) { 
       if (http_request.responseText != null) { 
        processRSS(http_request.responseXML); 
       } else { 
        alert("Failed to receive RSS file from the server - file not found."); 
        return false; 
       } 
      } 
     } 
    } 

    http_request.send(null); 
} 

function processRSS(rssxml) { 
    RSS = new RSS2Channel(rssxml); 
    outputData(RSS); 
} 

function RSS2Channel(rssxml) { 
    this.items = new Array(); 
    var itemElements = rssxml.getElementsByTagName("item"); 

    for (var i=0; i<itemElements.length; i++) { 
     Item = new RSS2Item(itemElements[i]); 
     this.items.push(Item); 
    } 
} 

function RSS2Item(itemxml) { 
    this.title; 
    this.link; 
    this.description; 
    this.pubDate; 
    this.guid; 

    var properties = new Array("title", "link", "description", "pubDate", "guid"); 
    var tmpElement = null; 
    for (var i=0; i<properties.length; i++) { 
     tmpElement = itemxml.getElementsByTagName(properties[i])[0]; 
     if (tmpElement != null) { 
      eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue"); 
     } 
    } 
} 

function outputData(RSS) { 
    dataString = ""; 
    for (var i=0; i<RSS.items.length; i++) { 
     dataString += "<div class='itemBlock'>"; 
     newDate = new Date(RSS.items[i].pubDate); 
     dateString = (newDate.getMonth()+1) + "/" + newDate.getDate() + "/" + newDate.getFullYear(); 
     dataString += "<div class='itemDate'>" + dateString + "</div>"; 
     dataString += "<div class='itemTitle'><a href='" + RSS.items[i].link + "' target='afps_news'>" + RSS.items[i].title + "</a></div>"; 
     //dataString += "<div class='itemDescription'>" + RSS.items[i].description + "</div>"; 
     dataString += "</div>"; 
    } 
    document.getElementById('outputBlock').innerHTML = dataString; 
} 





//SCROLL BAR CODE 

var ie=document.all; 
var nn6=document.getElementById&&!document.all; 

var isdrag=false; 
var x,y; 
var dobj; 
var scrollPercent; 
var boxTop; 
var maxHeight; 
var toppoint; 

function movemouse(e) { 
    if (isdrag) { 
     //dobj.style.left = nn6 ? tx + e.clientX - x : tx + event.clientX - x; 

     toppoint = (nn6) ? ty + e.clientY - y : ty + event.clientY - y; 
     boxTop = parseInt(document.getElementById('scrollBarBox').style.top) - scrollBarBoxOffset; 
     if (toppoint < boxTop) toppoint = boxTop; 

     boxHeight = parseInt(document.getElementById('scrollBarBox').style.height); 
     maxHeight = boxTop + boxHeight - parseInt(document.getElementById('scrollBar').style.height); 
     if (toppoint > maxHeight) toppoint = maxHeight; 

     dobj.style.top = toppoint + "px"; 

     scrollPercent = toppoint/maxHeight; 
     document.getElementById('textWindow').style.top = parseInt(0 - (document.getElementById('textWindow').offsetHeight - parseInt(document.getElementById('scrollBarBox').style.height)) * scrollPercent); 

     return false; 
    } 
} 

function selectmouse(e) { 
    var fobj = nn6 ? e.target : event.srcElement; 
    var topelement = nn6 ? "HTML" : "BODY"; 
    while (fobj.tagName != topelement && fobj.className != "dragme") { 
     fobj = nn6 ? fobj.parentNode : fobj.parentElement; 
    } 

    if (fobj.className == "dragme") { 
     isdrag = true; 
     dobj = fobj; 
     //tx = parseInt(dobj.style.left + 0); 
     ty = parseInt(dobj.style.top + 0); 
     //x = nn6 ? e.clientX : event.clientX; 
     y = nn6 ? e.clientY : event.clientY; 
     document.onmousemove = movemouse; 
     return false; 
    } 
} 

document.onmousedown = selectmouse; 
document.onmouseup = new Function("isdrag=false;"); 

html file------------------------------------------------------------------- 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 

<HTML><HEAD><TITLE>TEST</TITLE> 
<META http-equiv=Content-Type content="text/html; charset=windows-1252"> 
<SCRIPT src="script1.js"></SCRIPT> 

<STYLE>BODY { 
    MARGIN: 0px; FONT: 8pt arial 
} 
#widgetBody { 
BACKGROUND-Color:gray; WIDTH: 240px; POSITION: relative; HEIGHT: 299px 
} 
#textWindowBox { 
    LEFT: 63px; OVERFLOW: hidden; WIDTH: 152px; POSITION: absolute; TOP: 70px; HEIGHT: 221px 
} 
#textWindow { 
    PADDING-TOP: 7px; POSITION: relative 
} 
#scrollBarBox { 
    LEFT: 221px; WIDTH: 12px; POSITION: absolute; TOP: 74px; HEIGHT: 216px 
} 
#scrollBar { 
    BACKGROUND: url(images/widget_scroll-handle1.gif) no-repeat; WIDTH: 12px; POSITION: relative; HEIGHT: 40px 
} 
#defenseLinkLink { 
    LEFT: 4px; WIDTH: 20px; CURSOR: pointer; POSITION: absolute; TOP: 155px; HEIGHT: 140px; BACKGROUND-COLOR: transparent 
} 
#defenseLinkLink A { 
    DISPLAY: block; WIDTH: 20px; HEIGHT: 140px 
} 
.dragme { 
    POSITION: relative 
} 
.itemBlock { 
    PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: 0px 0px 3px; PADDING-TOP: 0px; BORDER-BOTTOM: #adafb3 1px dotted 
} 
.itemDate { 
    FONT-SIZE: 0.9em; COLOR: #666; LINE-HEIGHT: 1.1em 
} 
.itemTitle { 
    FONT-WEIGHT: bold; LINE-HEIGHT: 1.1em 
} 
.itemTitle A { 
    COLOR: #254a7d; TEXT-DECORATION: none 
} 
.itemDescription { 

} 
</STYLE> 

<SCRIPT> 
var scrollBarBoxOffset = 74; 

function init() { 
    document.getElementById('scrollBarBox').style.top = "74px"; 
    document.getElementById('scrollBarBox').style.height = "216px"; 
    document.getElementById('scrollBar').style.height = "40px"; 
} 
</SCRIPT> 

<META content="MSHTML 6.00.6001.18294" name=GENERATOR></HEAD> 
<BODY onload=init()> 
<DIV id=widgetBody> 
<DIV id=textWindowBox> 
<DIV id=textWindow> 
<DIV id=outputBlock></DIV></DIV></DIV> 
<DIV id=scrollBarBox> 
<DIV class=dragme id=scrollBar></DIV></DIV> 
<DIV style="CLEAR: both"></DIV></DIV> 
<SCRIPT language=javaScript>getData(2)</SCRIPT> 
</BODY></HTML> 
+0

你能澄清一下嗎? 「不讀」是什麼意思?我看了一下,你的腳本工作正常。你看到什麼樣的錯誤? – DmitryK 2009-10-08 22:51:51

+0

有幾個我測試過它不會閱讀的訂閱源,這就是其中之一:http://www.army.mil/rss/feeds/europe.xml。 – 2009-10-09 08:24:50

回答

0

好的,讓它工作。 2個問題。

  1. army.mil沒有解決!請改用「www.army.mil」。

  2. IN RSS2Item替換這一行: 如果(tmpElement!= NULL){

與此: 如果(tmpElement = NULL & & tmpElement.childNodes [0]!){

+0

2.工作就像一個魅力!謝謝。 – 2009-10-09 14:23:49

0

呵呵,你爲什麼直接使用XMLHttpRequest?使用一個庫,並使您的生活更輕鬆:)

您可能會遇到跨站腳本安全問題。如果RSS源與運行JavaScript的頁面不在同一個域中,瀏覽器將不會讓您的JavaScript發出請求。

0

dataFileName [1] =「http://newsrss.bbc.co.uk/rss/newsonline_world_edition/americas/rss.xml」;

除非您是(a)從BBC運行的腳本,或者(b)瀏覽器擴展,否則無法向該服務器發出XMLHttpRequest。

dataString += "<div class='itemTitle'><a href='" + RSS.items[i].link 

HTML /腳本注入。如果您堅持滾動innerHTML而不是使用簡單的DOM方法,則必須執行HTML轉義,將<&"轉換爲&lt;&amp;&quot;

eval(「this。」+ properties [i] +「= tmpElement.childNodes [0] .nodeValue」);

不要使用eval,除非在極少數不常見的情況下需要它。這不是其中之一;你可以使用名字來訪問JavaScript屬性:

this[properties[i]]= tmpElement.firstChild.data; 

而且,這可能是在不可靠性進來的,你不能肯定會有一個孩子文本節點。如果該元素中沒有內容,則firstChild/childNodes[0]將不存在,您將收到異常。如果元素中有複雜的內容(通常不應該出現這種情況,但對於RSS 0.9,可以使用未編碼的HTML),firstChild.nodeValue將不包含元素的文本內容。相反,你將不得不遍歷文本節點後代收集他們的nodeValue/data