Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery/XMLWriter] Błąd przy odczytywaniu odpowiedzi.
Forum PHP.pl > Forum > XML, AJAX
starach
Wysyłam metodą $.post() dane do serwera. Niestety przy odczytywaniu odpowiedzi jQuery pluje wyjątkiem.
Cytat
Błąd: uncaught exception: Node cannot be inserted at the specified point in the hierarchy (NS_ERROR_DOM_HIERARCHY_REQUEST_ERR)
Plik źródłowy: http://localhost/proj1/web/script/query/jquery-1.2.6.js
Wiersz: 238
Kod generujący XML wygląda tak:
  1. <?php
  2. class Ajax
  3. {
  4.    static public function sendError($msg)
  5.    {
  6.        header("Content-type: text/xml; charset=UTF-8");
  7.        $xml = new XMLWriter();
  8.        $xml->openURI('php://output');
  9.        $xml->startDocument('1.0', 'utf-8');
  10.        $xml->setIndent(true);
  11.        $xml->setIndentString("\t");
  12.        $xml->startElement('error');
  13.            $xml->startElement('message');
  14.            $xml->writeAttribute('value', $msg);
  15.            $xml->endElement();
  16.        $xml->endDocument();
  17.        $xml->flush();
  18.    }
  19. }
  20. ?>
I przy wywołaniu zwraca:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <error>
  3. <message value="Podana strona nie istnieje"/>
  4. </error>
Myślałem że błąd leży przy zamknięciu tagu <message> ale kiedy podmieniłem odpowiedź na:
  1. <error>
  2. <message>Podana strona nie istnieje</message>
  3. </error>
Problem pozostał ten sam. Nadal w konsoli Firefox'a widzę ten wyjątek.
lord_t
IMHO to wina po stronie js. Pokaż to wywołanie ajaxa.
starach
Kod
function DrawingsRequest() { }
DrawingsRequest.page = 1;
DrawingsRequest.Pane = new Pane();
DrawingsRequest.Pane.name = 'Drawings - LOG';
DrawingsRequest.Pane.content = '<ul>\n\
                            <li>Pobieram wyniki: <span class="request-time">0</span></li>\n\
                            <li class="debug"></li>\n\
                        </ul>'
DrawingsRequest.Counter = new Counter();
DrawingsRequest.Counter.jump = 0.1;
DrawingsRequest.Counter.meter = 0;
DrawingsRequest.Counter.duration = 100;
DrawingsRequest.Counter.eventRegister(function(){    DrawingsRequest.loading(); });
DrawingsRequest.send = function($trigger)
{
    $().ajaxError(function(event, request, $settings){ DrawingsRequest.handleError($settings); });
    
    DrawingsRequest.Pane.open();
    DrawingsRequest.Counter.start();
    $($trigger).attr('disabled', 'disabled').blur();
    $.post(Website.getDomain()+'drawings/', DrawingsRequest.preparate(),
        function($response)
        {
            DrawingsRequest.handleResponse($response);
        });
}
DrawingsRequest.handleError = function($settings)
{
    DrawingsRequest.Counter.stop();
    $('.debug', DrawingsRequest.Pane.jquery).html('Błąd połączenia z ' + $settings.url + '.');
}
DrawingsRequest.loading = function()
{
    var $time = new String(DrawingsRequest.Counter.meter);
    $('span.request-time', DrawingsRequest.Pane.jquery).html($time.substr(0, $time.indexOf('.') + 2));
}
DrawingsRequest.preparate = function()
{
    return { page: DrawingsRequest.page };
}
DrawingsRequest.handleResponse = function($response)
{
    DrawingsRequest.Counter.stop();
    $('#drawings').html($response);
}
lord_t
W odpowiedzi wysyłasz plik xml ale nie odbierasz tego jako xml, a jako zwykły tekst (vide pseudokod poniżej)
Kod
$.post(url, data, callback, "TYP ODPOWIEDZI, PATRZ DOKUMENTACJA");


