【问题标题】:Open all links not part of my website in new window with jquery使用 jquery 在新窗口中打开不属于我的网站的所有链接
【发布时间】:2012-01-16 08:54:18
【问题描述】:

我不确定我必须在 '???' 中添加什么让它检查该网站是否是我的地址。这是否也适用于 google adsense 广告(只是想知道,但并不重要)?

我正在考虑使用像“不”这样的逻辑运算符。所以它会检查是否不是我的网站?那么 ???会是我的网站吗?

$j(!a[href=???]).click(function(){
                window.open(this.href, "target=_blank");
                return false;
            });

【问题讨论】:

  • 您意识到,如果启用了弹出窗口阻止程序,您会破坏所有链接?直接在 HTML 源代码中执行此操作要好得多,target="_blank" 将在不触发弹出窗口阻止程序的情况下工作。
  • @Pekka 所以我看到将 .click() 与 window.open 一起使用会破坏链接,但下面使用 .attr() 并添加您提到的 html 代码的方法不应该打破它,对吗?
  • 下面添加target="_blank"的方法应该不会破坏它,你是对的。

标签: javascript jquery adsense logical-operators


【解决方案1】:

试试这个:

$j('a')
    .not('[name^="http://your.domain.com/"]')
    .attr('target', '_blank');

更新

我之前的修复仅在所有 URL 都是绝对 URL 时才有效,这是一个错误的假设。试试这个:

$j('a[name^="http:"], a[name^="https:"]')
    .not('[name^="http://your.domain.com/"]')
    .attr('target', '_blank');

这个新版本会跳过所有相对 URL。如果您的所有站内 URL 都是相对的(即不以 https?: 开头),您可以跳过对 .not 的调用。

【讨论】:

  • 我试过这个,它有点工作,因为我的网站页面在新窗口中打开,这是我试图避免的。我也不知道为什么它不起作用。
  • 我用 :not vs .not() 试过了,它仍然把我页面上的每个链接都变成了 target=_blank 链接。
  • @Nils R - 如果您仍然遇到问题,我提供了一个演示版本,该版本在网络浏览器上的密集度较低且更灵活
  • 对不起,@NilsR。我的答案有缺陷,但我现在已经更新了。
  • @Bups: ^= 表示“开始于”。
【解决方案2】:

运行像$( 'a' ) 这样的任何东西都会循环遍历每个A 元素——你只能在实际点击时担心它。此外,您可以只使用相对 url 作为您的网站,而绝对 url 是其他人的。

$( document ).on( 'click', 'a', function( event ){
  var $a = $( this );
  // test for anything like `http://` or '//whatever' or 'ftp://'
  if ( /^\w+?\:?\/\//.test( $a.attr( 'href' ) ) ){
    // since this runs before the event is propagated,
    // adding it now will still work
    $a.prop( 'target', '_blank' );
  }
});

演示:http://jsfiddle.net/danheberden/3bnk9/

或者你可以使用window.open:

$( document ).on( 'click', 'a', function( event ){
  var href = $( this ).attr( 'href' );
  // test for anything like `http://` or '//whatever' or 'ftp://'
  if ( /^\w+?\:?\/\//.test( href ) ){
    // dont follow the link here
    event.preventDefault();

    //  open the page
    window.open( href, '_blank' );
  }
});

演示:http://jsfiddle.net/danheberden/NcKdh/

【讨论】:

  • 这实际上似乎是一个很好的方法,我能看到的唯一问题是,如果有人出于某种原因关闭了 JS,那么我的所有链接都被破坏了,因为我必须遵循一个新的 url锚链接的模式才能正常工作。
  • 嗯?如果 JS 被禁用,那么整个方法就会被破坏,这就是为什么你应该将 target="blank" 添加到你的 HTML 而不是你的问题要求的方式:)
  • 谢谢,但我添加这个 JS 的原因是因为有一个特定页面我需要所有 url 去一个新窗口(每个请求)并且几乎整个页面都是动态的,但是我会尽可能使用 target="_blank"。
【解决方案3】:

你可以设置一个类来做:

// Outbound Links
var outLinks = function() { $('a[@class*=out]').click( function(){ this.target = '_blank'; } ); }
$(document).ready(outLinks);

然后您需要做的就是将“out”类添加到任何链接,它将打开一个新窗口。

或任何以 http:// 开头的链接

$('a[href^="http://"]').prop("target", "_blank");

【讨论】:

    【解决方案4】:

    怎么样:

    $j('a').live('click', function(){
      if(this.href.indexOf('yourwebsite.com') == -1) {
        window.open(this.href, "target=_blank");
        return false;
      }
    });
    

    这也可以通过正则表达式来改进,这样它就不会捕获像 http://someothersite.com/yourwebsite.com/ 这样的 URL,但这是一个边缘情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      相关资源
      最近更新 更多