Cosa può causare esattamente un "HIERARCHY_REQUEST_ERR: DOM Exception 3" -Error?


184

In che modo si collega esattamente a jQuery? So che la libreria utilizza internamente funzioni javascript native, ma cosa sta esattamente cercando di fare ogni volta che si presenta un problema del genere?

Risposte:


227

Significa che hai provato a inserire un nodo DOM in una posizione nella struttura DOM dove non può andare. Il posto più comune che vedo questo è su Safari che non consente quanto segue:

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

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

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

Altre cause osservate in natura (riassunto dai commenti):

  • Stai tentando di aggiungere un nodo a se stesso
  • Stai tentando di aggiungere null a un nodo
  • Stai tentando di aggiungere un nodo a un nodo di testo.
  • Il tuo HTML non è valido (ad es. Impossibile chiudere il nodo di destinazione)
  • Il browser ritiene che l'HTML che si sta tentando di aggiungere sia XML (risolto aggiungendolo <!doctype html>all'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 appena imbattuto in questo anch'io :-)
Ben Clayton,

5
Ho appena avuto questo tentativo di aggiungere un null a un elemento (e un suggerimento totalmente non correlato - assicurati sempre che le tue funzioni restituiscano ciò che hai scritto per restituire: P)
Veli Gebrev

Ho visto questo quando uno dei tag di chiusura mancava dal bersaglio.
Tom H,

IE (9) potrebbe generare questo errore quando si utilizza jQuery per aggiungere risultati AJAX. Evita questo usando response.xmldove disponibile. Ad esempio,$(e).append(response.xml || $(response));
Courtney Christensen,

Capito quando sono passato da jQuery (desktop) a zepto su Android. Tornato indietro.
Ravindranath Akila,

5

Se si riceve questo errore a causa di un jacquery ajax, chiamare $ .ajax

Quindi potrebbe essere necessario specificare quale tipo di dati sta tornando dal server. Ho risolto molto la risposta usando questa semplice proprietà.

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

1
base di codice unico per il web / PhoneGap, refactoring al caricamento dinamico modello utilizzando risposta da koorchik a stackoverflow.com/questions/8366733/... . ha funzionato nel browser desktop, non ha funzionato nel browser mobile o nell'app nativa. questa soluzione ha funzionato.
Kinjal Dixit,

Stesso problema qui, stranamente solo in iOS 5. Specificare dataType ha funzionato. Grazie
homerjam

3

In particolare con jQuery è possibile riscontrare questo problema se si dimenticano i trattini attorno al tag html durante la creazione di elementi:

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

Solleverà questo errore perché intendevi

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

3

Questo errore può verificarsi quando si tenta di inserire un nodo nel DOM che è HTML non valido, che può essere qualcosa di sottile come un attributo errato, 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

2

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

È vero, tuttavia a volte usi librerie di terze parti che non intendi modificare. È l'interfaccia utente di JQuery nel mio caso. Quindi è necessario fornire il diritto Content-Typenella risposta anziché sovrascrivere il tipo di risposta sul lato JavaScript. Imposta il tuo Content-Typeper text/htmle si sta bene.

Nel mio caso, è stato facile come rinominare il file.xhtmlper file.html- server di applicazione avuto qualche estensione MIME tipi di mappature fuori dalla scatola. Quando il contenuto è dinamico, è possibile in qualche modo impostare il tipo di contenuto della risposta (ad es. res.setContentType("text/html")Nell'API Servlet).


1

Puoi vedere queste domande

Ottenere HIERARCHY_REQUEST_ERR quando si utilizza Javascript per generare ricorsivamente un elenco nidificato

o

Finestra di dialogo dell'interfaccia utente jQuery con postback del pulsante ASP.NET

La conclusione è

quando si tenta di utilizzare la funzione append, è necessario utilizzare una 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 sopra, usa var "dlg" per eseguire la funzione appendTo. Quindi l'errore "HIERARCHY_REQUEST_ERR" non verrà più visualizzato.


1

Ho riscontrato questo errore durante l'utilizzo dell'estensione Google Chrome Sidewiki. Disabilitarlo ha risolto il problema per me.


1

Ho intenzione di aggiungere una risposta più specifica qui perché è stata una ricerca di 2 ore per la risposta ...

Stavo cercando di iniettare un tag in un documento. L'html era così:

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

Se noti, il tag viene chiuso nell'esempio precedente ( <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 di sicuro non funziona in Chrome. Firefox non lo accetterà con <area/>o <area></area>o<area> . Chrome deve avere <area>. IE accetta qualsiasi cosa.

Comunque, questo errore può essere dovuto al fatto che il tuo HTML non è corretto.


1

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

document.documentElement.firstChild.appendChild(ga);

Ciò stava causando l'errore perché il mio primo elemento era un commento HTML (ovvero un codice modello di Dreamweaver).

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

Ho modificato il codice offensivo in qualcosa di certo non a prova di proiettile, ma meglio:

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

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.


Hai davvero provato questo? Anche in Chrome sto ottenendo TypeError: Impossibile eseguire 'appendChild' su 'Nodo': il parametro 1 non è di tipo 'Nodo'. (…). Questo perché .html () è di tipo stringa e appendChild si aspetta il tipo Nodo.
Joedotnot,

1

Questo errore si è verificato in IE9 quando ho provato ad aggiungereChild an in modo dinamico a quello già esistente in una finestra A. La finestra A creava una finestra figlio B. Nella finestra B dopo un'azione dell'utente una funzione veniva eseguita e faceva un'appendice elemento del modulo nella finestra A utilizzando window.opener.document.getElementById('formElement').appendChild(input);

Ciò genererebbe un errore. Lo stesso con la creazione dell'elemento di input utilizzando document.createElement('input');nella finestra figlio, passando come parametro alla window.openerfinestra A, e lì fa l'appendice. Solo se creassi l'elemento di input nella stessa finestra in cui lo avrei aggiunto, avrebbe funzionato senza errori.

Quindi la mia conclusione (si prega di verificare): nessun elemento può essere creato dinamicamente (usando document.createElement) in una finestra, e quindi aggiunto (usando .appendChild) a un elemento in un'altra finestra (senza fare forse un passo extra particolare che mi sono perso per assicurarsi che non sia considerato XML o qualcosa). Questo fallisce in IE9 e genera l'errore, in FF però funziona benissimo.

PS. Non uso jQuery.


Grazie al tuo puntatore, ho trovato un modo per aggirare questo. Si prega di consultare la risposta che ho pubblicato se siete interessati interessati.
T.Ho

0

Un altro motivo per cui questo può emergere è che stai aggiungendo prima che l'elemento sia pronto, ad es

<body>

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

</body>
</html>

In questo caso, dovrai spostare lo script dopo il. Non sono del tutto sicuro che sia kosher, ma spostare la sceneggiatura dopo il corpo non sembra aiutare: /

Invece di spostare lo script, puoi anche eseguire l'aggiunta in un gestore eventi.


0

Ho avuto 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");

0

Solo per riferimento.

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

per esempio

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 ancora capito come creare un elemento dom con jQuery usando un contesto di finestra diverso.


0

Ottengo questo errore in IE9 se avevo 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 cosa abbia a che fare l'eccezione DOM con il debug abilitato o disabilitato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.