Ошибка JavaScript: «data.getElementsByTagName не является функцией» - PullRequest
0 голосов
/ 12 ноября 2009

Я потратил часы на эту глупую ошибку, поэтому любая помощь будет признательна!

Я использую Jquery для запроса xml из файла python, размещенного в google appengine. Затем я пытаюсь обработать XML.

Вот ответ на почтовый запрос, полученный от firebug:

<?xml version="1.0" encoding="ISO-8859-1"?><building key='agdhcHRydXNochALEglCdWlsZGluZ3MY3x4M' bldname='test'></building>
Status: 200 OK
Cache-Control: no-cache
Content-Type: application/xml
Content-Length: 0

А вот javascript, который обрабатывает данные:

jQuery.post(toLoad,formInput,function(data){                
            alert(data.getElementsByTagName("building"));
    })

Вот ошибка, которую я получаю от firebug:

data.getElementsByTagName is not a function
anonymous("<?xml version="1.0" encoding="ISO-8859-1"?><building key='agdhcHRydXNochALEglCdWlsZGluZ3MY4B4M' bldname='test'></building>\nStatus: 200 OK\r\nCache-Control: no-cache\r\nContent-Type: application/xml\r\nContent-Length: 0\r\n\r\n")viewBuilding.js (line 120)
I()jquery.min.js (line 19)
anonymous(6)jquery.min.js (line 19)
[Break on this error] alert(data.getElementsByTagName("building"));\n

Я использовал этот конкретный бит javascript для того, чтобы части сайта обрабатывали xml, поэтому моя интуиция говорит мне, что javascript правильный, возможно, формат данных неправильный? Я застрял. : /

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Попробуйте заставить jQuery распознавать возвращенные данные как xml, используя

jQuery.post(toLoad, formInput,
  function(data, textStatus) {
    // now check if data is set and what the status is
    alert(data);
    alert(textStatus);
    //alert(data.getElementsByTagName("building"));
  },
  'xml'
);

Btw. мне кажется подозрительным заголовок Content-Length: 0.


На основании вашего комментария я заключаю, что страница, которая производит ваш xml, является поддельной. Сначала он выводит xml, а после этого некоторые http-заголовки следуют за данными. Что, конечно, не может быть действительным XML. Таким образом, jQuery правильно определяет возвращаемые данные в формате текста.

Вы должны вывести все заголовки, прежде чем выводить одну строку xml.

0 голосов
/ 12 ноября 2009

Ответ от сервера GAE неправильный. Он имеет заголовки ниже данных XML как часть тела ответа. Это не будет действительный документ XML; без заголовков, отображаемых правильно вверху, нет активного заголовка Content-Type, который бы сообщал jQuery, что входящий документ является XML. Следовательно, он отправляет вам простой текстовый ответ, а не нужный вам документ XML. Ошибка возникает из-за того, что вы не можете позвонить getElementsByTagName на String.

Вероятно, автор приложения GAE забыл, как писать приложения WSGI, и просто выводит документ XML на стандартный вывод:

print xml
    ...
start_response('200 OK', [('Content-Type', 'text/xml')])
return []

вместо правильного возврата на сервер для обработки:

start_response('200 OK', [('Content-Type', 'text/xml')])
return [xml]

Что объясняет, почему сервер думал, что Content-Length было 0.

0 голосов
/ 12 ноября 2009

Ну что ж, пора пройти через своего рода контрольный список.

Я собираюсь предположить, что данные назначены правильно, и вы убедились, что они содержат ваши «данные». Теперь, так как выдает ошибку, что функция не существует, мы знаем, что она действительно не была найдена по какой-то причине, потому что в противном случае функция вернет нулевой узел, если не найдет теги с таким именем.

Мне любопытно, есть ли у вас XML в том же файле, что и javascript, потому что в этом случае вам не нужно указывать документ, а не ваши данные? Я знаю, что сценарий, о котором я говорю, - это то, что я бы сделал для первоначального тестирования, поэтому я просто хотел быть в этом уверенным.

Если вы ссылаетесь на внешний XML с данными, то, честно говоря, проблем быть не должно.

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

Надеюсь, это поможет, Дэвид.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...