jQuery insertAfter не является функцией - PullRequest
1 голос
/ 24 июня 2019

Мне нужно вставить элемент в элемент Dom снаружи для каждого:

$items1 = [];
$.each($('.qs-option-name'), function () {
   if($(this).find('span.highlighted').length === 1){
      $item  = $(this).parent().parent();
      console.log($item);
      $items1.push($item);
   }
 });
 console.log($items1);
 $items1.insertAfter('ul li.first');

console.log () внутри для каждого: enter image description here

console.log () снаружи для каждого:

enter image description here

Не уверен, что повторное зацикливание массива для вставки эффективно, есть ли способ вставить массив элементов DOM за один раз?

1 Ответ

2 голосов
/ 24 июня 2019

Проблема заключается в том, что $items1 является массивом объектов jQuery и поэтому не имеет метода insertAfter().

Чтобы решить эту проблему, вы можете создать объект jQuery из массива:

$($items1).insertAfter('ul li.first');

В качестве альтернативы вы можете использовать add() для объединения объектов jQuery вместо создания базового массива:

var $items1 = $();
$('.qs-option-name').each(function() {
  if ($(this).find('span.highlighted').length === 1) {
    $item = $(this).parent().parent();
    $items1.add($item);
  }
});
$items1.insertAfter('ul li.first');

Однако вы можете сделать логику более лаконичной, используя :has() и map():

var $items1 = $('.qs-option-name:has(span.highlighted)').map(function() {
  return $(this).parent().parent();
}).get();
$items1.insertAfter('ul li.first');

Обратите внимание, что приведенное выше немного отличается тем, что :has() будет соответствовать любому дочернему элементу, а не толькоодин экземпляр, как это сделал ваш оригинал, но с учетом контекста, который не кажется важным различием.

...