Это происходит потому, что селектор шипения просматривает все элементы Div, у которых есть дочерние объекты span в примере: has. Но в примере .has он передает все DIV в .has (), который затем ищет что-то, что не должно быть изолированным выбором. («Ничего не имеет детей»).
По сути,: has () является частью выбора, но .has () проходит эти div и затем повторно выбирает из них.
В идеале, вы не используете селекторы, подобные этому. Нахождение> в селекторе, вероятно, является ошибкой, так как семантически неудобно. Примечание: дочерний оператор не должен быть автономным.
Sizzle против target.sizzle:
Я всегда говорю о v1.4.2 выпуска jquery для разработки .
.has (строка 3748 jQuery)
Описание: Сократить набор соответствующих элементов до тех, у которых есть потомок , который соответствует селектору или элементу DOM.
Код:
var targets = jQuery( target );
return this.filter(function() {
for ( var i = 0, l = targets.length; i < l; i++ ) {
if ( jQuery.contains( this, targets[i] ) ) { //Calls line 3642
return true;
}
}
});
Строка 3642 относится к плагину 2008 года compareDocumentPosition , но важным моментом здесь является то, что мы сейчас просто выполняем два jquery-запроса, где первый выбирает $("DIV")
, а следующий - $(">span")
(который возвращает ноль), затем мы проверяем детей.
: имеет (строка 3129 jQuery)
Описание: выбирает элементы , которые содержат хотя бы один элемент , соответствующий указанному селектору.
код:
return !!Sizzle( match[3], elem ).length;
Это два разных инструмента: использует 100% и использует цели, переданные ему.
Примечание: если вы считаете, что это ошибка, перейдите к заполнению заявки на ошибку.