Javascript getElement by href?
我有下面的脚本Javascript getElement by href?,javascript,href,getelementsbytagname,Javascript,Href,Getelementsbytagname,我有下面的脚本 var els = document.getElementsByTagName("a"); for(var i = 0, l = els.length; i < l; i++) { var el = els[i]; el.innerHTML = el.innerHTML.replace(/link1/gi, 'dead link'); } 我该怎么做才能让它只搜索具有匹配的href的对象?在每个元素上读写innerHTML属性可能非常昂贵,因此会导致您的速度减慢-
var els = document.getElementsByTagName("a");
for(var i = 0, l = els.length; i < l; i++) {
var el = els[i];
el.innerHTML = el.innerHTML.replace(/link1/gi, 'dead link');
}
我该怎么做才能让它只搜索具有匹配的
href
的对象?在每个元素上读写innerHTML
属性可能非常昂贵,因此会导致您的速度减慢-它迫使浏览器“序列化”元素,然后通过regexp运行该元素,然后再次“反序列化”。更糟糕的是,您正在对每个元素进行反序列化,即使它不匹配
相反,请尝试直接查看a
元素的属性:
var els = document.getElementsByTagName("a");
for (var i = 0, l = els.length; i < l; i++) {
var el = els[i];
if (el.href === 'http://www.example.com/') {
el.innerHTML = "dead link";
el.href = "#";
}
}
但是,如果您希望匹配多个域名,或者例如,如果您希望同时匹配http:
和https:
,那么这就不那么灵活了。2016更新
自从这个问题发布以来已经有4年多了,事情进展得相当顺利
您不能使用:
var els = document.getElementsByTagName("a[href='http://domain.com']");
但是你能使用的是:
var els = document.querySelectorAll("a[href='http://domain.com']");
(注意:有关浏览器支持,请参见下文)
这将使您的问题中的代码与您期望的完全一致:
for (var i = 0, l = els.length; i < l; i++) {
var el = els[i];
el.innerHTML = el.innerHTML.replace(/link1/gi, 'dead link');
}
见:
浏览器支持
截至2016年6月的浏览器支持
看起来不错:
(有关最新信息,请参阅)
IE6和IE7中没有支持,但是
IE7很快就要上市了
IE8已经超过7年了,它部分地支持querySelectorAll——所谓“部分”,我的意思是你可以使用像[attr]
,[attr=“val”]
,[attr~=“val”]
,[attr |=“bar”
,幸运的是,其中的一小部分包括:
[attr^=val]
,[attr$=val]
和[attr*=val]
因此我上面的例子似乎对IE8没什么影响。
IE9、IE10和IE11所有支持查询选择所有无问题,Chrome、Firefox、Safari、Opera和所有其他主要浏览器-桌面和移动设备
换句话说,我们似乎可以安全地开始在生产中使用querySelectorAll
更多信息
有关详细信息,请参阅:
另请参见queryselectoral
、querySelector
、queryAll
和query
之间的区别,以及当它们从DOM规范中删除时,您希望支持哪些浏览器?您可以尝试看看它是否有区别,但此方法在IE7中不可用d.另一种可能是使用CSS3来更改外观和/或添加一些额外的文本。@FelixKling可以查询Selector将产生如此大的差异?OP的代码似乎已经非常简单。除非没有显示所有代码:)我只需编写一个函数来处理所有链接的onclick。然后您就可以一旦有人单击链接,如果需要,请进行更改。@Jack:我不知道querySelectorAll
在内部是如何工作的。但这就是为什么OP应该尝试并测试它的原因。@Jack代码是空的,但它使用的属性计算起来很昂贵。当我使用“.textContent | |.innerText”时,性能会更好“建造;速度肯定更快,但在大约1500圈之后,速度变慢了+1对于只在开始时检查一次长度的优化for循环,我从来没有想过像这样直接将其放入循环中<代码>el.href==='http://www.example.com/myfile.html“
在主要浏览器的Mac OS下工作,但由于某些原因,在任何主要浏览器的Ubuntu或Windows环境下都不会工作。我用el.href.indexOf(“myfile.html”)
解决了这个问题。干杯。@Sorry-Im-a-N00b是的,你真的是个N00b。如前所述,els.length
的评估只执行一次,而不是每次迭代。你的编辑是错误的,批准你编辑的人也应该知道得更清楚。@OwenMelbourne这可能是一种更有效的选择链接的方法,但使用.innerHTML
和替换仍然是替换链接的错误方法contents@Alnitak你会如何用不同的方式来替换“链接”这个词使用“死链接”而不使用替换?对于substring和splice?AFAICS,原始问题中的regexp/link1/
只是一个占位符,而不是OP希望替换的文字内容。@Alnitak我知道它是一个占位符,但如果它是任何其他regex,会有区别吗?我的目标基本上是显示只将getElementsByTagName
更改为querySelectorAll
将使其余代码按预期工作,而不进行任何更改。看我的。
var els = document.querySelectorAll("a[href='http://domain.com']");
for (var i = 0, l = els.length; i < l; i++) {
var el = els[i];
el.innerHTML = el.innerHTML.replace(/link1/gi, 'dead link');
}
var els = document.querySelectorAll("a[href^='http://domain.com']");
for (var i = 0, l = els.length; i < l; i++) {
var el = els[i];
el.innerHTML = el.innerHTML.replace(/link/gi, 'dead link');
}