Javascript 非标准查找法
通常,当您调用Javascript 非标准查找法,javascript,jquery,Javascript,Jquery,通常,当您调用root.find('.test')时,它将返回test类在root中的所有元素。有没有办法考虑根/代码>作为可能的候选者? 换句话说,使用html <div id="x" class="test"></div> ,$('#x')。find('.test')将返回1个元素而不是零 如果我们推广它,在表达式root.find('condition1 condition2 condition3')中,我还希望对condition1进行根测试 我正在考虑创建
root.find('.test')
时,它将返回test
类在root
中的所有元素。有没有办法考虑<代码>根/代码>作为可能的候选者?
换句话说,使用html
<div id="x" class="test"></div>
,$('#x')。find('.test')
将返回1个元素而不是零
如果我们推广它,在表达式root.find('condition1 condition2 condition3')
中,我还希望对condition1
进行根测试
我正在考虑创建一个自定义的助手方法,但也许还有更优雅的方法
谢谢 没有干净的方法可以做到这一点,最接近的方法就是这样使用:
$('#x').find('.test').andSelf().filter('.test')
$('#x').find('.test').add($('#x').filter('.test'));
//or, shorter but slower:
$('#x').find('.test').add($('#x.test'));
<div class="this">
<div class="is" id="test">
<div class="a">
<div class="test">
</div>
</div>
</div>
</div>
如果选择一个选择器,它会稍微干净一些(并且效率更高,没有双重过滤),但只会短一点
使用内置方法最快(但有点混乱)的方法是复制ID选择器,如下所示:
$('#x').find('.test').andSelf().filter('.test')
$('#x').find('.test').add($('#x').filter('.test'));
//or, shorter but slower:
$('#x').find('.test').add($('#x.test'));
<div class="this">
<div class="is" id="test">
<div class="a">
<div class="test">
</div>
</div>
</div>
</div>
.没有干净的方法可以做到这一点,最接近的方法就是这样使用:
$('#x').find('.test').andSelf().filter('.test')
$('#x').find('.test').add($('#x').filter('.test'));
//or, shorter but slower:
$('#x').find('.test').add($('#x.test'));
<div class="this">
<div class="is" id="test">
<div class="a">
<div class="test">
</div>
</div>
</div>
</div>
如果选择一个选择器,它会稍微干净一些(并且效率更高,没有双重过滤),但只会短一点
使用内置方法最快(但有点混乱)的方法是复制ID选择器,如下所示:
$('#x').find('.test').andSelf().filter('.test')
$('#x').find('.test').add($('#x').filter('.test'));
//or, shorter but slower:
$('#x').find('.test').add($('#x.test'));
<div class="this">
<div class="is" id="test">
<div class="a">
<div class="test">
</div>
</div>
</div>
</div>
.为了澄清我认为你在问什么。。。如果正在搜索的元素已经是
,则希望.find('.test a')
仅搜索a
。test
以下是我对该功能的尝试:
$.fn.search = function(selector) {
selector = selector || '';
var parts = selector.split(/\s+/),
l = parts.length,
iAm = '',
find = '';
for (var x = l; x > 0; x--) {
// countning backwards from the end of the list
iAm = parts.slice(0, x).join(' ');
find = parts.slice(x).join(' ');
// if the 'iAm' portion of the selector matches this element
if (this.is(iAm)) {
// if there is no find portion (because we are the full selector) return ourself
// but add the children that also match the last portion of the selector
if (!find) return this.add(this.find(parts.slice(l-1).join('')));
// return the .find() using only the parts of the selector needed
return this.find(find);
}
}
// otherwise, resort to original .find()
return this.find(selector);
}
当然,由于拆分选择器部分的方式(
.split(/\s+/)
)对于带有空格的选择器来说,由于其他原因,例如.something:has(.other.thing)
或.something[value='12']
类型选择器无法与此功能一起使用以澄清我认为您的问题。。。如果正在搜索的元素已经是,则希望.find('.test a')
仅搜索a
。test
以下是我对该功能的尝试:
$.fn.search = function(selector) {
selector = selector || '';
var parts = selector.split(/\s+/),
l = parts.length,
iAm = '',
find = '';
for (var x = l; x > 0; x--) {
// countning backwards from the end of the list
iAm = parts.slice(0, x).join(' ');
find = parts.slice(x).join(' ');
// if the 'iAm' portion of the selector matches this element
if (this.is(iAm)) {
// if there is no find portion (because we are the full selector) return ourself
// but add the children that also match the last portion of the selector
if (!find) return this.add(this.find(parts.slice(l-1).join('')));
// return the .find() using only the parts of the selector needed
return this.find(find);
}
}
// otherwise, resort to original .find()
return this.find(selector);
}
当然,由于拆分选择器部分的方式(
.split(/\s+/)
)对于带有空格的选择器来说,由于其他原因,例如.something:has(.other.thing)
或.something[value='12']
类型选择器无法与此功能一起使用我认为您的案例有如下特点:
$('#x').find('.test').andSelf().filter('.test')
$('#x').find('.test').add($('#x').filter('.test'));
//or, shorter but slower:
$('#x').find('.test').add($('#x.test'));
<div class="this">
<div class="is" id="test">
<div class="a">
<div class="test">
</div>
</div>
</div>
</div>
然后您可以$test.search('.this.is.a.test')
并获取对内部div的引用
当然,这比使用正确的选择器查找()要慢得多。我认为您的案例有如下特点:
$('#x').find('.test').andSelf().filter('.test')
$('#x').find('.test').add($('#x').filter('.test'));
//or, shorter but slower:
$('#x').find('.test').add($('#x.test'));
<div class="this">
<div class="is" id="test">
<div class="a">
<div class="test">
</div>
</div>
</div>
</div>
然后您可以$test.search('.this.is.a.test')
并获取对内部div的引用
当然,这比使用正确的选择器查找()要慢得多。使用动态父对象并查找其内容。这可以包装在插件中
$('#x').wrap('<div />').parent()
.find('.test').css('margin-left', '20px') // affected have m-left: 20
.end().children().unwrap();
$('#x').wrap('').parent()
.find('.test').css('margin-left','20px')//受影响的有m-left:20
.end().children().unwrap();
使用动态父对象并查找其内容。这可以包装在插件中
$('#x').wrap('<div />').parent()
.find('.test').css('margin-left', '20px') // affected have m-left: 20
.end().children().unwrap();
$('#x').wrap('').parent()
.find('.test').css('margin-left','20px')//受影响的有m-left:20
.end().children().unwrap();
+1,在我的大脑中破解了这个问题后,这是唯一的好方法。@Stephen我不会称这个怪物为“尼斯”:)无论如何,看起来Nick是正确的,没有直接的解决办法。@Nick Many。使用复合选择器也很好。@Nikita-一般形式如下:
$.fn.findAndSelf=function(selector){返回this.find(selector).add(this.filter(selector));}代码>,你可以在这里测试它:谢谢你的jsPerf-Nick,我正准备自己做一个:)+1,在我的大脑中敲出这一个后,这是唯一的好方法。@Stephen我不会称这个怪物为“尼斯”:)无论如何,看起来Nick是正确的,没有直接的解决办法。@Nick Many。使用复合选择器也很好。@Nikita-一般形式如下:$.fn.findAndSelf=function(selector){返回this.find(selector).add(this.filter(selector));}代码>,你可以在这里测试:谢谢你的jsPerf Nick,我正准备自己做一个:)顺便问一下,你以前的答案有什么问题?您正确地理解了我的意图,我现在正在测试它。这一个的代码要小得多,并且将返回相同的结果;)--旧的答案可能会更快一些。。。很难说……这很有趣,我不知道“过滤器”是这样工作的!让我试试。@nikita-我也为你取消了旧答案…:)我运行的jsPerf的数据似乎表明这个方法和我想象的一样慢。。。比另一个要慢61%,你之前的答案有什么问题吗?您正确地理解了我的意图,我现在正在测试它。这一个的代码要小得多,并且将返回相同的结果;)--旧的答案可能会更快一些。。。很难说……这很有趣,我不知道“过滤器”是这样工作的!让我试试。@nikita-我也为你取消了旧答案…:)我运行的jsPerf的数据似乎表明这个方法和我想象的一样慢。。。对于你的两个答案(还有尼克),它比另一个+1慢了61%,这将给我一些锻炼大脑的东西:)这在其他情况下不起作用,例如:@Nick-Good point。。。我认为另一种解决方案效果更好,但这是一种可能的实现想法。@Nick-因为这似乎比另一种方法快得多-我更新了返回此以添加对选择器最后一部分的搜索以及对两个答案(和Nick)的+1,它将