2009-08-10 15 views

risposta

219

Significa che hai provato ad inserire un nodo DOM in un posto nell'albero DOM dove non può andare. Il luogo più comune che vedo questo è su Safari che non consente il seguente:

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

In generale, questo è solo un errore in cui questo è stato effettivamente destinato:

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

Altre cause visti nel selvatico (sintetizzato dai commenti):

  • Si sta tentando di aggiungere un nodo a sé
  • Si sta tentando di aggiungere nulla ad un nodo
  • si sta tentando di aggiungere un nodo a un nodo di testo.
  • tuo HTML è valido (ad esempio, non riuscendo a chiudere il nodo di destinazione)
  • Il browser pensa che il codice HTML che si sta tentando di aggiungere è XML (fix con l'aggiunta di <!doctype html> per il codice HTML iniettato, o specificando il tipo di contenuto durante il recupero tramite XHR)
+49

L'errore si verifica anche quando si tenta di aggiungere un nodo a se stesso. Mi sono imbattuto in questo solo io :-) –

+5

Ho appena ottenuto questo tentativo di aggiungere un null a un elemento (e un suggerimento totalmente non correlato - assicurati sempre che le tue funzioni restituiscano la cosa che hai scritto per restituire: P) –

+0

Ho visto questo quando uno dei tag di chiusura mancava dal target. –

1

potete vedere queste domande

Getting HIERARCHY_REQUEST_ERR when using Javascript to recursively generate a nested list

o

jQuery UI Dialog with ASP.NET button postback

La conclusione è

quando si tenta di utilizzare la funzione di aggiunta, è necessario utilizzare nuova variabile, come in questo esempio

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")); 
}); 

Nell'esempio precedente, utilizza il var "dlg" per eseguire la funzione appendTo. Poi errore “HIERARCHY_REQUEST_ERR" non uscire di nuovo.

1

ho incontrato questo errore quando si utilizza l'estensione di Google Chrome Sidewiki. La disattivazione è risolto il problema per me.

1

ho intenzione di aggiungere una risposta più specifica qui perché era una ricerca 2 ore per la risposta ...

stavo cercando di iniettare un tag in un documento il formato HTML è stato in questo modo:.

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

Se si nota, il tag è chiuso nel precedente esempio (<area/>). Questo non è stato accettato nei browser Chrome. w3schools sembra pensare che dovrebbe essere chiuso e non sono riuscito a trovare le specifiche ufficiali su questo tag, ma sicuramente non funziona in Chrome. Firefox non lo accetterà con <area/> o <area></area> o <area>. Chrome deve avere <area>. IE accetta qualsiasi cosa.

In ogni caso, questo errore può essere dovuto al fatto che il codice HTML non è corretto.

3

In particolare con jQuery si può incorrere in questo problema se dimenticare i segni di omissione di tutto il tag HTML per la creazione di elementi:

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

solleverà questo errore perché quello che volevi dire era

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

grazie mille per questo. – bcolin

+0

Carote? O carette? –

0

I ho ricevuto quell'errore perché ho dimenticato di clonare il mio elemento.

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

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

Questo errore può verificarsi quando si tenta di inserire un nodo nel DOM, che è valido HTML, che può essere qualcosa di sottile, come un attributo non corretto, ad esempio:

// <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

Se sei questo errore a causa di una chiamata jquery ajax $ .ajax

allora potrebbe essere necessario specificare che cosa l'dataType sta tornando dal server. Ho risolto la risposta molto usando questa semplice proprietà.

$.ajax({ 
    url: "URL_HERE", 
    dataType: "html", 
    success: function(response) { 
     $('#ELEMENT').html(response); 
    } 
}); 
+1

base di codice singolo per Web/PhoneGap, refactored per caricare dinamicamente il modello utilizzando la risposta di koorchik all'indirizzo http://stackoverflow.com/questions/8366733/external-template-in-underscore. ha funzionato nel browser desktop, non ha funzionato nel browser mobile o nell'app nativa. questa soluzione ha funzionato. –

+0

Lo stesso problema qui, stranamente solo in iOS 5. Specifica dataType ha funzionato. Grazie – homerjam

0

