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

У меня есть 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 Ответ

7 голосов
/ 04 июня 2010

Происходит то, что вы пытаетесь получить дочерние элементы текстового узла. 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);
    }
});
...