究竟是什么导致了“HIERARCHY_REQUEST_ERR:DOM Exception 3”-错误?

IT技术 javascript jquery domexception
2021-02-03 07:16:28

它与 jQuery 究竟有什么关系?我知道该库在内部使用本机 javascript 函数,但是每当出现此类问题时,它究竟想做什么?

6个回答

这意味着您已尝试将 DOM 节点插入到 DOM 树中它无法到达的位置。我看到的最常见的地方是在 Safari 上,它不允许以下内容:

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

通常,这只是一个实际意图的错误:

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

在野外看到的其他原因(从评论中总结):

  • 您正在尝试将节点附加到自身
  • 您正在尝试将 null 附加到节点
  • 您正在尝试将节点附加到文本节点。
  • 您的 HTML 无效(例如未能关闭您的目标节点)
  • 浏览器认为您尝试附加的 HTML 是 XML(通过添加<!doctype html>到您注入的 HTML 或在通过 XHR 获取时指定内容类型来修复
当目标中缺少一​​个结束标签时,我看到了这一点。
2021-03-15 07:16:28
当我在 Android 上从 jQuery(桌面)更改为 zepto 时得到了这个。换回来了。
2021-03-18 07:16:28
当使用 jQuery 附加 AJAX 结果时,IE(9) 可能会抛出此错误。通过response.xml在可用的地方使用来避免这种情况。例如,$(e).append(response.xml || $(response));
2021-03-30 07:16:28
当您尝试将节点附加到自身时也会发生该错误。我自己刚刚遇到了这个:-)
2021-04-03 07:16:28
我刚刚尝试向元素添加空值(以及一个完全不相关的提示 - 始终确保您的函数返回您编写它们返回的内容:P)
2021-04-13 07:16:28

如果您由于 jquery ajax 调用而收到此错误 $.ajax

然后您可能需要指定从服务器返回的数据类型。我使用这个简单的属性修复了很多响应。

$.ajax({
    url: "URL_HERE",
    dataType: "html",
    success: function(response) {
        $('#ELEMENT').html(response);
    }
});
web/phonegap 的单一代码库,重构为使用 koorchik 在stackoverflow.com/questions/8366733/... 上的答案动态加载模板在桌面浏览器中工作,在移动浏览器或本机应用程序中不起作用。这个解决方案成功了。
2021-03-21 07:16:28
同样的问题在这里,奇怪的是仅在 iOS 5 中。指定 dataType 有效。谢谢
2021-04-06 07:16:28

特别是使用 jQuery,如果在创建元素时忘记 html 标记周围的插入符号,您可能会遇到这个问题:

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

会引发这个错误,因为你的意思是

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

当您尝试将一个节点插入到无效 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

@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-Typetext/html,你就没事了。

就我而言,就像重命名file.xhtmlto一样简单file.html- 应用程序服务器具有一些开箱即用的 MIME 类型映射扩展。当内容是动态的时,您可以以某种方式设置响应的内容类型(例如res.setContentType("text/html")在 Servlet API 中)。