我需要编写一个方法,它接受一个String并解析它的链接(一个href)。如果它找到了一个链接,它应该在链接中添加target =“_ blank”,如果它还没有。
实施例: 输入字符串“
<a href="www.google.com">Google</a> and <a href="www.yahoo.com"> target="_blank">Yahoo</a> are search engines
...应该导致输出String
<a href="www.google.com" target="_blank">Google</a> and <a href="www.yahoo.com" target="_blank">Yahoo</a> are search engines
知道如何实现这个目标吗?
答案 0 :(得分:10)
使用普通的js并不是很困难。
var links = document.getElementsByTagName('a');
var len = links.length;
for(var i=0; i<len; i++)
{
links[i].target = "_blank";
}
答案 1 :(得分:6)
充满问题,但可以使用纯JavaScript:
function addBlankTargets(s) {
return (""+s).replace(/<a\s+href=/gi, '<a target="_blank" href=');
}
或者使用jQuery:
function addBlankTargets(s) {
var p = $('<p>' + s + '</p>');
p.find('a').attr('target', '_blank');
return p.html();
}
var s = '<a href="www.google.com">Google</a> and '
+ '<a href="www.yahoo.com">Yahoo</a> '
+ 'are search engines.';
var x = addBlankTargets(s);
x; // => '<a href="www.google.com" target="_blank">Google</a> and
// <a href="www.yahoo.com" target="_blank">Yahoo</a>
// are search engines.'
答案 2 :(得分:1)
如果您的目标是现代浏览器,则可以将字符串转换为DOM,而不必处理包含HTML的字符串并必须处理所有许多特殊情况。 此时,操作DOM很简单,然后可以将其转换回序列化的字符串。
function decorateRichText(html) {
const domParser = new DOMParser()
const document = domParser.parseFromString(html, `text/html`)
const serializer = new XMLSerializer()
// Handles external links
const links = document.querySelectorAll(`a`)
links.forEach((link) => {
if (link.href) {
if (isExternalUrl(link.href)) {
link.target = `_blank`
link.rel = `noopener noreferrer`
}
}
})
return serializer.serializeToString(document)
}
让浏览器JS引擎完成繁重的工作并记住:您不编写的代码就是您无需调试的代码:-)
答案 3 :(得分:0)
你可以使用jQuery来解析元素,添加属性,然后读出HTML,如下所示:
var addTarget = function(input) {
return $('<span>' + input + '</span>').find('a').attr('target', '_blank').html();
};
console.log(addTarget('<a href="www.google.com">Google</a>'));
答案 4 :(得分:0)
分两行
var links = document.getElementsByTagName('a');
for(i in links)
links[i].target=="_blank"?links[i].style.color="#f0f" : links[i].style.color ='#0f0'