Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript getElement by href?_Javascript_Href_Getelementsbytagname - Fatal编程技术网

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月的浏览器支持 看起来不错:

(有关最新信息,请参阅)

IE6IE7中没有支持,但是 IE7很快就要上市了

IE8已经超过7年了,它部分地支持querySelectorAll——所谓“部分”,我的意思是你可以使用像
[attr]
[attr=“val”]
[attr~=“val”]
[attr |=“bar”
,幸运的是,其中的一小部分包括:
[attr^=val]
[attr$=val]
[attr*=val]
因此我上面的例子似乎对IE8没什么影响。

IE9IE10IE11所有支持查询选择所有无问题,ChromeFirefoxSafariOpera所有其他主要浏览器-桌面和移动设备

换句话说,我们似乎可以安全地开始在生产中使用
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');
}