อะไรทำให้เกิด "HIERARCHY_REQUEST_ERR: DOM Exception 3" - เกิดข้อผิดพลาดได้อย่างไร


184

มันเกี่ยวข้องกับ jQuery อย่างไร? ฉันรู้ว่าห้องสมุดใช้ฟังก์ชันจาวาสคริปต์ดั้งเดิมภายใน แต่สิ่งที่พยายามทำทุกครั้งที่เกิดปัญหาดังกล่าว

คำตอบ:


227

หมายความว่าคุณพยายามแทรกโหนด DOM ในสถานที่ในต้นไม้ DOM ซึ่งไม่สามารถไปได้ สถานที่ที่พบบ่อยที่สุดที่ฉันเห็นคือใน Safari ซึ่งไม่อนุญาตสิ่งต่อไปนี้

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

โดยทั่วไปนี่เป็นเพียงความผิดพลาดที่นี่ตั้งใจจริง:

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

สาเหตุอื่น ๆ ที่เห็นในป่า (สรุปจากความคิดเห็น):

  • คุณกำลังพยายามผนวกโหนดเข้ากับตัวเอง
  • คุณกำลังพยายามผนวกค่า null ให้กับโหนด
  • คุณกำลังพยายามผนวกโหนดเข้ากับโหนดข้อความ
  • HTML ของคุณไม่ถูกต้อง (เช่นไม่สามารถปิดโหนดเป้าหมายของคุณ)
  • เบราว์เซอร์คิดว่า HTML ที่คุณพยายามผนวกคือ XML (แก้ไขโดยเพิ่ม<!doctype html>HTML ที่ถูกแทรกของคุณหรือระบุประเภทเนื้อหาเมื่อดึงข้อมูลผ่าน XHR)

49
ข้อผิดพลาดเกิดขึ้นเมื่อคุณลองและผนวกโหนดเข้ากับตัวเอง ฉันเพียงแค่วิ่งเข้าไปในหนึ่งนี้เอง :-)
เบนเคลย์ตัน

5
ฉันเพียงแค่นี้พยายามที่จะเพิ่ม null เพื่อเป็นองค์ประกอบ (และเคล็ดลับที่ไม่เกี่ยวข้องกันโดยสิ้นเชิง - เสมอให้แน่ใจว่าฟังก์ชั่นของคุณกลับสิ่งที่คุณเขียนให้พวกเขากลับ: P)
Veli Gebrev

ฉันเห็นสิ่งนี้เมื่อหนึ่งในแท็กปิดหายไปจากเป้าหมาย
Tom H

IE (9) อาจมีข้อผิดพลาดนี้เมื่อใช้ jQuery เพื่อต่อท้ายผลลัพธ์ AJAX หลีกเลี่ยงสิ่งนี้โดยการใช้response.xmlที่มีอยู่ ตัวอย่างเช่น$(e).append(response.xml || $(response));
Courtney Christensen

รับสิ่งนี้เมื่อฉันเปลี่ยนจาก jQuery (เดสก์ท็อป) เป็น zepto บน Android เปลี่ยนกลับ
Ravindranath Akila

5

หากคุณได้รับข้อผิดพลาดนี้เนื่องจาก jquery ajax โทร $ .ajax

จากนั้นคุณอาจต้องระบุว่าdataTypeกำลังกลับมาจากเซิร์ฟเวอร์ใด ฉันได้แก้ไขคำตอบมากมายโดยใช้คุณสมบัติที่เรียบง่ายนี้

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

1
ฐานรหัสเดียวสำหรับเว็บ / PhoneGap, refactored แบบไดนามิกโหลดแม่แบบการใช้คำตอบโดย koorchik ที่stackoverflow.com/questions/8366733/... ทำงานในเบราว์เซอร์เดสก์ท็อปไม่ทำงานในเบราว์เซอร์มือถือหรือแอปเนทีฟ วิธีนี้แก้ปัญหาได้
Kinjal Dixit

ปัญหาเดียวกันที่นี่อย่างแปลกประหลาดเฉพาะใน iOS 5 การระบุ dataType ทำงาน ขอบคุณ
homerjam

3

โดยเฉพาะกับ jQuery คุณสามารถพบปัญหานี้ได้หากลืม carets รอบ ๆ แท็ก html เมื่อสร้างองค์ประกอบ:

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

จะเพิ่มข้อผิดพลาดนี้เพราะสิ่งที่คุณหมายถึงคือ

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

3

ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อคุณพยายามที่จะแทรกโหนดใน DOM ซึ่งเป็น HTML ที่ไม่ถูกต้องซึ่งอาจเป็นสิ่งที่ละเอียดอ่อนเป็นแอตทริบิวต์ที่ไม่ถูกต้องตัวอย่างเช่น:

// <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-Typeในการตอบสนองแทนการเอาชนะประเภทการตอบสนองทางด้าน JavaScript การตั้งค่าของคุณContent-Typeไปtext/htmlและคุณจะมีการปรับ

