【问题标题】:jQuery to add _blank to external linkjQuery将_blank添加到外部链接
【发布时间】:2011-08-18 15:11:19
【问题描述】:

我正在制作一个脚本,它会自动将 target="_blank" 广告投放到所有外部链接。 问题是,该脚本还会使内部绝对链接在新选项卡中打开。 您可以在此测试链接上检查问题: http://www.fairfood.org/testtest/

$("a").filter(function () {
    return this.hostname && this.hostname !== location.hostname;
}).each(function () {
    $(this).attr({
        target: "_blank",
        title: "Visit " + this.href + " (click to open in a new window)"
    });
});

有人知道如何解决这个问题吗?

非常感谢任何帮助。

【问题讨论】:

  • 该页面确实存在一些 JS 错误,例如 TWTR is not definedFB is not defined。可能想先解决这些问题。
  • www.fairfood.org != fairfood.org
  • 我不相信你需要在这里检查hostname。另外,我相信这个对象在其他浏览器中的处理方式不同,因此只需使用带有您的域名的 not 选择器就可以了。
  • 感谢您指出pixelboy,我会检查这些错误。

标签: jquery


【解决方案1】:

www.yourhost.comyourhost.com 不同,因此当您的链接不匹配时,这将不起作用。

如果您知道 www. 总是会导致有效的 URI,则可以直接取出。

(另外,您对.each 的使用几乎是多余的,因为jQuery 已经了解元素集;但是,您需要它来处理this.href。只是需要注意的一点)

$("a").filter(function() {
    return this.hostname &&
           this.hostname.replace(/^www\./, '') !==
              location.hostname.replace(/^www\./, '');
}).each(function() {
   $(this).attr({
       target: "_blank",
       title: "Visit " + this.href + " (click to open in a new window)"
    });
});

Live example.

【讨论】:

  • +1 好的解决方案。 @Zoltan 如果有效,请不要忘记将其标记为答案。是的,我同意,这不是each 不必要的循环吗?
  • @pixelbobby:看我的小文本。 this.href 需要它。
【解决方案2】:

您可以使用单个 jQuery 选择器来执行此操作:

$('a').not('a[href*="fairfood.org/"]').each(function(){
    $(this).attr({target: "_blank", title: "Visit " + 
            $(this).href + " (click to open in a new window)"});
});

【讨论】:

  • 谢谢。添加了.org。并为您的评论 +1,因为我读到它时笑了。
  • <a href="http://wow.com/thats-a-very-rare-situation-and-you-have-a-better-chance-of-getting-attacked-by-zombies-which-is-pretty-cool-not-going-to-lie-but-ok-fairfood.org.com.de.us.html" target="_blank">occams razor</a>
  • 另外,this.href 将不起作用,因为您将 .each 的功能范围拿走了。
【解决方案3】:

fairfood.org 和 www.fairfood.org 在技术上是不同的主机名。如果您希望两者都在您的脚本中工作,请在测试之前去掉 www。

【讨论】:

    【解决方案4】:

    如上所述,www.fairfood.orgfairfood.org 不是同一主机。 不要将 WWW 和非 WWW 主机视为一体。 而是选择是否使用www;然后在整个网站上坚持下去

    (这有一个额外的好处是可以避免潜在的duplicate content penalties。)

    【讨论】:

    • <a href="http://lolsomewhereelsethatsnotfairfood.org/hahah.html">Go here!!!1</a>
    • @Tomalak Geret'kal 我坚持纠正并删除了狡猾的解决方案:)
    • 据我所知,您提供的链接中的网站解释说,在这种情况下,不会适用重复内容处罚。
    • @Tomalak Geret'kal 我承认我刚刚获取了我偶然发现的第一个链接。我可能是 Google 不惩罚的情况(是的,我知道 Google ~= 互联网搜索),所以这可能不是最好的资源 :) 但是,混合 www 和非 www可能会导致 cookie / 基于 cookie 的会话出现问题(与 DCP 无关)。
    • @jensgram:是的,它可以。我提倡编写您的网站,这样没关系,将主机名配置留给您的网络服务器,并使其完全从您的网站代码中抽象出来。不过,这在很大程度上是个人选择的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2012-08-16
    • 2013-03-29
    • 2018-02-27
    • 2013-06-08
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多