我只是想知道这段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循环经验。
答案 0 :(得分: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
参数。它不会在函数的任何地方使用。
答案 1 :(得分: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()
的定义,所以你不要为循环的每次迭代定义它。
答案 2 :(得分:1)
尝试使用Firebug's Profiling Feature衡量脚本的效果。
答案 3 :(得分:0)
应该没问题。如果#nav
元素不包含数千个链接,那么您应该没问题。
安装适用于Firefox的Firebug,您可以执行配置文件运行。它会告诉你它在每个函数中花费了多少时间。我猜这种情况将以毫秒为单位。
答案 4 :(得分:0)
如果你在Sizzle中使用^ =运算符(在这种情况下是jQuery),它基本上意味着“从这个值开始”。试试这个:
$(function(){
$( '#nav a:not( [href^="' + startsWith + '"] )' ).addClass( 'active' );
});
并将startsWith更改为您选择的变量。