2013-03-23 4 views
0

У меня есть xml-файл, и я хочу загрузить его содержимое в определенный html div каждую секунду, вот часть javascript, которая анализирует xml файл:onload = 'setInterval ("function()", 1000)' не работает

function getEntries() { 

    if (window.XMLHttpRequest) 
     req = new XMLHttpRequest(); 
    req.onreadystatechange = handleReq; 
    req.open("GET", "entries.xml", true); 
    req.send(null); 

} 
function handleReq() { 
    if (req.readyState == 4) 
     document = req.responseXML; 
    var states = document.getElementsByTagName("entry"); 
    for (i = 0; i < states.length; i++) { 
     currentState = states[i]; 
     document.getElementById("LogArea").innerHTML = "<table><tr><td><b>Name:</b></td><td>" 
       + currentState.getAttribute("umessage"); 
     +"</td></tr><tr><td><b>Message:</b></td><td>" 
       + currentState.getAttribute("uname"); 
     +"</td></tr></table>"; 
    } 
} 

и вот файл XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<entries> 
<entry umessage="aaaaaaaa" uname="aaaaaaa" /> 
<entry umessage="Hello everybody" uname="John" /> 
<entry umessage="Hello everybody" uname="Smith" /> 
<entry umessage="Hello everybody" uname="Knuth" /> 
</entries> 

и это HTML часть:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<body bgcolor="yellow" onload='setInterval("getEntries()",1000)'> 
<div id="LogArea" align="left"> 
</div> 
</body> 
</html> 

проблема что ничего не загружается в указанный DIV и никаких ошибок не существует внутри поджигатель

+0

Является ли загруженный JavaScript тег ? – user113215

+1

Можете ли вы расширить «Не работает»? Что происходит, чего вы не ожидаете? Что не происходит, что вы есть? Исключения? Ошибки? – Oded

+0

Код работает для меня здесь, в каком браузере вы пытались выводить любые данные с помощью console.log? JQuery сделал бы это немного проще в моем мнении, но помимо вызова функции должно быть «getEntries», а не «getEntries()», тогда все должно быть в порядке, вывести полный код в свой файл – Neo

ответ

5

Вы пытаетесь переписать document в function handleReq() так, чтобы он ссылался на XML вместо HTML. Будет ли это успешным или неудачным, оно все равно не сработает.

Во-первых, вы пытаетесь установить document как XML, загруженный асинхронно. Как упоминалось в комментариях, это, вероятно, не сработает (в моих тестах ни Chrome, ни IE 9 не разрешили мне переписать document таким образом).

document = req.responseXML; 
var states = document.getElementsByTagName("entry"); 

Если это не удается, то states ищет <entry> тегов в HTML страницы (не то, что вы хотели). Если это удастся, то у вас есть проблемы две строки позже, потому что вы ожидаете document волшебно быть страницы HTML снова вместо XML:

document.getElementById("LogArea").innerHTML = ... 
  • Не используйте имена переменных, которые являются свойства window - - назовите свой XML-ответ другим, например var xmldoc = ....

  • Не использовать глобальные переменные. Для определения переменных функции вы должны использовать var whatever = ... вместо whatever = ....

  • Как и другие упомянутые, setTimeout(String, ...) - это плохая практика и устарело. Функции - это полноценные объекты в JavaScript, поэтому просто передайте сама функция (без кавычек, а не в круглые скобки).

  • Весь корпус function handleReq() должен находиться внутри блока if (req.readyState == 4) (не только в первой строке). Вы не хотите ничего делать, если запрос еще не завершен.

+1

+1 Я не думаю, что вы можете перезаписать документ, поэтому, когда 'document.getElementsByTagName (" entry ");' фактически ищет теги 'entry' на странице, а не xml. – Musa

+0

@Musa Спасибо, это кажется правильным. Я обновил свой ответ. – user113215

2

Использование

setInterval(getEntries,1000) 

Вместо передачи в строку, которая будет eval-е изд, передать имя функции непосредственно.

Дополнительной проблемой в вашем методе handleReq, как отмечено в this answer:

document = req.responseXML; 

Это заменяет документ, а это означает, что ваши следующие несколько строк имеют в виду то, что больше не существует.

2

Передача строки в качестве первого параметра плохо/обесценена. Вместо этого, используйте:

setInterval(getEntries, 1000); 

или, если вам нужно передать Счетчики:

setInterval(function(){ getEntries('foo') }, 1000); 

Хотя это, вероятно, не решит вашу проблему, важно иметь в виду.

Смежные вопросы