XML-документ "неопределенный" в JavaScript - PullRequest
0 голосов
/ 20 июля 2011

Я работаю над реализацией идеи для HTML5, с которой я играю.Часть этого, естественно, хранит контент, среди которого данные о различных способностях в игре, а также о персонажах и т. П.

Хотя динамический контент, например, определенные персонажи, будет перемещен позжеЯ, вероятно, буду придерживаться XML для статического контента, такого как статистика для способностей и снаряжения, что означает, что я предпочел бы как можно скорее исправить возникающие у меня проблемы с XML.

Теперь, чтобы сделать этоЯ загружаю в документы XML в начале фазы боя сначала символ, затем способности и т.д., относящиеся к этому персонажу.

Для этого у меня есть функция «loadXMLFile», которая принимаетfilename:

var loadXMLFile = function(filename) {
  req = new XMLHttpRequest();
  req.onreadystatechange = function() {
    return req.responseXML;
  }
  req.open("GET", filename, true);
  req.send();
}

Пример загрузки и манипулирования данными:

function Character(id) {
  doc = loadXMLFile("characters.xml");
  characters = doc.getElementsByTagName("Character");

Мое намерение было заставить вызов функции ждать возвращаемое значение, прежде чем продолжить.Как вы можете сказать из названия вопроса, это не работает.Вместо этого, как только я пытаюсь манипулировать данными, третья строка в примере, я получаю следующую ошибку времени выполнения: Uncaught TypeError: Невозможно вызвать метод 'getElementsByTagName' с неопределенным значением

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

Ответы [ 3 ]

1 голос
/ 20 июля 2011

Я бы предложил использовать jQuery или другой фреймворк javascript. Решать подобные проблемы намного проще, и вы сэкономите много времени и строк кода. Другая проблема заключается в кросс-браузерной совместимости, которая не указана в вашем коде.

0 голосов
/ 10 августа 2011

Упомянутый фрагмент кода является специфической проблемой браузера. В идеале вы должны использовать кросс-браузерные совместимые фреймворки на основе javascript. Вы можете избежать большинства кросс-браузерных проблем.

В соответствии с решением вашей проблемы, функция getElementsByTagName недоступна в элементе doc. Таким образом, вы можете изменить код следующим образом:

if(doc.getElementsByTagName){
     characters = doc.getElementsByTagName("Character");
}

Но это только позволит избежать ошибки, но не решит проблему получения элемента Character.

Наилучшим вариантом будет преобразование XML в JSON на сервере и отправка JSON клиенту. Пройти через JSON легко, и нет проблем с кроссбраузерностью.

Можно легко пройти через JSON следующим образом:

function traverseJSON (jsonObj){
    for(var value in jsonObj){
        if(typeof value == 'function'){//this is to avoid 'remove' function in case of Array, Array object will be available in case of repeating elements in XML. 
            continue;
        }else if(typeof value == 'object'){ //refers to element in XML 
            traverseJSON(value);
        }else if(typeof value== 'string'){   //refers to attribute in XML
        jsonObj[value]; //refers to the attribute value in XML
        }
    }
}

Приведенную выше функцию можно использовать для обхода JSON, который принимает объект JSON в качестве ввода.

0 голосов
/ 20 июля 2011

Вы хотите изменить:

req.open("GET", filename, true);

Кому:

req.open("GET", filename, false);

Чтобы сделать синхронный запрос (что означает ожидание запроса перед продолжением.)

Вы не можете вернуть что-то из onreadystatechange, эта часть вашего кода неверна.

И вы не проверяете, какое реальное состояние находится в этой функции, поэтому это тоже неправильно.

Так что в основном вашкод не является правильным.Я хотел бы предложить найти учебный сайт для XMLHttpRequest и скопировать его код.

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

И последнее замечание: с json работать намного проще, чем с xml, возможно, вы захотите перейти на него.

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