проблема с JavaScript, отображение RSS-ленты - PullRequest
0 голосов
/ 09 октября 2009

мой код перечисляет элементы из RSS-канала на HTML-страницу. хотя, сценарий Java немного привередлив. он не будет читать некоторые потоки XML, обычно каналы, содержащие элементы списка старше 25. Мне просто нужен другой набор глаз, чтобы взглянуть на код и сказать, пропускаю ли я что-то очевидное.

.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>

Ответы [ 3 ]

0 голосов
/ 09 октября 2009

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

Если вы (а) не являетесь скриптом, запущенным с BBC, или (б) расширением браузера, вы не можете сделать XMLHttpRequest на этот сервер.

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

Внедрение HTML / скрипта. Если вы настаиваете на использовании innerHTML вместо использования простых методов DOM, вы должны выполнить экранирование HTML, чтобы превратить <&" в &lt;&amp;&quot;.

Eval ( "" + это свойство [I] + "= tmpElement.childNodes [0] .nodeValue");

Не используйте eval, за исключением очень редких случаев, когда он вам нужен. Это не один из них; Вы можете получить доступ к свойству JavaScript по имени, используя:

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

Кроме того, и это, вероятно, то, где ненадежность наступает, вы не можете быть уверены, что будет единственный дочерний текстовый узел. Если в этом элементе нет содержимого, firstChild / childNodes[0] не будет существовать, и вы получите исключение. Если в элементе есть сложное содержимое (которого обычно не должно быть, но для RSS 0.9 может быть как незашифрованный HTML), firstChild.nodeValue не будет содержать текстовое содержимое элемента. Вместо этого вам придется пройтись по потомкам Узла текста, собирая их nodeValue / data.

0 голосов
/ 09 октября 2009

Хорошо, все заработало. 2 номера.

  1. Army.mil не разрешается! Пожалуйста, используйте "www.army.mil" вместо.

  2. В RSS2элемент замените эту строку: if (tmpElement! = null) {

с этим: if (tmpElement! = null && tmpElement.childNodes [0]) {

0 голосов
/ 09 октября 2009

О боже, почему вы используете XMLHttpRequest напрямую? Используйте для этого библиотеку и упростите себе жизнь:)

Вы можете столкнуться с проблемами безопасности межсайтового скриптинга. Если RSS-каналы существуют в другом домене, чем страница, на которой выполняется JavaScript, браузер не позволит вашему JavaScript выполнять запросы.

...