13

我正在尝试在新窗口中打开网站上的所有外部链接。然而,该站点有 2 个版本,例如商店和主站点。例如,在主站点上,我们可能有指向http://store.example.com的链接。

我这里有一些代码,可以让我在新窗口中打开所有外部链接。但是,我希望能够排除某些域。就像我上面提到的那个。

这是代码:

$(document).ready(function() {
   $("a[href^=http]").each(function(){
      if(this.href.indexOf(location.hostname) == -1) {
         $(this).attr({
            target: "_blank",
            title: "Opens in a new window"
         });
      }
   })
});

我是 JS / jQuery 的新手,所以任何额外的信息都会很棒。

4

9 回答 9

18

要以编程方式触发点击,您可以执行以下操作:

$(document).ready(function() {

   $("a[href^=http]").each(function(){

      // NEW - excluded domains list
      var excludes = [
         'excludeddomain1.com',
         'excludeddomain2.com',
         'excluded.subdomain.com'
      ];
      for(i=0; i<excludes.length; i++) {
         if(this.href.indexOf(excludes[i]) != -1) {
            return true; // continue each() with next link
         }
      }

      if(this.href.indexOf(location.hostname) == -1) {

           // attach a do-nothing event handler to ensure we can 'trigger' a click on this link
           $(this).click(function() { return true; }); 

           $(this).attr({
               target: "_blank",
               title: "Opens in a new window"
           });

           $(this).click(); // trigger it
      }
   })
});
于 2012-08-22T10:44:05.927 回答
4

如果您只想要所有与您的域名不匹配的链接:

var all_links = document.querySelectorAll('a');
for (var i = 0; i < all_links.length; i++){
       var a = all_links[i];
       if(a.hostname != location.hostname) {
               a.rel = 'noopener';
               a.target = '_blank';
       }
}
于 2019-05-13T19:23:01.830 回答
1

您是否能够编辑 HTML 以获得更好的点击事件挂钩?如果我需要分隔内部或外部之间的某些链接,我将在 HTML 元素上应用 rel 值。

    <a href="URL" rel="external">Link</a>

然后在你的 javascript

    $('a[rel="external"]').click( function(event) {
     event.stopPropagation();
     window.open( $(this).attr('href') );
     return false;
    });

编辑:看到你已经有很多链接,这个怎么样..

    var a = new RegExp('http:\/\/store.blah.com');

    $('a').each(function() {

      if(a.test(this.href)) {
        $(this).click(function(event) {
         event.preventDefault();
         event.stopPropagation();
         window.open(this.href, '_blank');
        });
      }

    });
于 2012-08-22T10:44:53.650 回答
0

我想我会这样做:

    $(document).ready(function() {
      $("a[href^=http]").each(function(){
         if(this.href.indexOf(location.hostname) == -1 && this.href.indexOf("store.domain.com") == -1 && this.href.indexOf("other.domain.rule") == -1) {
            $(this).attr({
               target: "_blank",
               title: "Opens in a new window"
           });
         }
       })
    });

它有点手动,但是,如果您不想处理拆分字符串和数组,这就是解决方案。我相信这会有所帮助。

编辑:除此之外,您还可以使用 techfoobar 的解决方案来触发链接点击。这将帮助您提高网站性能。

于 2012-08-22T10:46:47.073 回答
0

与 techfoobar 的回复一样,您可以构建一个应在同一窗口中打开的域列表。尽管使用正则表达式,但您可以以更健壮的方式完成此操作。如果您只是直接进行 indexOf() 检查,您将跳过具有匹配子域但不匹配域的链接,尽管如果您想匹配 href 字符串中的任何位置的名称,您可以省略“$”。

这个实现应该做你想做的事,并且对你需要的代码做最少的修改。

$(document).ready(function() {
    //populate this list with whatever domain names you want, the 
    //$ sign matches the end of the string, only top level domains are affected
    var whiteList = [/google.com\/$/, /stackoverflow.com\/$/];

   $("a[href^=http]").each(function(){
      if(this.href.indexOf(location.hostname) == -1) {

        //check if the href of the current link matches any of our patterns
        var href = this.href;
        if(whiteList.filter(function(x){return x.test(href)}).length == 0) {

         $(this).attr({
            target: "_blank",
            title: "Opens in a new window"
         });
        }
      }
   })
});

在此示例中,所有指向 google.com 和 stackoverflow.com 的链接也将在现有页面中打开。

于 2012-08-22T11:43:42.940 回答
0

如果您宁愿在 body 上使用事件处理程序而不是更改 dom,我推荐这样的东西......

  // open external links in a new tab
  $('body').on('click','a',function(){
    var $a = $(this);
    var href = $a.attr('href');
    if (href.indexOf('/') == 0) return;  // ignore relative links
    var target = $a.attr('target') || "";
    if (target.length > 0) return; // ignore links with a target attribute already
    window.open(href, '_blank');  // open external links in a new tab
    return false;
  });
于 2013-09-14T03:59:14.423 回答
0

这将为使用 PHP 的所有外部域解决问题

$(document).ready(function() {
   $("a[href^=http]").each(function(){

      // NEW - excluded domains list
      var excludes = [
         '<?php echo $_SERVER['HTTP_HOST']; ?>'
      ];
      for(i=0; i<excludes.length; i++) {
         if(this.href.indexOf(excludes[i]) != -1) {
            return true; // continue each() with next link
         }
      }

      if(this.href.indexOf(location.hostname) == -1) {

           // attach a do-nothing event handler to ensure we can 'trigger' a click on this link
           $(this).click(function() { return true; }); 

           $(this).attr({
               target: "_blank",
               title: "Opens in a new window"
           });

           $(this).click(); // trigger it
      }
   })
});
于 2014-04-04T14:20:37.520 回答
0

基于 Collin 在原始 JS 中的回答,这非常好,因为它不需要 Jquery(尽管有 OP 的问题)。我将对其进行修改,使其能够排除当前主机名以外的域:

    var all_links = document.querySelectorAll('a');
    var excludes = ['domain1.com','www.domain1.com','domain2.com'];
    for (var i = 0; i < all_links.length; i++){
        var a = all_links[i];
        var found = false; 
        for(j=0; j<excludes.length; j++) {
                if(a.href.includes(excludes[j])) {
                    found = true;
                    break;  
                }
        }    
        if (!found) {
            a.rel = 'noopener'; a.target = 'external';
        }
    }        
于 2019-07-31T05:21:21.747 回答
0

对不起线程死灵,谷歌把我带到了这里。我有一个类似的问题,并最终解决它是这样的:

document.body.addEventListener('click', function (e) {
  if (e.target.tagName !== 'A') return;
  if (e.target.hostname === location.hostname) return;
  if(['stackoverflow.com','someothersite.com'].indexOf(e.target.hostname) !== -1) return; 
  e.preventDefault();
  window.open(e.target.href);
  return false;
});
于 2021-08-05T11:00:00.757 回答