“HIERARCHY_REQUEST_ERR : DOM 예외 3”-오류가 발생하는 원인은 무엇입니까?


184

jQuery와 정확히 어떤 관련이 있습니까? 라이브러리가 내부에서 네이티브 자바 스크립트 함수를 사용한다는 것을 알고 있지만 그러한 문제가 나타날 때마다 정확히 무엇을하려고합니까?

답변:


227

이는 DOM 노드를 DOM 트리에서 이동할 수없는 곳에 삽입하려고 시도했음을 의미합니다. 내가 볼 수있는 가장 일반적인 장소는 Safari에서 다음을 허용하지 않습니다.

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

일반적으로 이것은 실제로 의도 된 실수 일뿐입니다.

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

야생에서 볼 수있는 다른 원인 (의견에서 요약) :

  • 노드를 자체에 추가하려고합니다.
  • 노드에 널을 추가하려고합니다.
  • 텍스트 노드에 노드를 추가하려고합니다.
  • HTML이 유효하지 않습니다 (예 : 대상 노드를 닫지 못함)
  • 브라우저는 추가하려는 HTML이 XML이라고 생각합니다 ( <!doctype html>삽입 된 HTML 에 추가 하거나 XHR을 통해 페치 할 때 컨텐츠 유형을 지정하여 수정 )

49
노드를 자신에게 추가하려고 할 때도 오류가 발생합니다. 나는 방금 이것 하나를 만났다 :-)
Ben Clayton

5
방금 요소에 null을 추가하려고 시도했습니다 (그리고 완전히 관련이없는 팁-항상 함수가 반환하도록 쓴 것을 반환하도록하십시오 : P)
Veli Gebrev

닫는 태그 중 하나가 대상에서 누락되었을 때 이것을 보았습니다.
Tom H

jQuery를 사용하여 AJAX 결과를 추가 할 때 IE (9)에서이 오류가 발생할 수 있습니다. response.xml가능한 경우 사용 하여 이것을 피하십시오 . 예를 들면 다음과 같습니다.$(e).append(response.xml || $(response));
Courtney Christensen

안드로이드에서 jQuery (desktop)에서 zepto로 변경했을 때 이것을 얻었습니다. 다시 전환했다.
Ravindranath Akila

5

jquery ajax 호출로 인해이 오류가 발생하면 $ .ajax를 호출하십시오.

그런 다음 서버에서 dataType 이 돌아 오는 것을 지정해야 할 수도 있습니다 . 이 간단한 속성을 사용하여 응답을 많이 수정했습니다.

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

1
web / phonegap 용 단일 코드베이스 . stackoverflow.com/questions/8366733/… 에서 koorchik의 답변을 사용하여 템플릿을 동적으로로드하도록 리팩토링되었습니다 . 데스크톱 브라우저에서 작동했지만 모바일 브라우저 또는 기본 앱에서는 작동하지 않았습니다. 이 솔루션은 트릭을 수행했습니다.
Kinjal Dixit

iOS 5에서만 이상하게 동일한 문제가 발생합니다. dataType을 지정하면 효과가 있습니다. 감사합니다
homerjam

3

특히 jQuery를 사용하면 요소를 만들 때 html 태그 주위의 캐럿을 잊어 버린 경우이 문제가 발생할 수 있습니다.

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

당신이 의미 한 것이기 때문에이 오류가 발생합니다

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

3

이 오류는 유효하지 않은 HTML 인 DOM에 노드를 삽입하려고 할 때 발생할 수 있습니다. 예를 들어, 잘못된 속성만큼 미묘 할 수 있습니다.

// <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은 그의 대답에 맞으며 The browser thinks the HTML you are attempting to append is XML제안 specifying the content type when fetching via XHR합니다.

그러나 때로는 수정하지 않을 타사 라이브러리를 사용하는 것이 사실입니다. 필자의 경우 JQuery UI입니다. 그런 다음 Content-TypeJavaScript 측의 응답 유형을 재정의하는 대신 응답에 올바른 권한 을 제공해야합니다 . 사용자의 설정 Content-Typetext/html와 당신이 벌금을.

쉽게 이름을 변경 한 내 경우에는, 그것은이었다 file.xhtmlfile.html응용 프로그램 서버를 밖으로 상자의 MIME 타입 매핑 일부 확장했다 -. 컨텐츠가 동적 일 때 컨텐츠 유형의 응답을 어떻게 든 설정할 수 있습니다 (예 : res.setContentType("text/html")서블릿 API).


1

이 질문들을 볼 수 있습니다

Javascript를 사용하여 중첩 목록을 재귀 적으로 생성 할 때 HIERARCHY_REQUEST_ERR 가져 오기

또는

ASP.NET 버튼 포스트 백이있는 jQuery UI 대화 상자

결론은

함수 추가를 사용하려고 할 때이 예제와 같이 새 변수를 사용해야합니다

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

