如何修改此Javascript以在不同的窗口中打开链接

How to modify this Javascript to open links in a different window?

本文关键字:窗口 链接 何修改 修改 Javascript      更新时间:2023-09-26

我在这里找到的这个Javascript向字符串对象添加了一个方法parseURL(),这样,如果里面有任何链接,它就会用标签包围它们,这样它们就可以点击了。

String.prototype.parseURL = function() {
    return this.replace(/[A-Za-z]+:'/'/[A-Za-z0-9-_]+'.[A-Za-z0-9-_:%&~'?'/.=]+/g, function(url) {
        return url.link(url);
    });
};

首先,这是怎么回事?我对regex表达式略知一二,可以制作简单的表达式,但我在这里甚至看不到"href"这个词!

如何修改它,以便在另一个窗口中打开链接?即如何在此处添加target="_blank"属性?

首先,这是怎么回事?

显然,在代码的其他地方,你会发现:

String.prototype.link = function(url) { /* ... */ };

其将以返回字符串结束。replace所做的是调用传递给它的匿名函数,并将与正则表达式匹配的字符串作为参数;replace期望该函数返回适当的替换,然后将其插入字符串中。(第二种形式的replace接受函数而不是字符串作为第二个参数,它非常有用,但并不像您预期的那样广为人知。)匿名函数对参数(url)调用link函数,这是一个字符串,并返回结果。因此,我相信您会在代码中的某个位置发现一个link函数被添加到String.prototype

至少有些浏览器向String实例添加了一堆非标准方法,这些方法将字符串包装在标签中;link就是其中之一。它只是使用给定的URL返回a元素的标记。

如何修改它,以便在另一个窗口中打开链接?

实际上,第一个问题的答案回答了第二个问题:假设您会在link函数中找到标记;你可以在那里更新它

只需将非标准link函数的使用替换为您自己的字符串串联:

return '<a href="' + url + '">' + url + '</a>';

通常我会说,您应该确保对HTML实体进行编码,但由于已经在处理HTML源字符串,因此它们应该已经被正确编码。

'href'来自url.link(url);

String.prototype.link是一个愚蠢的函数,包含它是为了向后兼容像这样愚蠢的代码。这很傻,你应该停止使用它。

如果你想看看它在做什么,只需alert('something'.link('anotherthing'));

这就像String.prototype.blink。愚蠢。

根据:http://www.w3schools.com/jsref/jsref_link.aspString()方法返回一个文本"blah"作为HTML链接

<a  href='blah'>blah</a>".

所以我猜你有两个解决方案:

1/覆盖link()定义(不推荐),声明如下:

String.prototype.link = function(url) {
    return "<a target='_blank' href='"+url+"'>"+url+"</a>";
}

2/定义另一个函数,并在parseURL()的定义中使用它而不是link():

String.prototype.blankLink = function(url) {
    return "<a target='_blank' href='"+url+"'>"+url+"</a>";
}

然后你的代码应该变成:

String.prototype.parseURL = function() {
return this.replace(/[A-Za-z]+:'/'/[A-Za-z0-9-_]+'.[A-Za-z0-9-_:%&~'?'/.=]+/g, function(url) {
        return url.blankLink(url);
    });
};

为了解释一点,replace()返回输入字符串,其中与正则表达式匹配的部分(在本例中表示任何URL的形状)被第二个参数(返回URL.link()的未命名函数)替换。JS引用没有说的是,如果你给一个函数而不是字符串作为replace(,那么replace()将提供当前匹配的部分作为该未命名参数函数的参数。甜蜜的机制,假设这在任何浏览器上都有效;)