Chính xác thì nó liên quan đến jQuery như thế nào? Tôi biết thư viện sử dụng các hàm javascript gốc trong nội bộ, nhưng chính xác thì nó đang cố gắng làm gì mỗi khi có vấn đề như vậy xuất hiện?
Chính xác thì nó liên quan đến jQuery như thế nào? Tôi biết thư viện sử dụng các hàm javascript gốc trong nội bộ, nhưng chính xác thì nó đang cố gắng làm gì mỗi khi có vấn đề như vậy xuất hiện?
Câu trả lời:
Điều đó có nghĩa là bạn đã cố gắng chèn một nút DOM vào một vị trí trong cây DOM nơi nó không thể đi. Nơi phổ biến nhất tôi thấy là trên Safari, nơi không cho phép như sau:
document.appendChild(document.createElement('div'));
Nói chung, đây chỉ là một lỗi mà điều này thực sự được dự định:
document.body.appendChild(document.createElement('div'));
Các nguyên nhân khác nhìn thấy trong tự nhiên (tóm tắt từ ý kiến):
<!doctype html>
vào HTML đã chèn của bạn hoặc chỉ định loại nội dung khi tìm nạp qua XHR)response.xml
nơi có sẵn. Ví dụ:$(e).append(response.xml || $(response));
Nếu bạn gặp lỗi này do ajax jquery, hãy gọi $ .ajax
Sau đó, bạn có thể cần phải xác định những gì datatype sẽ trở lại từ máy chủ. Tôi đã sửa lỗi phản hồi rất nhiều bằng cách sử dụng tài sản đơn giản này.
$.ajax({
url: "URL_HERE",
dataType: "html",
success: function(response) {
$('#ELEMENT').html(response);
}
});
Lỗi này có thể xảy ra khi bạn cố gắng chèn một nút vào DOM là HTML không hợp lệ, có thể là một cái gì đó tinh tế như một thuộc tính không chính xác, ví dụ:
// <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
@Kelly Norton là đúng trong câu trả lời của mình The browser thinks the HTML you are attempting to append is XML
và gợi ý specifying the content type when fetching via XHR
.
Điều đó đúng tuy nhiên đôi khi bạn sử dụng các thư viện của bên thứ ba mà bạn sẽ không sửa đổi. Đó là giao diện người dùng JQuery trong trường hợp của tôi. Sau đó, bạn nên cung cấp quyền Content-Type
trong phản hồi thay vì ghi đè loại phản hồi về phía JavaScript. Đặt bạn Content-Type
đến text/html
và bạn cũng tốt.
Trong trường hợp của tôi, đó là dễ dàng như việc đổi tên file.xhtml
để file.html
- ứng dụng máy chủ đã có một số phần mở rộng cho MIME loại ánh xạ ra khỏi hộp. Khi nội dung động, bạn có thể đặt loại nội dung phản hồi bằng cách nào đó (ví dụ: res.setContentType("text/html")
trong API của Servlet).
Bạn có thể thấy những câu hỏi này
Bắt HIERARCHY_REQUEST_ERR khi sử dụng Javascript để tạo đệ quy một danh sách lồng nhau
hoặc là
Hộp thoại UI UI với postback nút ASP.NET
Kết luận là
Khi bạn cố gắng sử dụng chức năng chắp thêm, bạn nên sử dụng biến mới, như ví dụ này
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"));
});
Trong ví dụ trên, sử dụng var "dlg" để chạy hàm appendTo. Sau đó, lỗi HIERARCHY_REQUEST_ERR "sẽ không xuất hiện trở lại.
Tôi đã gặp lỗi này khi sử dụng tiện ích mở rộng Google Chrome Sidewiki. Vô hiệu hóa nó giải quyết vấn đề cho tôi.
Tôi sẽ thêm một câu trả lời cụ thể hơn ở đây vì đó là 2 giờ tìm kiếm cho câu trả lời ...
Tôi đã cố gắng tiêm một thẻ vào một tài liệu. Các html là như thế này:
<map id='imageMap' name='imageMap'>
<area shape='circle' coords='55,28,5' href='#' title='1687.01 - 0 percentile' />
</map>
Nếu bạn nhận thấy, thẻ được đóng trong ví dụ trước ( <area/>
). Điều này không được chấp nhận trong trình duyệt Chrome. w3schools dường như nghĩ rằng nó nên bị đóng và tôi không thể tìm thấy thông số chính thức về thẻ này, nhưng nó chắc chắn không hoạt động trong Chrome. Firefox sẽ không chấp nhận nó với <area/>
hoặc <area></area>
hoặc <area>
. Chrome phải có <area>
. IE chấp nhận bất cứ điều gì.
Dù sao, lỗi này có thể là do HTML của bạn không đúng.
Tôi biết chủ đề này đã cũ, nhưng tôi đã gặp phải một nguyên nhân khác của vấn đề mà những người khác có thể thấy hữu ích. Tôi đã gặp lỗi với Google Analytics khi cố gắng tự thêm vào nhận xét HTML. Mã vi phạm:
document.documentElement.firstChild.appendChild(ga);
Điều này gây ra lỗi vì yếu tố đầu tiên của tôi là một nhận xét HTML (cụ thể là mã mẫu Dreamweaver).
<!-- #BeginTemplate "/Templates/default.dwt.php" -->
Tôi đã sửa đổi mã vi phạm thành một thứ được thừa nhận là không chống đạn, nhưng tốt hơn:
document.documentElement.firstChild.nodeType===1 ? document.documentElement.firstChild.appendChild(ga) : document.documentElement.lastChild.appendChild(ga);
Nếu bạn gặp phải vấn đề này trong khi cố gắng nối một nút vào một cửa sổ khác trong Internet Explorer, hãy thử sử dụng HTML bên trong nút thay vì chính nút đó.
myElement.appendChild(myNode.html());
IE không hỗ trợ nối các nút vào một cửa sổ khác.
ERROR này đã xảy ra với tôi trong IE9 khi tôi cố gắng nối thêm một cách linh hoạt vào một cửa sổ đã tồn tại trong cửa sổ A. Cửa sổ A sẽ tạo một cửa sổ con B. Trong cửa sổ B sau khi một số hành động của người dùng, một chức năng sẽ chạy và thực hiện một appendChild trên phần tử biểu mẫu trong cửa sổ A bằng cách sử dụng window.opener.document.getElementById('formElement').appendChild(input);
Điều này sẽ ném một lỗi. Tương tự với việc tạo phần tử đầu vào bằng cách sử dụng document.createElement('input');
trong cửa sổ con, chuyển nó dưới dạng tham số cho window.opener
cửa sổ A và thực hiện nối thêm. Chỉ khi tôi tạo phần tử đầu vào trong cùng một cửa sổ nơi tôi sẽ nối nó, nó sẽ thành công mà không có lỗi.
Do đó, kết luận của tôi (vui lòng xác minh): không có phần tử nào có thể được tạo động (sử dụng document.createElement
) trong một cửa sổ, sau đó nối (sử dụng .appendChild
) vào một phần tử trong một cửa sổ khác (mà không cần thêm một bước cụ thể nào mà tôi đã bỏ lỡ để đảm bảo nó không được coi là XML hoặc một cái gì đó). Điều này không thành công trong IE9 và đưa ra lỗi, trong FF điều này vẫn hoạt động tốt.
Tái bút Tôi không sử dụng jQuery.
Một lý do khác có thể xảy ra là bạn đang nối thêm trước khi phần tử sẵn sàng, vd
<body>
<script>
document.body.appendChild(foo);
</script>
</body>
</html>
Trong trường hợp này, bạn sẽ cần di chuyển tập lệnh sau. Không hoàn toàn chắc chắn nếu đó là kosher, nhưng di chuyển tập lệnh sau khi cơ thể dường như không giúp đỡ: /
Thay vì di chuyển tập lệnh, bạn cũng có thể thực hiện nối thêm trong trình xử lý sự kiện.
Chỉ để tham khảo.
IE sẽ chặn việc nối thêm bất kỳ phần tử nào được tạo trong ngữ cảnh cửa sổ khác với ngữ cảnh cửa sổ mà phần tử đó đang được thêm vào.
ví dụ
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'));
Tôi chưa tìm ra cách tạo một phần tử dom với jQuery bằng cách sử dụng bối cảnh cửa sổ khác.
Tôi gặp lỗi này trong IE9 nếu tôi đã tắt tùy chọn gỡ lỗi tập lệnh (Internet Explorer). Nếu tôi bật gỡ lỗi tập lệnh, tôi không thấy lỗi và trang hoạt động tốt. Điều này có vẻ kỳ lạ là ngoại lệ DOM phải làm gì với gỡ lỗi được bật hoặc tắt.