Chrome говорит, что не может прочитать свойство 'nodeName' из неопределенного, IE6 в порядке, используя Google Map API

У меня есть XML-файл в следующей структуре.

<NewDataSet>
 <markers>
  <name>name text</name>
  <desc>desc text</desc>
  <Lat>57.149328033771</Lat>
  <Long>-2.12561060173764</Long>
  <cost>9985</cost>
 </markers>
</NewDataSet>

Я использую Google Map API для их анализа и сопоставления, используя следующий Javascript.

 function load() {
  if (GBrowserIsCompatible()) {
    var map = new GMap2(document.getElementById("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(47.614495, -122.341861), 13);

    GDownloadUrl("test1.xml", function(data) {
        var xml = GXml.parse(data);
        x= xml.documentElement;
        y = xml.documentElement.childNodes;
        alert(y.length);
        for (i=0;i<y.length;i++)
        {
            if (y[i].nodeType!=3)
            {
              alert(y[i].childNodes[0].nodeName + " : " + y[i].childNodes[0].childNodes[0].nodeValue); //name
            }
        }

    });
  }
}

Полные файлы XML и HTML можно загрузить здесь: http://domain2405544.sites.fasthosts.com/test/test1.htm http://domain2405544.sites.fasthosts.com/test/test1.xml

Прежде всего, я просто пытаюсь проанализировать эти данные. Прекрасно работает в IE6 (без выбора) и корректно оповещает данные. Однако, когда я загружаю ту же страницу в Chrome, это говорит мне:

Uncaught TypeError: Cannot read property 'nodeName' of undefined - line 29

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

Спасибо

1 ответ

Решение

Происходит то, что вы пытаетесь получить дочерние элементы текстового узла. Chrome будет иметь текстовый узел до <name> дитя <markers> элемент, тогда как IE не будет.

Вы проверяете, является ли каждый дочерний элемент элемента документа <NewDataSet> текстовый узел, что позволяет избежать проблемы на этом уровне, но вы предполагаете, что первый дочерний элемент каждого <markers> элемент является <name> элемент, когда на самом деле это текстовый узел в браузерах не IE.

Вам лучше использовать getElementsByTagName DOM узлов, чтобы избежать этой проблемы. Вот улучшенная версия:

GDownloadUrl("test1.xml", function(data) {
    var xml = xhr.responseXML;
    var root = xml.documentElement;
    var markers = root.getElementsByTagName("markers"), nameEl;

    for (var i = 0, len = markers.length; i < len; ++i) {
        nameEl = markers[i].getElementsByTagName("name")[0];
        alert(nameEl.firstChild.data);
    }
});
Другие вопросы по тегам