【问题标题】:How to modify this Javascript to open links in a different window?如何修改此 Javascript 以在不同窗口中打开链接?
【发布时间】:2012-03-14 17:55:08
【问题描述】:

我发现 here 的这个 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);
    });
};

首先,这是如何工作的?我对正则表达式略知一二,可以制作简单的表达式,但在这里我什至没有看到“href”这个词!

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

【问题讨论】:

  • 我不知道帖子的第一部分,但要在新窗口中打开链接,您可以使用以下代码:window.open(url, '', 'width=1024,height= 768,可调整大小=是,滚动条=是');你只需要去了解所有其他参数,其中有很多。
  • @jacqijvv:不,如果你仔细阅读,你会发现这都是生成标记过程的一部分——"...它将用标签包围它们,以便它们变得可点击”。当点击链接时,实际上打开链接将在稍后发生。因此,OP 对 target 属性的评论以及他/她对他们在任何地方都看不到 href 感到惊讶......

标签: javascript html regex parsing hyperlink


【解决方案1】:

首先,这是如何工作的?

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

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

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

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

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

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

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

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

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

【讨论】:

  • 你在哪里找到 String.prototype.link?我没有在那个页面上找到它。
  • 其实String.prototype.link函数已经存在了。就像String.prototype.blinkString.prototype.bold
  • @javascriptninja:我最初的假设是错误的;我忘记了非标准的 1995 年字符串扩展名(linkstrong 等)。已更新。
  • 它看起来像是一个原生函数。试试:"Example".link('example.com');
  • @david:你一定是在看一个陈旧的页面。在上面的忍者评论之后,我的脑海里响起了一个铃声,说“什么,你不记得1995年?” ;-)
【解决方案2】:

“href”来自url.link(url);这一行

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

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

就像 String.prototype.blink。傻。

【讨论】:

    【解决方案3】:

    根据: http://www.w3schools.com/jsref/jsref_link.asp String.link() 方法返回一个文本“blah”作为 HTML 链接

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

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

    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() 会将当前匹配的部分作为参数提供给那个未命名的参数函数。甜蜜的机制,假设这适用于任何浏览器;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2020-12-01
      相关资源
      最近更新 更多