[英]Javascript - How to add links to words in a page without interfering with the HTML in the page
我正在制作一个搜索特定单词的工具,当它找到它们时,将它们包装在<span>
标记中并向它们添加链接。 我以为一开始这很简单,但是很快就意识到它并不是那么简单,因为它有很多不同的方式可以弄乱页面中的HTML元素。
注意:在此示例中,它正在寻找类似rs25283
代码,但是此脚本还需要寻找将在数组中提供的预定义单词。
我从一个非常简单的东西开始:
var pattern = new RegExp("(rs[0-9]+)","ig");
output = $('body').html().replace(pattern, function replacer(contents,word) {
return '<span>' + word + ' <a href="https://mylink.com/item/'+ word +'"></a> </span>';
});
当然哪个失败了,因为它替换了HTML元素和属性中的单词并创建了一个完整的混乱。 像这样在模式中添加空格:
var pattern = new RegExp("([ ]rs[0-9]+[ ])","ig");
将减少错放的次数,但仍然无法正常工作,因为例如,可能会有这样的HTML <img src="whatever.jpg" alt="Some info about rs25162 in here.">
因此脚本将破坏该img标签。
因此,我尝试了一种更加进化的方法,将整个页面分成如下部分:
var words = $('body').html().split(' ');
然后遍历每个部分,看看是否可以找到匹配项。 为了找到匹配项,我将要查找的单词有一个关联数组,因此当遍历页面上的每个单词时,我会检查它是否存在于数组中。
像这样:
var search_words = [
'rs14235',
'rs6262',
'COMT',
'ACE'
];
for (i=0;i<words.length;i++) {
if (search_words.indexOf(word[i]) > -1) { // do something }
}
现在问题仍然存在,它将破坏标签,但是现在我可以做的是检查何时使用“”打开属性,因此我将知道单词是否在HTML标签属性内。标签本身有点棘手。例如,如果出现<h1>Title with word in it</h1>
,则我不想替换该单词。我无法过滤掉HTML标记中出现的任何内容,因为需要替换的单词可能位于<p>
, <div>
, <span>
和其他标签内。
因此,这里最好的解决方案是创建一个列入黑名单的HTML标签列表吗? 我假设成千上万的程序员已经面对了这种确切的情况,所以我不想在这里重新发明轮子,如果有人可以向我展示实现此目标的最佳方法,将不胜感激。
编辑:我发现这篇文章描述了此问题: http : //james.padolsey.com/javascript/replacing-text-in-the-dom-its-not-that-simple/
例如,您可以尝试使用.not()选择器
$pattern = new RegExp("(rs[0-9]+)","ig");
$blacklist= $("Choose any tag class or id, p,div,a,span,nav,ul,li").not($pattern );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.