Фильтр jquery имеет +
Хорошо, у меня есть элементы списка, у некоторых есть диапазон, а некоторые нет.
В моем событии я хочу добавить span, когда они еще не установлены.
has()
работает отлично, но not()
добавляет span к обоим <
HTML:
<ul>
<li>
<p>item</p>
<span class="spn">empty span</span>
</li>
<li>
<p>item 2</p>
</li>
<ul>
<hr>
<a class="add-span"href="#">check</a>
JS:
$("a.add-span").click(function() {
$("li").each(function(index) {
// $(this).has("span").find("span").append(" - appended");
$(this).not("span").append('<span class="spn">new span<\/span>');
})
})
Ответы
Ответ 1
Вы можете использовать комбинацию : не и : has, такие как
$("a.add-span").click(function() {
$("li:not(:has(span))").each(function(index) {
$(this).append('<span class="spn">new span<\/span>');
});
});
Вот демон http://www.jsfiddle.net/xU6fV/
Ответ 2
$("a.add-span").click(function() {
$("li").each(function(index) {
if ($(this).children('span').length === 0){
$(this).append('<span class="spn">new span<\/span>');
}
})
})
С помощью метода children()
свойство length
используется для проверки того, уже или нет span
, а если нет, то добавляется/добавляется.
Дополнительная информация:
Ответ 3
Принятый ответ работает хорошо, если вы не хотите отфильтровывать только те элементы, которые имеют 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() { /* ... */ })
Ответ 4
Попробуйте это,
$("a.add-span").click(function() {
$("li:not(:has(span))").each(function(index) {
$(this).append($("<span class='spn'>").html("Newly Added Span"));
});
});
Ответ 5
Это первая ссылка на 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('<span class="spn">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('<span class="spn">new span<\/span>');
https://jsfiddle.net/2g08gjj8/1/