2009-08-10 9 views

Odpowiedz

219

Oznacza to, że próbujesz wstawić węzeł DOM do miejsca w drzewie DOM, w którym nie może on przejść. Najczęstszym miejscem widzę to na Safari, która nie zezwala na następujące:

document.appendChild(document.createElement('div')); 

Generalnie, jest to po prostu pomyłka, gdzie to było faktycznie przeznaczone:

document.body.appendChild(document.createElement('div')); 

innych przyczyn widoczne w dziki (zestawione z komentarzami):

  • próbujesz dołączyć węzeł sobie
  • próbujesz dołączyć zerowy do węzła
  • Próbujesz dołączyć węzeł do węzła tekstowego.
  • Twój HTML jest nieprawidłowy (np braku zamknąć węzeł docelowy)
  • Przeglądarka myśli HTML próbujesz dołączyć to XML (fix dodając <!doctype html> do zatłoczonego HTML, lub określającą typ zawartości podczas pobierania przez XHR)
+49

Błąd występuje również, gdy próbujesz dołączyć do siebie węzeł. Po prostu wpadłem na ten sam :-) –

+5

Po prostu próbowałem dodać wartość zerową do elementu (i całkowicie niezwiązaną wskazówkę - zawsze upewnij się, że funkcje zwracają to, co napisałeś, aby powrócić: P) –

+0

Widziałem to gdy brakowało jednego z tagów zamykających poza celem. –

1

można zobaczyć te pytania

Getting HIERARCHY_REQUEST_ERR when using Javascript to recursively generate a nested list

lub

jQuery UI Dialog with ASP.NET button postback

Wniosek jest

podczas próby użycia funkcji append, należy użyć nowej zmiennej, jak w poniższym przykładzie

jQuery(function() { 
    var dlg = jQuery("#dialog").dialog({ 
         draggable: true, 
         resizable: true, 
         show: 'Transfer', 
         hide: 'Transfer', 
         width: 320, 
         autoOpen: false, 
         minHeight: 10, 
         minwidth: 10 
      }); 
    dlg.parent().appendTo(jQuery("form:first")); 
}); 

W powyższym przykładzie, używa var „DLG”, aby uruchomić funkcja appendTo. Następnie błąd „HIERARCHY_REQUEST_ERR” nie wyjdzie ponownie.

1

natknąłem się ten błąd, gdy za pomocą rozszerzenia Google Chrome Sidewiki. Wyłączenie to problem został rozwiązany za mną.

1

mam zamiar dodać jeszcze jedną konkretną odpowiedź tutaj, bo to było poszukiwanie 2 godziny na odpowiedź ...

Próbowałam wstrzyknąć tag do dokumentu HTML było tak:.

<map id='imageMap' name='imageMap'> 
    <area shape='circle' coords='55,28,5' href='#' title='1687.01 - 0 percentile' /> 
</map> 

Jeśli zauważysz, znacznik jest zamknięty w poprzedzającym g przykład (<area/>). Ta funkcja nie została zaakceptowana w przeglądarkach Chrome. w3schools wydaje się, że powinno być zamknięte, a nie mogłem znaleźć oficjalnej specyfikacji tego tagu, ale z pewnością nie działa w Chrome. Firefox nie zaakceptuje tego z <area/> lub <area></area> lub <area>. Chrome musi mieć <area>. IE akceptuje wszystko.

W każdym razie ten błąd może być spowodowany nieprawidłowym kodem HTML.

3

szczególności z jQuery można uruchomić w tej kwestii, jeśli zapomnisz jest kursor w obrębie znacznika html podczas tworzenia elementów:

$("#target").append($("div").text("Test")); 

podniesie ten błąd, ponieważ to, co oznaczało było

$("#target").append($("<div>").text("Test")); 
+0

dziękuję bardzo za to. – bcolin

+0

Marchew? Lub opiekunów? –

0

I Mam ten błąd, ponieważ zapomniałem sklonować mój element.

// creates an error 
clone = $("#thing"); 
clone.appendTo("#somediv"); 

// does not 
clone = $("#thing").clone(); 
clone.appendTo("#somediv"); 
3

Ten błąd może wystąpić, gdy próbujesz wstawić węzeł do DOM, który jest nieprawidłowy HTML, który może być coś tak subtelnego jak nieprawidłowego atrybutu, na przykład:

// <input> can have a 'type' attribute 
var $input = $('<input/>').attr('type', 'text'); 
$holder.append($input); // OK 

// <div> CANNOT have a 'type' attribute 
var $div = $('<div></div>').attr('type', 'text'); 
$holder.append($div); // Error: HIERARCHY_REQUEST_ERR: DOM Exception 3 
4

Jeżeli jesteś otrzymuję ten błąd z powodu wywołania ajax jquery $ .ajax

Wtedy może trzeba określić co dataType wraca z serwera. Naprawiłem odpowiedź bardzo za pomocą tej prostej właściwości.

+1

baza pojedynczego kodu dla web/phonegap, refaktoryzowana do dynamicznego ładowania szablonu za pomocą odpowiedzi koorchika na http://stackoverflow.com/questions/8366733/external-template-in-underscore. pracował w przeglądarce na komputerze, nie działa w przeglądarce mobilnej ani natywnej aplikacji. to rozwiązanie załatwiło sprawę. –

