我的目标是循环访问一组给定的元素,并用链接正则表达式替换内部 HTML,以便我可以将 HTML 文本转换为http://*.*/*
形式的 <a href="http://*.*/*" target="_blank">http://*.*/*</a>
所以我正在运行一些香草javascript:
for (var i = 0; i < document.getElementsByClassName('title').length; i++) {
var title = document.getElementsByClassName('title')[i]
title.innerHTML = title.innerHTML.replace(/(b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/ig,"<a target='_blank' href='$1'>$1</a>")
}
这只是我正在使用的正则表达式:
/(b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/ig
那么,为什么这个循环会导致浏览器挂起呢?循环在文本上不超过 256 个字符,通常有 5 到 30 个.title
元素,绝对不是会导致浏览器崩溃/挂起的数据级别。我只在Chrome/Safari中体验过它,不确定它是否发生在Firefox/Opera中。
尝试存储结果。
var titles = document.querySelectorAll(".title");
// querySelectorAll is supported in slightly more browsers than getElementsByClassName
var l = titles.length, i, title;
for( i=0; i<l; i++) {
title = titles[i];
title.innerHTML = title.innerHTML.replace(/..../,'....');
}
如果挂起继续,可能是因为正则表达式与您已经替换的内容匹配。尝试添加否定的前瞻性,以确保匹配的 URL 后面没有单引号。 (?=!')