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

时间:2011-04-28 19:15:37

标签: jquery dom

这会抛出与DOM相关的错误(Chrome中的“未捕获错误:NOT_FOUND_ERR:DOM异常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上的每个版本都会出现相同的错误,所以至少它不是回归。)

3 个答案:

答案 0 :(得分:4)

$(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对象(具有数组必须具有的属性)合并到selector或[]的结果中并返回它。

问题解决了:https://gist.github.com/947169 如果你想看看如何,请查看&lt; changes&gt;和&lt; / changes&gt;

我会发布问题或执行拉取请求。 在他们更改之前,您可以添加:https://gist.github.com/raw/947169/6a9711ead197e17a636d7c43b72dc8efd7a6baec/jQuery.js

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

答案 1 :(得分:1)

根据其他答案表明jQuery(至少1.6)不支持jQuery对象数组,我的解决方案是提取dom对象并将其插入到数组中。

var li1 = $("<li />").get(0);
var li2 = $("<li />").get(0);
var lis = [li1, li2];
$("<ul />").append(lis); 

答案 2 :(得分:-1)

var li$ = $("<li />");
var lis$ = $([li$]);

你想用这个来完成什么?第一个将拉取页面上的所有<li/>标记。很自然地,你的第二个例子可行。

你的第一个例子是它拉取所有<li/>标签,用jQuery对象包装它们然后将该jQuery对象放在一个数组中,该数组是另一个jQuery对象的参数。

我不认为jQuery开发人员曾经想过那个用例。