Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [jQuery/XMLWriter] Błąd przy odczytywaniu odpowiedzi.
starach
post
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
lord_t
post
Post #2





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


IMHO to wina po stronie js. Pokaż to wywołanie ajaxa.
Go to the top of the page
+Quote Post
starach
post
Post #3





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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);
}
Go to the top of the page
+Quote Post
lord_t
post
Post #4





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


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ć]
Go to the top of the page
+Quote Post
starach
post
Post #5





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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:
(IMG:http://img301.imageshack.us/img301/3998/aaaangk.jpg)

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?
Go to the top of the page
+Quote Post
lord_t
post
Post #6





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
starach
post
Post #7





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
lord_t
post
Post #8





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


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:>
Go to the top of the page
+Quote Post
starach
post
Post #9





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 22:49