Фильтр jquery имеет +

Хорошо, у меня есть элементы списка, у некоторых есть диапазон, а некоторые нет.
В моем случае я хочу добавить span, когда они еще не установлены.

has() работает отлично, но not() добавляет span к обоим?

HTML:

 
  • item

    empty span
  • item 2

JS:

 $("a.add-span").click(function() { $("li").each(function(index) { // $(this).has("span").find("span").append(" - appended"); $(this).not("span").append('new span'); }) }) 

Вы можете использовать комбинацию : not и : имеет селектора, подобные этому

 $("a.add-span").click(function() { $("li:not(:has(span))").each(function(index) { $(this).append('new span<\/span>'); }); }); 

Вот демонстрация http://www.jsfiddle.net/xU6fV/

 $("a.add-span").click(function() { $("li").each(function(index) { if ($(this).children('span').length === 0){ $(this).append('new span<\/span>'); } }) }) 

С методом children() свойство length используется для проверки того, выходит ли уже span а если нет, добавляется / добавляется.

Больше информации:

Принятый ответ работает хорошо, если вы не хотите отфильтровывать только те элементы, которые имеют span качестве прямых детей.

Поскольку :has() и цикл .has() над всеми потомками, а не только дочерние.

В этом случае вам нужно использовать функцию

 $("li").not(function() { // returns true for those elements with at least one span as child element return $(this).children('span').length > 0 }).each(function() { /* ... */ }) 

Попробуй это,

 $("a.add-span").click(function() { $("li:not(:has(span))").each(function(index) { $(this).append($("").html("Newly Added Span")); }); }); 

Это первая ссылка на Google при поиске «jquery not have». Конкретный сценарий, который мне нужно было решить, немного отличался от этого. Я должен был not элементы, которые имеют определенный элемент DOM, а не просто на основе тега. Это означало, что я не мог использовать селектор, который использовал каждое вышеприведенное решение.

Однако jQuery has() принимает элемент DOM! Поэтому я создал плагин jQuery для объединения этих двух встроенных функций.

Я хотел поделиться им здесь, потому что, надеюсь, это поможет другим в моей ситуации. Он также отвечает на исходный вопрос.

Плагин:

 (function ( $ ) { $.fn.extend({ not_has: function (param) { return this.not(this.has(param)); } }); }( jQuery )); 

Реализация:

 $("a.add-span").click(function() { $("li").not_has("span") .append('new span<\/span>'); // Prevent the page from navigating away return false; }); 

https://jsfiddle.net/brjkg10n/1/


Сначала я намеревался найти функцию jQuery, которая будет работать как addBack() но not вместо этого. Если вам нужно что-то настолько сложное, то, пожалуйста, не стесняйтесь использовать следующий плагин.

 (function ( $ ) { $.fn.extend({ notBack: function () { return this.prevObject.not(this); } }); }( jQuery )); 

При этом ответ будет следующим:

 $("li").has("span").notBack() .append('new span<\/span>'); 

https://jsfiddle.net/2g08gjj8/1/

  • Как я могу получить идентификатор элемента с помощью jQuery?
  • jQuery выбрать все, кроме первого
  • Включение / выключение флажков
  • Элемент или class LIKE для jQuery?
  • Выбор элементов с определенным цветом фона
  • Почему мой jQuery: not () не работает в CSS?
  • Селекторы jQuery с переменными
  • jQuery mobile - для каждого события прямого трансляционного события должно существовать эквивалентное событие click?
  • jQuery выбирает атрибут с использованием операторов AND и OR
  • Как я могу выбрать элемент с несколькими classами в jQuery?
  • Случай селектора CSS для атрибутов
  • Давайте будем гением компьютера.