有人能打败这个jQuery选择器吗?

有人能打败这个jQuery选择器吗?,jquery,jquery-selectors,Jquery,Jquery Selectors,我一直在运行一些测试,看看是否可以为Asp.Net中前缀为父控件id的控件找到一个有效的选择器 我一直在寻找这个,因为我能够从外部javascript文件中选择Asp控件(我厌倦了使用ClientID) 为了进行测试,我设置了一个包含150个文本框的页面,所有文本框都带有cssclass“speedy”和个人id,并运行以下代码来选择第107个文本框 function testclientInput() { var iterations = 100; var totalTime

我一直在运行一些测试,看看是否可以为Asp.Net中前缀为父控件id的控件找到一个有效的选择器

我一直在寻找这个,因为我能够从外部javascript文件中选择Asp控件(我厌倦了使用ClientID)

为了进行测试,我设置了一个包含150个文本框的页面,所有文本框都带有cssclass“speedy”和个人id,并运行以下代码来选择第107个文本框

function testclientInput() {

    var iterations = 100;
    var totalTime = 0;

    // Record the starting time, in UTC milliseconds.
    var start = new Date().getTime();

    // Repeat the test the specified number of iterations.
    for (i = 0; i < iterations; i++) {
        // Execute the selector. The result does not need
        // to be used or assigned to determine how long 
        // the selector itself takes to run.

        // All tests done in ie6, ie7, ie8, ie9beta, firefox3.6, opera11 & chrome8

        // slowest
        // $('input.speedy[id$=_TextBox107]');

        // Quick but only useful if you know the index.
        //$($('input.speedy')[106]);

        //$('[id$=_TextBox107]:first');

        //$('input[id$=_TextBox107]');

        //$.clientID("TextBox107");

        //$('[id$=_TextBox107]');

        //$('input[id$=_TextBox107]:first');

        //$($('[id$=_TextBox107]')[0]);

       // Fastest
       //$($('input[id$=_TextBox107]')[0]);
    }

    // Record the ending time, in UTC milliseconds.
    var end = new Date().getTime();

    // Determine how many milliseconds elapsed
    totalTime = (end - start);

    // Report the average time taken by one iteration.
    alert(totalTime / iterations);

};
函数testclientInput(){
var迭代次数=100;
var totalTime=0;
//记录开始时间,以UTC毫秒为单位。
var start=new Date().getTime();
//以指定的迭代次数重复测试。
对于(i=0;i
这是我想到的最好的<代码>$($('input[id$=\U TextBox107])[0])。结果令人惊讶。。。。我希望使用
:first
选择器来匹配我的版本,但它报告的结果要慢得多


有人能想出一个优化的方法吗?

这取决于浏览器

此版本:

$('input[id$=_TextBox107]')
…是一个有效的
queryselectoral
选择器,因此任何实现它的浏览器都将非常快速

如果使用
:first
选择器,则使用的是无效的CSS选择器,因此它默认为Sizzle基于javascript的选择器引擎,速度会慢得多

如果性能至关重要,那么不要为此使用jQuery。如果浏览器不支持
querySelectorAll
,您只需使用
document.getElementsByTagName()
,并筛选所需的文件即可

var match;
if( !document.querySelectorAll ) {
    var inputs = document.getElementsByTagName('input');

    for( var i = 0, len = inputs.length; i < len; i++) {
        if( /_TextBox107/.test( inputs[i].id ) ) {
            var match = $(inputs[i]);
            break;
        }
    }
} else {
    match = $( document.querySelectorAll( 'input[id$=_TextBox107]' )[0] );
}
var匹配;
如果(!document.queryselectoral){
var inputs=document.getElementsByTagName('input');
对于(变量i=0,len=inputs.length;i
我没有做任何详尽的测试,但我使用的是“最慢”选择器,其速度与“最快”选择器的速度差不多……不过,其他一些选项的速度明显较慢。但是,我只使用IE8进行了测试

在阅读这篇文章之前,我选择的方法是

$("[id$='_TextBox107']")

它的表现比你的“最快的”慢一些,但远不是最差的选择。我可能需要做更多的测试并重新考虑我的选择。

对不起,但是为什么不能使用
document.getElementById(“\u TextBox107”)
?ID应该是唯一的anyway@Harmen:他使用的属性以选择器结尾,因此
\u TextBox107
只是ID的最后一部分。@Harmen:因为asp控件的前缀是它们的父ID。我在问题中确实说明了这一点。我认为这样做是不好的,因为MS可以(并且已经)这样做更改了生成控件ID的方式。到目前为止,您可以保证无论使用何种版本的.Net,ID都将以_TextBox107结尾,但您不能保证.Net 4.1仍会这样做。此外,您的测试假定没有缓存。意思是:在1000次迭代中,第一次可能会慢一些,但它可能不会缓存,而使用jQuery运行的最后999次迭代会被缓存。@Matt-我不打算对所有事情都使用选择器。我有很多2.0/3.5站点,正确的选择器可以帮助我。特别是一个网站。我知道这个测试很简单,但它应该能给我一个大致的指示。@Stephen:这完全取决于浏览器。ie6和IE7在使用类时非常慢。@James:太棒了。很高兴听到这有帮助o) …此外,我还要补充一点,正则表达式的一个小改进是在
末尾添加
$
,如果(/\u TextBox107$/.test(inputs[I].id))
,或者可能根本不使用正则表达式,而是使用
indexOf()
<代码>如果(输入[i].id.indexOf(“\u TextBox107')!=-1)
。这可能会执行得更好一些,我怀疑您是否会对字符串的特定部分产生任何误报。@Patrick:您不能编写一个接受参数代替输入的版本,TextBox107可以吗?我不断收到未确定的字符串错误。这快把我逼疯了@詹姆斯:当然。你能给我你到目前为止所拥有的吗,这样我就可以在此基础上继续发展。如果你能做一个我可以利用的工作,那就太好了。@Patrick:干杯!这是一个链接,我会先把你记下来作为答案:)