Как именно это относится к 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 связано с включенной или отключенной отладкой.