JQuery / Sizzle селектор, чтобы найти родителя текущего элемента? - PullRequest
3 голосов
/ 05 марта 2010

Есть ли способ получить родительский элемент выбранного элемента, используя только CSS-селекторы jQuery / sizzle?

Мне нужно иметь возможность получить родительский элемент при использовании jQuery, но я не могу использовать jQuery('#myelement').parent(), так как я получаю селектор в виде строки, а "пользователь" должен быть возможность двигаться вверх по дереву.

Я ничего не вижу в документах, поэтому мне интересно, не документировано ли это или есть какой-нибудь хак, который я могу использовать?

Ответы [ 4 ]

3 голосов
/ 04 июля 2014

Правильное решение (т. Е. Решение, которое фактически использует jQuery селекторы , а не jQuery API):

$(':has(> #myElement)');

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

Для справки, API-интерфейс jQuery может быть недопустимой заменой селекторов в некоторых случаях, таких как:

$(document).on('click', ':has(> .widget)', function () {
    // ...
});

В этом случае селектор позволяет фильтровать живые события.

1 голос
/ 05 марта 2010

Такой селектор не существует, ни в CSS, ни в jQuery / Sizzle.

Вы можете изменить исходный код?

Если да, можно добавить пользовательский псевдо-селектор:

jQuery.expr[":"].getParent = function (node, index, prop, nodes) {
    return jQuery(node).parent(); 
};

Пример использования (обратите внимание, что родительский элемент уже существует, поэтому вместо него я использовал getParent):

jQuery('#myelement:getParent');
0 голосов
/ 05 марта 2010

Поскольку CSS не может пройти обратно по дереву, как это делает XPath, я делаю несколько манипуляций и проверяю символ < в строке, разбив его на части и вызывая .parent() вручную.Это не оптимально, но работает.

0 голосов
/ 05 марта 2010

jQuery(jQuery('#myelement').parent()) получает объект без дополнительной функции.

Хорошо, конец шутки;)

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

jQuery('#'+jQuery('#myelement').parent().attr('id')).live(something);

Это способ, которым Ты делаешь это, чтобы заставить это работать.Если у родительского элемента нет идентификатора Вы можете использовать более сложные приемы

    //newline for reading comfort. skip it. --v
jQuery('[title='+jQuery('#myelement').parent() 
.attr('title',Math.round(Math.random()*100000)+']').attr('title')).live(something);

Вы можете использовать идентификатор или заголовок или класс, в зависимости от того, что уже есть на странице

И если Вы действительно нужно, чтобы его находил только css-селектор - насколько я знаю, это невозможно с помощью css-селекторов по дизайну

...