Proponuję:
1) zrobić odbiór jako xml - ale nie wiem jak to się wtedy ma do wstawiania do treści (możliwe, że dalej będzie ten sam błąd)
2) wywalić nagłówek xmlowski z odpowiedzi przesyłanej stronie. [to bym osobiście spróbował zrobić]
starach
Dzięki.

xml nic nie dało. Skasowanie funkcji header() też nie. Ustawiłem typ na 'html' i kod:
Kod
alert('Headers:\n' + $response.getAllResponseHeaders() + '\n'
        + 'responseXML: ' + $response.responseXML + '\n\n'
        + 'responseText: ' + $response.responseText + '\n\n'
        + 'status: ' + $response.status + '\n\n'
        + 'statusText: ' + $response.statusText);
zaczął wyświetlać mi:


Teraz mam tylko problem z dobraniem się do zwróconej treści.
alert($('error message', $response.responseXML).html()) niestety nie działa.
Natomiast po przypisaniu odpowiedzi do dokumentu ( .append() ) mogę się dobrać do zwróconych danych.
Wolałbym to jednak zrobić bez konieczności przypisywania ich. Jest to do zrobienia?
lord_t
Mi w tej chwili nic takiego na myśl nie przychodzi.

Może wpisuj tą odpiwiedz do niewidocznego diva?
albo może warto przerzucić się na JSONa?
starach
W sumie chętnie bym się przerzucił na JSONa, ale strasznie irytuje mnie fakt że nie umiem wyświetlić w jakiś prosty sposób zawartości obiektu.
Chciałbym móc testować odpowiedzi za pomocą JSowej wersji var_dump() w stylu xdebug'a, a niestety nie mogę znaleźć takiego czegoś. Byłoby to zapewne o wiele lepsze rozwiązanie niż tworzenie XMLi bo przede wszystkim szybsze. Problemem jest jednak dla mnie wyświetlenie zawartości.

Zwróciłeś zapewne uwagę że testując XMLHttpRequest zwracany przez wywołanie AJAX'a użyłem alerta wymieniając wszystkie jego pola... strasznie to niewygodne.
lord_t
Nie testowałem (ale jestem pewien), że jeśli wrzucisz sobie obiekt JSON do firebuga (console.log(twojObiektJSON)) to będziesz miał dostęp do poszczególnych kluczy i wartości w obiekcie JSON.

Co do var_dumpa to może TO Ci pomoże:>
starach
Dzięki wielkie. Poczytałem treść z linka który podałeś, pogmerałem trochę i przepisałem kod na rozszerzenie jQuery.
Kod
jQuery.dump = function(element, limit, depth)
{
    depth =    depth?depth:0;
    limit = limit?limit:1;

    var returnString = '<ol>';

    for(property in element)
    {
        //Property domConfig isn't accessable
        if (property != 'domConfig')
        {
            returnString += '<li><strong>'+ property + '</strong> <small>(' + (typeof element[property]) +')</small>';

            if (typeof element[property] == 'number' || typeof element[property] == 'boolean')
                returnString += ' : <em>' + element[property] + '</em>';
            if (typeof element[property] == 'string' && element[property])
                returnString += ': <div style="background:#C9C9C9;border:1px solid black; overflow:auto;"><code>' +
                                    element[property].replace(/</g, '&amp;lt;').replace(/>/g, '&amp;gt;') + '</code></div>';

            if ((typeof element[property] == 'object') && (depth < limit))
                returnString += jQuery.dump(element[property], limit, (depth + 1));

            returnString += '</li>';
        }
    }
    returnString += '</ol>';

    if(depth == 0)
    {
        var $winpop=window.open("", "","width=800,height=600,scrollbars,resizable");
        $winpop.document.write('<pre>'+returnString+ '</pre>');
    }
    return returnString;
};
Jeśli ktoś z was będzie to uruchamiał, pamiętajcie że FF ma automatyczne blokowanie wyskakujących okien i nie zdziwcie się jeśli dostaniecie informację że zmienna $winpop ma wartość null. winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.