[js] na localhost - na serwerze DOM Exception 8

0

Wrzuciłem testową stronkę na serwer, aby sprawdzić czy działa tak jak na moim apache.

Wyskoczył problem: plik ze skryptem javascript jakoś dziwnie się ściągał (był wysyłany ze złym nagłówkiem). Ustawiłem w .htaccess aby js szło jako application/x-javascript.

Ten błąd zniknął, natomiast pozostał

Uncaught Error: NOT_FOUND_ERR: DOM Exception 8

Błąd ma miejsce tu:

function enter(target) {
33	    xhttp.open("GET", target+".xml", true)
34	    xhttp.onreadystatechange = function () {
35	    if(xhttp.readyState == 4) {
36	        if(xhttp.status == 404) alert("Nie udało się załadować strony")
37	        else {
38	        var xres = xhttp.responseXML
39	        resultDocument = xsltProcessor.transformToFragment(xres,document)
40	        while(document.getElementById("target").hasChildNodes())
41	            document.getElementById("target").removeChild(document.getElementById("target").firstChild)
42
        document.getElementById("target").appendChild(resultDocument)
main.js:42Uncaught Error: NOT_FOUND_ERR: DOM Exception 8
43	        }
44	    }
45	    }
46	    xhttp.send()
47	}

Wszystkie elementy rzecz jasna istnieją.

Co może być nie tak? Jak to poprawić?

0

target dałeś w cudzysłowach.

0
document.getElementById

« Gecko DOM Reference

Summary
Returns the element whose ID is specified.

Syntax
element = document.getElementById(id);
where

element is an element object.
id is a case-sensitive string representing the unique ID of the element being sought.
Example
view plainprint?
<html>  
<head>  
<title>getElementById example</title>  
  
<script type="text/javascript">  
  
function changeColor(newColor)  
{  
 var elem = document.getElementById("para1");  
 elem.style.color = newColor;  
}  
</script>  
</head>  
  
<body>  
<p id="para1">Some text here</p>  
<button onclick="changeColor('blue');">blue</button>  
<button onclick="changeColor('red');">red</button>  
</body>  
</html>  

że zacytuje https://developer.mozilla.org/en/dom/document.getelementbyid

a gdzie miałem go nie umieścić? Przecież to wartość atrybutu id.

0

Sprawdź, czy document.getElementById("target") nie zwraca czasem nulla.

0

@lord_digger:
GhostDogowi chodziło chyba o to, że masz tam również ZMIENNĄ o nazwie target i być może chciałeś użyć jako ID wartości tej zmiennej, a nie samego ciągu 'target'.

Tak w ogóle to jeśli nie ma takiej wyraźnej potrzeby, nie używaj wielu wywołań typu document.getElementById(foo). Raczej zrób sobie zmienną fooElem, przypisz tam RAZ document.getElementById(foo) i potem korzystaj z fooElem. Proponuję też zmianę zmiennej z resultDocument na resultDocumentFragment czy coś w tym stylu, bo nie możesz zrobić .appendChild zmiennej typu Document, a ta nazwa zmiennej, którą masz, to właśnie sugeruje. Sprawdź też to, co napisał pan kuba. No i czym jest tak naprawdę ten resultDocument? A może coś się pieprzy z odpowiedzią i tam siedzi null?

0

No dobra.. macie rację.

Unikałem zmiennych, ponieważ wydawało mi się, że to nie zadziała. Wcześniej istotnie takie cuda się działy, gdy eksperymentowałem z xsl. Teraz to było tylko złe programowanie.

O tym, że zmienna tak się nazywa to zapomniałem :/ . Sorry.

Problem nie zniknął. document.getElementById zwraca co trzeba: HTMLDivElement, natomiast błąd dalej występuje.

Zapomniałem dodać dość ważną informację (ach.. byłem śpiący): Ten kod działa na moim testowym serwerze, ale nie działa na home.pl gdzie umieściłem wersję testową strony.

Problem w całej swej okazałości można zobaczyć tu: http://modent.home.pl/index.php

0

Rozumiem, że chodzi Ci o ten błąd, który następuje zaraz po załadowaniu strony (no bo gdyby trzeba było coś kliknąć by uruchomić zbugowany kod, to zapewne byś o tym napisał).

W 20 linii faktycznie następuje błąd. Szwankuje mi trochę debugger, bo nie siedzę na swoim normalnym kompie, ale z tego co widzę to w xhttp.responseXML otrzymujesz null. Może to być spowodowane np. złymi nagłówkami, którymi serwer okrasza żądany plik (contentTemplate.xsl). Tutaj masz dokładniejsze informacje na temat tego, co może spowodować null w responseXML. Nawet nie mogę Ci teraz sprawdzić, jaki typ MIME zwraca serwer, bo Firebug mi się pieprzy na tym komputerze.

0

W chrome otrzymuje tylko info, że błąd jest w main.js:43

Firefox rzeczywiście wspomina o linii 20.

Dopisałem do .htaccess

:Location /*.xsl
SetMime application/xslt+xml
:Location

wyczyściłem cache chrome i teraz działa :)

Chrome wypisuje mi jakiego typu jest header. Nie pomyślałem tylko, aby to sprawdzić :/ .

Tak przy okazji:
jak ustawić w plikach typu xml, xsl, czy może nawet js czas po którym pliki tracą ważność i należy je ponownie pobrać z serwera?
Gdy zmieniałem header w .htasccess to zmiany miały miejsce w przeglądarce dopiero po czyszczeniu cache (tak w chrome jak i firefox).
W HTML to wiem jak, ale jak w tych innych formatach?

PS
@bswierczynski: Nie zainstalowałem firebug'a jak polecałeś, bo nie chce używać firefoxa (taki kaprys). Może zdołam znaleźć coś pod Debiana. Liczyłem na chrom'a - najwyraźniej przeliczyłem się

0

@lord_digger:
Ja kiedyś przez pół roku czy rok (?) byłem obrażony na Firebuga, "bo wszyscy go używają i się jarają". Ciężko kogoś w takiej sytuacji przekonać. Może jedynie argumentem, że nie korzystanie z darmowych, bardzo prostych w obsłudze narzędzi, które mogą ułatwić pracę -- to głupota. Ale jeśli jesteś tak uparty jak ja, to pewnie i tak się nie przekonasz. Chyba że jeszcze nigdy nie skorzystałeś z Firebuga -- wtedy pewnie pomogłoby Ci zobaczenie, jak ktoś z niego korzysta. Przecież Firefox Cię nie ugryzł. Nikt się nie dowie, że go użyłeś ;).

A właśnie: te headery rozwiązały Twój problem, tak? Widzę, że teraz już nie ma tego błędu i wyświetla się napis "udało się".

Co do czyszczenia cache'a ręcznie, to w Firefoxie pomaga kombinacja CTRL+F5.

A jeśli chodzi o ustawienia serwera, to robi się to w zasadzie tak samo dla wszystkich typów plików: przez ustawienie nagłówków. W plikach .php naturalnie używasz PHP, więc masz funkcję header(), a w plikach HTML masz meta-tagi z http-equiv, ale to wszystko to tak naprawdę podrzędne rzeczy w porównaniu do starych, dobrych nagłówków ustawianych w .htaccess. Poszperaj w Sieci i wyłączaniu cache'u w htcccess, ja Ci na szybko wygooglałem coś takiego.

0

Zainstalowane. Wygląda podobnie do chrome. Ciekawe jak będzie się sprawował.

1 użytkowników online, w tym zalogowanych: 0, gości: 1