ในกรณีของฉันมันก็เป็นเรื่องง่ายเหมือนการเปลี่ยนชื่อfile.xhtmlไปfile.html- โปรแกรมเซิร์ฟเวอร์มีบางส่วนขยายเป็น MIME แมปประเภทออกจากกล่อง เมื่อเนื้อหาเป็นแบบไดนามิกคุณสามารถตั้งค่าประเภทของการตอบสนองอย่างใดอย่างหนึ่ง (เช่นres.setContentType("text/html")ใน Servlet API)


1

คุณสามารถดูคำถามเหล่านี้

รับ HIERARCHY_REQUEST_ERR เมื่อใช้ Javascript เพื่อสร้างรายการซ้อน

หรือ

ไดอะล็อก jQuery UI พร้อม postback ปุ่ม ASP.NET

บทสรุปคือ

เมื่อคุณพยายามใช้ฟังก์ชั่นผนวกคุณควรใช้ตัวแปรใหม่เช่นตัวอย่างนี้

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

ฉันจะเพิ่มคำตอบเฉพาะเจาะจงอีกหนึ่งข้อที่นี่เพราะมันเป็นการค้นหาคำตอบ 2 ชั่วโมง ...

ฉันพยายามฉีดแท็กลงในเอกสาร html เป็นเช่นนี้:

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

หากคุณสังเกตเห็นแท็กจะปิดในตัวอย่างก่อนหน้า ( <area/>) สิ่งนี้ไม่ได้รับการยอมรับในเบราว์เซอร์ Chrome ดูเหมือนว่าโรงเรียนw3จะคิดว่ามันควรจะปิดและฉันไม่สามารถหาข้อมูลจำเพาะอย่างเป็นทางการในแท็กนี้ แต่แน่ใจว่าใช้งานไม่ได้ใน Chrome Firefox จะไม่ยอมรับมันด้วย<area/>หรือหรือ<area></area> โครเมี่ยมจะต้องมี<area> <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: ไม่สามารถเรียกใช้ 'appendChild' บน 'Node': พารามิเตอร์ 1 ไม่ได้เป็นประเภท 'Node' (…) นั่นเป็นเพราะ. html () เป็นสตริงประเภทและ appendChild คาดหวังว่าโหนดประเภท
joedotnot

1

ข้อผิดพลาดนี้เกิดขึ้นกับฉันใน IE9 เมื่อฉันพยายามที่จะผนวกเด็กที่มีอยู่แล้วในหน้าต่าง A. หน้าต่าง A จะสร้างหน้าต่างลูก B ในหน้าต่าง B หลังจากผู้ใช้บางคนฟังก์ชั่นจะทำงานและทำ appendChild บน องค์ประกอบแบบฟอร์มในหน้าต่าง A โดยใช้ window.opener.document.getElementById('formElement').appendChild(input);

นี่จะทำให้เกิดข้อผิดพลาด เช่นเดียวกับการสร้างองค์ประกอบอินพุตโดยใช้document.createElement('input');ในหน้าต่างลูกผ่านมันเป็นพารามิเตอร์ไปที่window.openerหน้าต่าง A และมีผนวก เฉพาะในกรณีที่ฉันสร้างองค์ประกอบอินพุตในหน้าต่างเดียวกับที่ฉันจะผนวกมันก็จะประสบความสำเร็จโดยไม่มีข้อผิดพลาด

ดังนั้นข้อสรุปของฉัน (โปรดยืนยัน): ไม่มีองค์ประกอบใดที่สามารถสร้างแบบไดนามิก (ใช้document.createElement) ในหน้าต่างเดียวและต่อท้าย (ใช้.appendChild) กับองค์ประกอบในหน้าต่างอื่น (โดยไม่ต้องใช้ขั้นตอนพิเศษที่ฉันพลาดเพื่อให้แน่ใจว่าไม่ได้พิจารณาว่าเป็น XML หรือบางสิ่งบางอย่าง). สิ่งนี้ล้มเหลวใน IE9 และส่งข้อผิดพลาดใน FF นี้ทำงานได้ดีแม้ว่า

PS ฉันไม่ได้ใช้ 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'));

ฉันยังไม่เข้าใจวิธีการสร้างองค์ประกอบ dom กับ jQuery โดยใช้บริบทหน้าต่างที่แตกต่างกัน


0

ฉันได้รับข้อผิดพลาดนี้ใน IE9 หากฉันปิดใช้งานตัวเลือกการดีบักสคริปต์ (Internet Explorer) หากฉันเปิดใช้งานการดีบักสคริปต์ฉันไม่เห็นข้อผิดพลาดและหน้าเว็บทำงานได้ดี ดูเหมือนว่าแปลกที่ข้อยกเว้น DOM เกี่ยวข้องกับการดีบักทั้งที่เปิดใช้งานหรือปิดใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.