So che questo thread è vecchio, ma ho riscontrato un'altra causa del problema che altri potrebbero trovare utili. Stavo ricevendo l'errore con Google Analytics che cercava di aggiungersi a un commento HTML. Il codice incriminato:

document.documentElement.firstChild.appendChild(ga); 

Questo stava causando l'errore perché il mio primo elemento è un commento HTML (vale a dire un codice di modello di Dreamweaver).

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

ho modificato il codice incriminato per qualcosa certamente non a prova di proiettile, ma meglio:

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

Un altro motivo per questo può venire è che si si desidera aggiungere i prima che l'elemento è pronto per esempio

<body> 

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

</body> 
</html> 

In questo caso, è necessario spostare lo script dopo il. Non del tutto sicuro se questo è kosher, ma spostando la sceneggiatura dopo che il corpo non sembra aiutare:/

Invece di spostare lo script, puoi anche fare l'accodamento in un gestore di eventi.

1

Se si verifica questo problema durante il tentativo di aggiungere un nodo in un'altra finestra in Internet Explorer, provare a utilizzare l'HTML all'interno del nodo anziché il nodo stesso.

myElement.appendChild(myNode.html()); 

IE non supporta l'aggiunta di nodi a un'altra finestra.

+0

Hai provato questo? Anche in Chrome ho ricevuto TypeError: Impossibile eseguire "appendChild" su "Node": il parametro 1 non è di tipo "Node". (...).Questo perché .html() è di tipo stringa e appendChild si aspetta tipo nodo. – joedotnot

2

@Kelly Norton ha ragione nella sua risposta che The browser thinks the HTML you are attempting to append is XML e suggerisce specifying the content type when fetching via XHR.

È vero, tuttavia a volte si utilizzano librerie di terze parti che non si intende modificare. È l'interfaccia utente di JQuery nel mio caso. Quindi devi fornire il giusto Content-Type nella risposta invece di sovrascrivere il tipo di risposta sul lato JavaScript.Imposta il tuo Content-Type su text/html e stai bene.

Nel mio caso, è stato facile come rinominare lo file.xhtml in file.html - il server delle applicazioni aveva qualche estensione per i mapping dei tipi MIME fuori dalla scatola. Quando il contenuto è dinamico, puoi impostare il tipo di risposta del contenuto in qualche modo (ad esempio, res.setContentType("text/html") in Servlet API).

1

Questo ERRORE mi è successo in IE9 quando ho tentato di aggiungere dinamicamente a un bambino che era già presente in una finestra A. La finestra A creava una finestra figlio B. Nella finestra B dopo l'azione dell'utente veniva eseguita una funzione un appendChild sull'elemento del modulo nella finestra A utilizzando window.opener.document.getElementById('formElement').appendChild(input);

Ciò genera un errore. Lo stesso vale per la creazione dell'elemento di input utilizzando document.createElement('input'); nella finestra secondaria, passandolo come parametro alla finestra A di window.opener e ivi inclusa. Solo se avessi creato l'elemento di input nella stessa finestra in cui stavo per aggiungerlo, sarebbe riuscito senza errori.

Così la mia conclusione (si prega di verificare): nessun elemento può essere creata in modo dinamico (utilizzando document.createElement) in una finestra, e poi aggiunto (usando .appendChild) per un elemento in un'altra finestra (senza prendere forse un particolare passo in più ho perso per assicurati che non sia considerato XML o qualcosa del genere). Questo fallisce in IE9 e genera l'errore, tuttavia in FF funziona bene.

PS. Non uso jQuery.

+0

Grazie al puntatore, ho trovato un modo per aggirare questo. Si prega di vedere la risposta che ho postato se siete interessati interessati. –

0

Solo per riferimento.

IE bloccherà l'aggiunta di qualsiasi elemento creato in un contesto di finestra diverso dal contesto della finestra a cui l'elemento viene accodato.

es

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')); 

non ho capito come creare un elemento DOM con jQuery utilizzando un contesto finestra diversa ancora.

0

Ottengo questo errore in IE9 se ho disabilitato l'opzione di debug degli script (Internet Explorer). Se abilito il debug degli script, non vedo l'errore e la pagina funziona correttamente. Sembra strano ciò che l'eccezione DOM ha a che fare con il debug abilitato o disabilitato.