2009-12-21 84 views
0

我只是想知道这个片段的Javascript是否会到我的网站慢下来:这段Javascript效率低下吗?

$(function(){ 
var realLink = location.href; 
$("#nav a").each(
    function(intIndex){ 
    String.prototype.startsWith = function(str){ 
    return (this.indexOf(str) === 0); 
    } 
    var pageLink = $(this).attr("href"); 

    if (realLink.startsWith(pageLink)) 
    $(this).parent().addClass("active"); 
    } 
); 
}); 

只循环约5-7倍,我没有很多的JavaScript循环的经验。

+1

你为什么不尝试在各种浏览器中看到自己? – 2009-12-21 03:40:49

+0

你想做什么?看看链接是否进入同一页面的#value? – 2009-12-21 03:45:53

回答

5

这段代码没有任何内在的错误,除了你在循环中不断创建和分配函数String.prototype.startsWith。那当然,是一种不必要的工作,至少应该是:

$(function(){ 
var realLink = location.href; 
String.prototype.startsWith = function(str){ 
    return (this.indexOf(str) === 0); 
}; 
$("#nav a").each(
    function(intIndex){ 
    var pageLink = $(this).attr("href"); 
    if (realLink.startsWith(pageLink)) 
    $(this).parent().addClass("active"); 
    } 
); 
}); 

我还没有看到需要intIndex说法存在。它不在函数的任何地方使用。

+0

你回来了! :-) – 2009-12-21 03:46:53

+0

这就是答案!我不明白到底是什么字符串原型正在做(我是讽刺的jQuery之外的新的JavaScript) – 2009-12-23 06:39:20

0

应该没问题。如果#nav元素不包含数千个链接,那么您应该没问题。

安装Firefox的Firebug,你可以做一个配置文件运行。它会告诉你它在每个功能上花费了多少时间。我的猜测是这个情况会以毫秒为单位。

2

你能有这样的代码执行,改成一个好一点:

String.prototype.startsWith = function(str){ 
    return(this.indexOf(str) == 0); 
} 

$(function(){ 
    var realLink = location.href; 

    $('#nav a').each(function(intIndex){ 
     var pageLink = $(this).attr("href"); 
     if(realLink.startsWith(pageLink)) 
      $(this).parent().addClass("active"); 
     }); 
}); 

它只是爆发的startsWith()定义,所以你不要把它定义为循环的每个迭代。

0

如果你在Sizzle中使用^ =运算符(这个例子中是jQuery),它意味着“基本上以这个值开始”。试试这个:

$(function(){ 
    $('#nav a:not([href^="' + startsWith + '"])').addClass('active'); 
}); 

并改变startsWith到您选择的变量。