2010-09-24 107 views
0

要继续我的优雅的解决方案系列,我想弄清楚如何以更好的方式做到这一点。寻找更好的/优雅的解决方案这个JQuery代码

我骑自行车穿过所有的a标签并试图修改href。

此代码有效,但似乎马虎,并希望知道如何更有效地做到这一点。

$('a').each(function(){ 
    x=$(this).attr('href').replace(/mls\_number/i,'interior=yes&mls_number'); 
    $(this).attr('href', x); 
}); 
+1

您发布的JavaScript在语法上无效。你能发布一个完整的代码片段吗? – 2010-09-24 14:35:41

回答

1
$('a').each(function(i, e) { 
    e.href = e.href.replace(/mls\_number/i,'interior=yes&mls_number'); 
}); 

或者只用Mozilla的JS扩展

Array.forEach(document.getElementsByTagName('a'), function(e) { 
    e.href = e.href.replace(/mls\_number/i,'interior=yes&mls_number'); 
}); 
+0

工作完美,有道理 – 7null 2010-09-24 17:02:32

9

您可以使用.attr()函数重载,它允许你修改现有的属性值:

$('a').attr('href', function(index, attr) { 
    return attr.replace(/mls\_number/i, 'interior=yes&mls_number'); 
}); 
+0

解释本来很好,而不仅仅是勺子喂养答案。 – Spudley 2010-09-24 14:43:47

+1

@Spudley:我不认为这是一个神秘的答案。 – 2010-09-24 14:46:09

+3

@Spudley,这是jQuery的美丽。对于使用一般jQuery文化的人来说,代码应该是不言自明的。 – 2010-09-24 14:47:01

1

一个POJ缓存查询与倒计时while循环将是最快的方式来做到这一点:

var elms = Array.prototype.slice.apply(document.getElementsByTagName("a")), 
i = elms.length, 
e, 
href; 
while (i--) { 
    e = elms[i]; 
    href = e.href.replace(/mls\_number/i,'interior=yes&mls_number'); 
    e.setAttribute("href", href); 
} 
+0

Erm,将NodeList转换为数组有什么意义?特别是如果您要加快速度...... – MooGoo 2010-09-24 19:12:15

+0

因为您可以使用更快的迭代器,例如反向while循环(JavaScript中最快的循环),而不是DOMCollection对象上的for循环。转换为数组并不慢,迭代很慢。所以我们希望尽可能优化那部分。 – AutoSponge 2010-09-24 19:32:24

+0

为什么不能在NodeList上使用reverse while循环?它是一个类似于对象的数组,可以使用括号和数字键进行访问。另外,我认为你严重高估了反向while循环的性能优势,除非页面上有大约一百万个''标签。真的,这里绝大多数时间都会花费在'getElementsByTagName'中,通过整个DOM递归寻找匹配的节点。之后拾取的任何毫秒相比可以忽略不计。 – MooGoo 2010-09-24 19:48:17

相关问题