<link>http://www.cnn.com/...?eref=rss_world&utm_source=...</link>
Это не правильно сформированный XML и, следовательно, не RSS.Вы должны экранировать все буквальные символы амперсанда в &
.
(Это также недопустимо в HTML. Когда вы помещаете &
в атрибут href="..."
, вы также должны экранировать его в &
.Разница в том, что браузеры, как правило, исправляют вашу ошибку, а XML-парсеры - нет.
document.rssform.rssurl.value
Добавление идентификатора на <input>
и использование document.getElementById
менее двусмысленно, чем в старой школедоступ к коллекции форм.В любом случае, это довольно окольный способ получить значение в сценарии.Почему бы не потерять форму и просто передать имя файла RSS в качестве аргумента в getRSS()
?
this.title;
Это ничего не делает вообще.Ни одно из мест, к которым вы относитесь к подобной собственности, не имеет никакого эффекта;вы не создаете членов, делая это.
var properties = new Array("title", "link", ...
В общем, избегайте конструктора new Array
.Литеральный синтаксис массива (var properties= ['title', 'link, ...];
проще для чтения и не имеет неожиданного поведения конструктора для одного аргумента.
eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue");
eval
- зло. Никогда не используйте его.
Вы можете использовать квадратные скобки для доступа к свойству с динамическим именем. a.b
совпадает с a['b']
, поэтому:
this[properties[i]]= tmpElement.childNodes[0].nodeValue;
...
imgAttribs = new Array("url","title", ...
Вы не объявили var imgAttribs
, так что это случайный глобал. То же самое с Item
в RSS2Channel
. (Почему заглавная буква?)
eval("this."+imgAttribs[i]+"=imgElement.getAttribute("+imgAttribs[i]+")");
Это не сработает из-за отсутствиякавычки на имени атрибута. Вы получите getAttribute(url)
, и нет переменной с именем url
-> error. Опять же, используйте доступ к свойству в квадратных скобках, чтобы установить атрибут, а не eval
.
eval("document.getElementById('chan_"+properties[i]+"').innerHTML = ''");
getElementById('chan_'+properties[i])
хорошо, нет смысла делать это в eval
.
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Pragma", "no-cache");
Cache-Control
и Pragma
обычно являются полями ответа HTTP. Они не будут иметь эффектавы ожидаете в HTTP-запросе. Если вы хотите, чтобы на стороне клиента не происходило кэширование, используйте метод cachebuster, напримеркак добавление случайного числа или метки времени в строку запроса URL.
innerHTML = curProp
Опасность.Полученные вами значения являются произвольными текстовыми строками и могут содержать специальные символы HTML, такие как <
и &
.Если вы напишите такие строки в innerHTML
элемента, вы, скорее всего, получите неработающие результаты, и если они содержат сторонний контент, вы только что дали себе дыру в безопасности межсайтового скриптинга.
Вы можетеиспользуйте textContent=...
, чтобы установить содержимое элемента, не беспокоясь о экранировании HTML, однако затем вам необходимо определить, поддерживается ли он и вернуться к нестандартному свойству IE 1064 *, если это не так.Способ, который работает во всех браузерах, заключается в document.createTextNode(curProp)
и добавлении этого текстового узла к элементу.
innerHTML= imageTag+" alt='"+RSS.image.description+ ...
У вас точно такая же проблема с экранированием HTML здесь: если, например,.описание содержит <script>
, у вас проблемы.Вы можете написать HTML-кодировщик, например .:
function encodeHTML(s) {
return s.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, ''');
}
innerHTML= imageTag+' alt="'+encodeHTML(RSS.image.description)+ ...
Но на самом деле создание HTML из кусочков строки - отстой.Вместо этого используйте методы DOM:
var img= document.createElement('img');
img.src= RSS.image.url;
img.title= RSS.image.description;
img.width= RSS.image.width;
img.height= RSS.image.height;
document.getElementById('chan_image_link').appendChild(img);