Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 非标准查找法_Javascript_Jquery - Fatal编程技术网

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,它将