위의 예에서 var "dlg"를 사용하여 appendTo 함수를 실행하십시오. 그런 다음 "HIERARCHY_REQUEST_ERR"오류가 다시 발생하지 않습니다.


1

Chrome 확장 프로그램 사이드 위키를 사용할 때이 오류가 발생했습니다. 사용 중지하면 문제가 해결되었습니다.


1

답변을 2 시간 동안 검색했기 때문에 여기에 하나 더 구체적인 답변을 추가 할 것입니다 ...

문서에 태그를 삽입하려고했습니다. HTML은 다음과 같습니다.

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

눈치 채면 앞의 예에서 태그가 닫힙니다 ( <area/>). Chrome 브라우저에서는 허용되지 않습니다. w3schools 는 닫혀 있어야한다고 생각 하고이 태그에서 공식 사양을 찾을 수는 없지만 Chrome에서는 작동하지 않습니다. Firefox는 <area/>또는 <area></area>또는로 이를 허용하지 않습니다 <area>. Chrome에이 있어야합니다 <area>. IE는 무엇이든 받아들입니다.

어쨌든이 오류는 HTML이 올바르지 않기 때문에 발생할 수 있습니다.


1

이 스레드가 오래되었다는 것을 알고 있지만 다른 사람들이 도움이 될 수있는 다른 원인이 발생했습니다. Google Analytics에서 HTML 주석에 자신을 추가하려고 할 때 오류가 발생했습니다. 문제가되는 코드 :

document.documentElement.firstChild.appendChild(ga);

첫 번째 요소가 HTML 주석 (즉, Dreamweaver 템플릿 코드)이기 때문에 오류가 발생했습니다.

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

불쾌한 코드를 방탄하지는 않았지만 더 나은 것으로 수정했습니다.

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

1

Internet Explorer에서 다른 창에 노드를 추가하려고 할 때이 문제가 발생하면 노드 자체 대신 HTML을 사용하십시오.

myElement.appendChild(myNode.html());

IE는 다른 창에 노드를 추가하는 것을 지원하지 않습니다.


실제로 이것을 시도 했습니까? Chrome에서도 TypeError : 'Node'에서 'appendChild'를 실행하지 못했습니다 : 매개 변수 1이 'Node'유형이 아닙니다 (…). .html ()은 문자열 유형이고 appendChild는 Node 유형을 예상하기 때문입니다.
joedotnot

1

이 오류는 IE9에서 이미 윈도우 A에 이미 존재하는 것에 동적으로 childChild를 추가하려고 시도했을 때 나에게 발생했습니다. 윈도우 A는 자식 윈도우 B를 만듭니다. 일부 사용자 작업 후 윈도우 B에서 함수가 실행되고 appendChild를 수행합니다. 를 사용하여 창 A의 양식 요소 window.opener.document.getElementById('formElement').appendChild(input);

오류가 발생합니다. document.createElement('input');자식 창에서를 사용하여 입력 요소를 작성하고 이를 window.opener창 A에 매개 변수로 전달 하면 추가가 수행됩니다. 입력 요소를 추가하려는 동일한 창에서 입력 요소를 만든 경우에만 오류없이 성공합니다.

따라서 내 결론 (확인하십시오) : document.createElement한 창에서 요소를 동적으로 생성 (사용 ) 한 다음 .appendChild다른 창의 요소에 (사용 ) 추가 할 수 없습니다 (XML을 고려하지 않기 위해 놓친 특정 추가 단계를 수행하지 않고도) 또는 뭔가). IE9에서는 실패하고 오류가 발생하지만 FF에서는 정상적으로 작동합니다.

추신. jQuery를 사용하지 않습니다.


당신의 포인터 덕분에, 나는 이것에 대한 길을 알아 냈습니다. 관심이 있다면 게시 한 답변을 참조하십시오.
T.Ho

0

이것이 일어날 수있는 또 다른 이유는 요소가 준비되기 전에 추가하고 있기 때문입니다.

<body>

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

</body>
</html>

이 경우 스크립트 다음에서 스크립트를 이동해야합니다. 그것이 정결한지 확실하지 않지만 본문 후에 스크립트를 이동해도 도움이되지 않는 것 같습니다 : /

스크립트를 이동하는 대신 이벤트 핸들러에서 추가를 수행 할 수도 있습니다.


0

요소를 복제하는 것을 잊었 기 때문에 오류가 발생했습니다.

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

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

0

참고로

IE는 요소가 추가되는 창 컨텍스트와 다른 창 컨텍스트에서 작성된 요소를 추가하는 것을 차단합니다.

예 :

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

아직 다른 창 컨텍스트를 사용하여 jQuery로 dom 요소를 만드는 방법을 알지 못했습니다.


0

스크립트 디버깅 (Internet Explorer) 옵션을 비활성화 한 경우 IE9에서이 오류가 발생합니다. 스크립트 디버깅을 활성화하면 오류가 표시되지 않고 페이지가 제대로 작동합니다. DOM 예외가 디버깅 활성화 또는 비활성화와 관련이있는 것은 이상하게 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.