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);
}
});