是否有可以引用相关元素的jQuery选择器函数?

是否有可以引用相关元素的jQuery选择器函数?,jquery,jquery-selectors,Jquery,Jquery Selectors,下面是一些示例,我希望可以使用这些示例:$: $(':target', element); // Should return element $(':parent', element); // Should return parent of element $(':parent textarea', element); // Should return textareas within parent of element 我不想使用parent方法的原因是选择器是动态的,我不想解析它 编辑:

下面是一些示例,我希望可以使用这些示例:
$

$(':target', element); // Should return element
$(':parent', element); // Should return parent of element
$(':parent textarea', element); // Should return textareas within parent of element
我不想使用
parent
方法的原因是选择器是动态的,我不想解析它

编辑

这里有一个具体的例子

HTML:

如果
$
(称为
context
)和
:parent
伪选择器的第二个参数按我预期的方式工作,单击“Span 1”将隐藏“Span 2”


但事实并非如此。那么我如何编写这个函数,以便使用任何合理的绝对或相对选择器呢?

我有一个类似的要求(基本上是使用单个字符串选择器上下搜索DOM),在深入研究选择器的工作原理后,我发现这在普通选择器中是不可能的,因为选择器元素的评估是从右到左的,而您需要从左到右才能使您的建议起作用。我能够制作一个自定义选择器,它可以有一个
:this
引用,它可以让您进行类似的搜索,包括
:has(:this)
。我在这里重复了我的答案

基于大量的评论和一个关于为什么这是不可能的详细解释,我想到我想要的目标可以通过一个
$(document).find()
,但有一些目标元素的概念来实现。也就是说,以某种方式在选择器中以原始查询元素为目标

为此,我想出了一个
:这个
选择器,它的工作原理是这样的(没有双关语):

这使我们现在可以有效地在单个选择器字符串中向上搜索DOM,然后向下搜索相邻的分支即,它执行与此相同的任务(但在单个选择器中):

步骤: 1-添加新的
jQuery.find此方法

2-如果选择器有
:此
,则替换id搜索,并从
文档
搜索

3-如果选择器不包含
:此过程通常使用原始
查找

4-使用类似于
$('.target')的选择器进行测试。查找('.祖先:has(:this).label')
以在目标元素的祖先内选择标签

这是基于注释的修订版本,它不替换现有的find,而是使用生成的唯一id

JSFiddle: JavaScript:

<div>
    <span data-hide="div:has(:this) span:eq(1)">Span 1</span>
    <span>Span 2</span>
</div>
$('[data-hide]').on('click', function()
{
    var selector = $(this).attr('data-hide');
    $(this).findThis(selector).hide();
});

不没有名为
:parent
:target
的选择器。。。你为什么想要它听起来像是你应该检查。你想要从
$(':target',元素)
中得到什么本质上与从绑定事件回调中得到的
$(这个)
是一样的。@Arun P Johny:事实上,有,他们只是不做所要求的事情。@BoltClock是的,这就是我的意思
// Find all labels under .level3 classes that have the .starthere class beneath them
$('.starthere').findThis('.level3:has(:this) .label')
$('.starthere').parents('.level3').find('.label')
// Add findThis method to jQuery (with a custom :this check)
jQuery.fn.findThis = function (selector) {
    // If we have a :this selector
    if (selector.indexOf(':this') > 0) {
        var ret = $();
        for (var i = 0; i < this.length; i++) {
            var el = this[i];
            var id = el.id;
            // If not id already, put in a temp (unique) id
            el.id = 'id'+ new Date().getTime();
            var selector2 = selector.replace(':this', '#' + el.id);
            ret = ret.add(jQuery(selector2, document));
            // restore any original id
            el.id = id;
        }
        ret.selector = selector;
        return ret;
    }
    // do a normal find instead
    return this.find(selector);
}

// Test case
$(function () {
    $('.starthere').findThis('.level3:has(:this) .label').css({
        color: 'red'
    });
});
<div>
    <span data-hide="div:has(:this) span:eq(1)">Span 1</span>
    <span>Span 2</span>
</div>
$('[data-hide]').on('click', function()
{
    var selector = $(this).attr('data-hide');
    $(this).findThis(selector).hide();
});