是否有可以引用相关元素的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();
});