Как именно это относится к jQuery? Я знаю, что библиотека использует встроенные функции javascript для внутреннего использования, но что именно она пытается делать, когда возникает такая проблема?
Как именно это относится к jQuery? Я знаю, что библиотека использует встроенные функции javascript для внутреннего использования, но что именно она пытается делать, когда возникает такая проблема?
Ответы:
Это означает, что вы пытались вставить узел DOM в то место в дереве DOM, куда он не может перейти. Наиболее распространенное место, которое я вижу, это в Safari, которое не позволяет следующее:
document.appendChild(document.createElement('div'));
Вообще, это просто ошибка, когда это было задумано:
document.body.appendChild(document.createElement('div'));
Другие причины, замеченные в дикой природе (суммировано из комментариев):
<!doctype html>к введенному HTML или указав тип содержимого при извлечении через XHR)response.xmlгде это возможно. Например,$(e).append(response.xml || $(response));
Если вы получаете эту ошибку из-за jquery ajax, вызовите $ .ajax
Затем вам может понадобиться указать, что dataType возвращается с сервера. Я много исправил ответ, используя это простое свойство.
$.ajax({
url: "URL_HERE",
dataType: "html",
success: function(response) {
$('#ELEMENT').html(response);
}
});
Эта ошибка может возникать, когда вы пытаетесь вставить в 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
@ Келли Нортон прав в своем ответе 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).
Вы можете увидеть эти вопросы
или
Диалог jQuery UI с обратной передачей кнопки ASP.NET
Вывод
когда вы пытаетесь использовать функцию append, вы должны использовать новую переменную, как в этом примере
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» больше не будет появляться.
Я столкнулся с этой ошибкой при использовании дополнения Google Chrome Sidewiki. Отключение решило проблему для меня.
Я собираюсь добавить еще один конкретный ответ здесь, потому что это был двухчасовой поиск ответа ...
Я пытался вставить тег в документ. 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>. Хром должен иметь <area>. IE принимает все.
В любом случае, эта ошибка может быть из-за того, что ваш HTML неверен.
Я знаю, что эта ветка старая, но я столкнулся с другой причиной проблемы, которая может оказаться полезной для других. Я получаю сообщение об ошибке, когда 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);
Если вы столкнулись с этой проблемой при попытке добавить узел в другое окно в Internet Explorer, попробуйте использовать HTML внутри узла вместо самого узла.
myElement.appendChild(myNode.html());
IE не поддерживает добавление узлов в другое окно.
Эта ОШИБКА произошла со мной в IE9, когда я попытался динамически присоединить Child к объекту, который уже существовал в окне A. Окно A создаст дочернее окно B. В окне B после некоторого действия пользователя будет запущена функция и выполнит appendChild на элемент формы в окне A, используя window.opener.document.getElementById('formElement').appendChild(input);
Это может привести к ошибке. То же самое с созданием элемента input с использованием document.createElement('input');в дочернем окне, передачей его в качестве параметра в window.openerокно A и добавлением. Только если бы я создал элемент ввода в том же окне, в которое я собирался добавить его, он успешно завершился бы без ошибок.
Таким образом, мой вывод (пожалуйста, подтвердите): ни один элемент не может быть динамически создан (использован document.createElement) в одном окне, а затем добавлен (использован .appendChild) к элементу в другом окне (не предпринимая, возможно, какой-то дополнительный шаг, который я пропустил, чтобы убедиться, что он не считается XML или что-то). Это терпит неудачу в IE9 и выдает ошибку, в FF это работает все же хорошо.
PS. Я не использую jQuery.
Другая причина, по которой это может появиться, заключается в том, что вы добавляете данные до того, как элемент готов, например
<body>
<script>
document.body.appendChild(foo);
</script>
</body>
</html>
В этом случае вам нужно переместить скрипт после. Не совсем уверен, что это кошерно, но перемещение скрипта после тела, похоже, не помогает: /
Вместо перемещения сценария вы также можете добавлять в обработчик событий.
Просто для справки.
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, используя другой контекст окна.
Я получаю эту ошибку в IE9, если у меня отключена опция отладки скриптов (Internet Explorer). Если я включаю отладку сценария, я не вижу ошибки, и страница работает нормально. Это кажется странным, что исключение DOM связано с включенной или отключенной отладкой.