Ошибка типа: значение undefined (результат выражения xmlDoc.load) не является объектом - PullRequest
4 голосов
/ 01 марта 2009

Я пытаюсь загрузить XML-файл, используя Javascript, и мне еще предстоит найти хорошую функцию, которая работает в IE, Firefox и Safari. Функция загрузки, которую я сейчас использую, в основном является единственной из учебников w3schools:

http://www.w3schools.com/XML/tryit.asp?filename=tryxml_dom_createelement

Точный код выглядит так:

if (window.ActiveXObject)
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation.createDocument)
{
xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert('Your browser cannot handle this script');
}
xmlDoc.async=false;
xmlDoc.load(dname);

Где dname = URL-адрес XML-файла. Этот код получает «TypeError: Значение undefined (результат выражения xmlDoc.load) не является объектом». в сафари.

Я также пробовал код на этом сайте:

http://developer.apple.com/internet/webcontent/xmlhttpreq.html

Однако, это дает нулевой XML-файл. Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 01 августа 2009

Похоже, проблема в том, что Safari не поддерживает document.implementation.createDocument как метод для извлечения и загрузки источников XML. Вы должны использовать XMLHttpRequest для получения и анализа XML AFAIK.

Я попробовал модифицированную версию кода из учебника Apple, который вы связали, и, похоже, он мне подходит. Этот код не лучший в мире, и ему не хватает обработки ошибок, но это единственное подтверждение концепции, которую я имел под рукой.

Примечание: я настоятельно рекомендую использовать библиотеку. Существуют несоответствия браузера с XMLHttpRequests и анализом XML. Это стоит инвестиций!

Для не библиотечной версии я использовал модифицированную версию кода сафари, чтобы получить XMLHttpRequest:

function getXHR(url,callback) {
    var req = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
        try {
            req = new XMLHttpRequest();
        } catch(e) {
            req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                req = false;
            }
        }
    }

    if(req) {
        req.onreadystatechange = function() { callback( req ) };
        req.open("GET", url, true);
        req.send("");
    }
}

Получение XML-кода из результата также не лишено его собственных причуд:

function getXML( response ) {
    if( response.readyState==4 ) {
        //Get the xml document element for IE or firefox
        var xml;
        if ( response.responseXML ) {
                xml = new ActiveXObject("Microsoft.XMLDOM");
                xml.async = false;
                xml.loadXML(response.responseText);
        } else {
                xml = response.responseXML;
        }

        return xml;
    }

    return null;
}

Наконец, используйте то, что вы получите:

function callback( response ) {
    var xmlDoc = getXML( response );
    if( xmlDoc ) {
        //do your work here
        ...
    }       
}

Если у вас по-прежнему возникают проблемы, вы можете проверить несколько вещей, которые, вероятно, решат вашу проблему.

  1. Вы установили тип контента на text / xml?
  2. Ваш запрос действительно поступает на сервер и обратно?
  3. Когда вы предупреждаете / изучаете текст ответа, вы видите что-то, что не принадлежит?
  4. Правильно ли отформатирован ваш XML? Запустите его через валидатор.

Удачи! Приветствия.

0 голосов
/ 01 марта 2009

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

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