+0

Tutaj jest ten sam problem, co dziwne tylko w iOS 5. Określanie typu data działa. Dzięki – homerjam

0

Wiem, że ten wątek jest stary, ale napotkałem inną przyczynę problemu, która może być pomocna dla innych osób. Wystąpił błąd w usłudze Google Analytics próbującej dołączyć się do komentarza HTML. Kod naruszający prawa:

document.documentElement.firstChild.appendChild(ga); 

Powodował błąd, ponieważ moim pierwszym elementem był komentarz HTML (a mianowicie kod szablonu Dreamweaver).

<!-- #BeginTemplate "/Templates/default.dwt.php" --> 

I zmodyfikowany kod naruszające do czegoś, co prawda nie kuloodporny, ale lepiej:

document.documentElement.firstChild.nodeType===1 ? document.documentElement.firstChild.appendChild(ga) : document.documentElement.lastChild.appendChild(ga); 
0

Innym powodem może wymyślić jest to, że są dołączanie zanim element jest gotowy na przykład

<body> 

<script> 
document.body.appendChild(foo); 
</script> 

</body> 
</html> 

W tym przypadku musisz przenieść skrypt po. Nie do końca pewna, czy to jest koszerne, ale przeniesienie skryptu po ciele nie wydaje się pomóc:/

Zamiast przesuwać skrypt, można również dodawać załączniki w procedurze obsługi zdarzeń.

1

Jeśli napotkasz ten problem podczas próby dołączenia węzła do innego okna w programie Internet Explorer, spróbuj użyć kodu HTML wewnątrz węzła zamiast samego węzła.

myElement.appendChild(myNode.html()); 

IE nie obsługuje dołączania węzłów do innego okna.

+0

Czy próbowałeś tego? Nawet w Chrome otrzymuję TypeError: Nie udało się wykonać 'appendChild' na 'Node': parametr 1 nie jest typu 'Node'. (...).To dlatego, że .html() jest typu string, a appendChild oczekuje typu Node. – joedotnot

2

@Kelly Norton ma rację w swojej odpowiedzi, że The browser thinks the HTML you are attempting to append is XML i sugeruje specifying the content type when fetching via XHR.

To prawda, ale czasami używasz bibliotek stron trzecich, których nie zamierzasz modyfikować. W moim przypadku jest to JQuery UI. Następnie należy podać poprawną odpowiedź Content-Type zamiast przesłonić typ odpowiedzi po stronie JavaScript.Ustaw swoje Content-Type na text/html i nic ci nie jest.

W moim przypadku było tak proste, jak zmiana nazwy file.xhtml na file.html - serwer aplikacji miał pewne rozszerzenie do mapowania typów MIME po wyjęciu z pudełka. Gdy treść jest dynamiczna, możesz w jakiś sposób ustawić rodzaj odpowiedzi (np. res.setContentType("text/html") w Servlet API).

1

Ten błąd przydarzył mi się w IE9, gdy próbowałem dynamicznie dołączyć do urządzenia funkcję, która już istniała w oknie A. Okno A tworzyłoby okienko podrzędne B. W oknie B po pewnym działaniu użytkownika działałaby i działała funkcja element appendChild na elemencie formularza w oknie A z użyciem window.opener.document.getElementById('formElement').appendChild(input);

Spowoduje to błąd. To samo dotyczy tworzenia elementu wejściowego przy użyciu document.createElement('input'); w oknie podrzędnym, przekazując go jako parametr do okna A window.opener i tam jest dołączany. Tylko wtedy, gdy utworzyłem element wejściowy w tym samym oknie, w którym miałem zamiar je dodać, zakończyłoby się to bezbłędnie.

Stąd mój wniosek (proszę sprawdzić): żaden element nie może być tworzone dynamicznie (przy użyciu document.createElement) w jednym oknie, a następnie dołączane (używając .appendChild) do elementu w innym okienku (bez brania może konkretny dodatkowy krok Tęskniłem do upewnij się, że nie jest to uważane za XML lub coś takiego). To nie powiedzie się w IE9 i zgłasza błąd, w FF działa to jednak dobrze.

PS. Nie używam jQuery.

+0

Dzięki twojemu wskaźnikowi zorientowałem się w tym. Zobacz odpowiedź, którą napisałem, jeśli jesteś zainteresowany. –

0

Tylko w celach informacyjnych.

IE zablokuje dołączanie dowolnego elementu utworzonego w innym kontekście okna z kontekstu okna, do którego element się dodaje.

np

var childWindow = window.open('somepage.html'); 

//will throw the exception in IE 
childWindow.document.body.appendChild(document.createElement('div')); 

//will not throw exception in IE 
childWindow.document.body.appendChild(childWindow.document.createElement('div')); 

I nie zorientowali się, jak utworzyć elementu DOM z jQuery przy użyciu jeszcze inny kontekst okna.

0

Otrzymuję ten błąd w IE9, jeśli miałem wyłączoną opcję debugowania skryptów (Internet Explorer). Jeśli włączę debugowanie skryptów, nie widzę błędu i strona działa poprawnie. Wydaje się dziwne, co wyjątek DOM ma do czynienia z debugowaniem, czy jest włączone czy wyłączone.

Powiązane problemy