jQuery .append не работает с массивами неучтенных DOM-узлов? - PullRequest
4 голосов
/ 28 апреля 2011

Это приводит к ошибке, связанной с DOM («Uncaught Error: NOT_FOUND_ERR: DOM Exception 8» в Chrome):

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 ]

4 голосов
/ 28 апреля 2011

$(element) возвращает объект, созданный jQuery, который имеет ссылку на элемент.$(array) то же самое, но с несколькими ссылками.И вот, вы вроде как делаете: $($(element)) за исключением того, что при передаче массива он, очевидно, не проверяет, являются ли они уже объектами jQuery.

Похоже, они об этом не подумалиUseCase.Они не обрабатывают массивы: 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

1 голос
/ 23 февраля 2012

Исходя из других ответов, которые указывали, что jQuery (по крайней мере, до 1.6) не поддерживает массивы объектов jQuery, я решил извлечь объект dom и вставить его в массив.

var li1 = $("<li />").get(0);
var li2 = $("<li />").get(0);
var lis = [li1, li2];
$("<ul />").append(lis); 
0 голосов
/ 28 апреля 2011
var li$ = $("<li />");
var lis$ = $([li$]);

Что вы пытаетесь достичь с этим? Первый вытянет все теги <li/> на странице. Естественно, ваш второй пример сработает.

В первом примере он извлекает все теги <li/>, оборачивает их объектом jQuery и затем помещает этот объект jQuery в массив, который является параметром для другого объекта jQuery.

Я не думаю, что разработчики jQuery когда-либо думали об этом сценарии использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...