jQuery .append 不适用于断开连接的 DOM 节点数组?

标签 jquery dom

这会引发 DOM 相关错误(Chrome 中的“Uncaught Error: NOT_FOUND_ERR: DOM Exception 8”):

var li$ = $("<li />");
var li2$ = $("<li />");
var lis$ = $([li$, li2$]);
$("<ul />").append(lis$);    // doing [li$, li2$] instead of lis$ breaks too

这段代码工作正常:

var li$ = $("<li />");
var li2$ = $("<li />");
$("<ul />").append(li$).append(li2$);

这不是受支持的场景吗?如果是这样,有什么想法为什么不呢?我应该报告 jQuery 中的错误吗?

(顺便说一句,1.5.2,但 JSFiddle 上的每个版本都会给出相同的错误,所以至少它不是回归。)

最佳答案

$(element) 返回一个由 jQuery 创建的对象,该对象具有对该元素的引用。 $(array) 相同,但有多个引用。 在这里,你有点在做: $($(element)) 除了当你传入一个数组时,它显然不会检查它们是否已经是 jQuery 对象。

看起来他们没有想到这个用例。 它们不处理数组:https://github.com/jquery/jquery/blob/master/src/core.js

等等...他们确实:

var b = document.body;
$( [ b.firstChild, b.lastChild ] ).text( );//OK


var b = document.body;
$( [ $( b.firstChild ), $( b.lastChild ) ] ).text( );//FAIL

问题似乎出在 makeArray 第 645 行,因为 init 方法似乎不处理数组,并且如果没有匹配的内容,则会调用 makeArray。 makeArray 调用 merge 将 jQuery 对象(具有数组必须具有的属性)合并到选择器或 [] 的结果中并返回它。

问题已解决:https://gist.github.com/947169 如果您想了解具体方法,请查看

我将发布问题或提出拉取请求。 在他们更改之前,您可以只包含: https://gist.github.com/raw/947169/6a9711ead197e17a636d7c43b72dc8efd7a6baec/jQuery.js

机票:http://bugs.jquery.com/ticket/9011 拉取请求:https://github.com/jquery/jquery/pull/359

关于jQuery .append 不适用于断开连接的 DOM 节点数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5823776/

相关文章:

javascript - 选择时将箭头移动到每个菜单

javascript - 不支持 history.pushState 的标题,什么是好的选择?

html - 为什么DOM中Attr继承自Node?

java - 从 xml 字符串构建 DOM 文档给我一个空文档

javascript - 使用 html 和 jQuery 以及来自 Java 的输入动态加载选项卡

jquery - 如何阻止 .next() 离开 li 列表

javascript - document.open 如何影响历史?

javascript - 如何在 JavaScript 中将任何对象显示为字符串?

javascript - Cart to Fly Uncaught TypeError : Cannot read property 'top' of undefined

javascript - jQuery:fadeIn、slideDown 或类似内容的延迟