Ответ 1
Как насчет этого?
var myel = $('> div.my', this).length ? $('> div.my', this) : $('<div class="my"></div>').css('opacity', 0).appendTo(this);
Как я могу узнать, имеет ли какой-то элемент другой элемент в качестве дочернего? И если это не так, добавьте к нему новый, а затем верните его.
Я попробовал:
var myel = ($('> div.my', this).length > 0)
? $('> div.my', this)
: $(this).append('<div class="my"></div>').css('opacity', 0);
но даже если он создает мой элемент, если он не существует, он не возвращает его...
Как насчет этого?
var myel = $('> div.my', this).length ? $('> div.my', this) : $('<div class="my"></div>').css('opacity', 0).appendTo(this);
Вот как я это сделаю:
var myDivs = $('div.container').children('div.my');
if(myDivs.length === 0){
myDivs = $('<div class="my"></div> ')
.appendTo('div.container')
.css('opacity', 0);
}
Мое рассуждение состоит в том, что вам нужно только один раз запросить детей, поэтому, если их много, это сэкономит время.
Кроме того, если нет детей, вы создаете один, appendTo
контейнер, выполняете css и затем возвращаете его.
Аналогично методу Alastair, но с использованием фильтров:
$('div.outerDiv:not(:has(div.my))').each(function(){
$('<div class="my"></div>')
.appendTo(this)
.css('opacity', 0);
});
Поздно, я знаю, но другой подход, добавляющий синтаксический сахар и делая вещи разборчивыми ИМО:
function ifNotExists($x){
if(!$x || $x.length === 0) return { create : function(newX){ return newX; }}
else return { create : function(){ return $x } };
}
//usage:
$someDiv.append(ifNotExists("div.child").create("<div class='child'>"));