代码之家  ›  专栏  ›  技术社区  ›  Kon

打开新浏览器窗口的最佳方法是什么?

  •  36
  • Kon  · 技术社区  · 17 年前

    我知道大多数链接应该留给最终用户来决定如何打开,但我们不能否认,有时您几乎“必须”强行进入一个新窗口(例如以当前页面上的形式维护数据)。

    我想知道的是,对于在新的浏览器窗口中打开链接的“最佳”方式,共识是什么。

    我知道 <a href="url" target="_blank"> 出去了。我也知道 <a href="#" onclick="window.open(url);"> 因为各种原因不理想。我也试着用类似的东西完全取代锚 <span onclick="window.open(url);"> 然后设置跨度样式,使其看起来像一个链接。

    我倾向于的一个解决办法是 <a href="url" rel="external"> 并使用javascript在标记为“external”的锚上将所有目标设置为“blank”。

    还有其他想法吗?什么更好?我正在寻找最符合XHTML和最简单的方法来实现这一点。

    更新:我说target=“\u blank”是否定的,因为我已经读过了 several places 目标属性将逐步退出XHTML。

    10 回复  |  直到 10 年前
        1
  •  37
  •   Damir Zekić    15 年前

    我用的是你最后提出的方法。我添加rel=“external”或类似的东西,然后使用jquery迭代所有链接,并为它们分配一个单击处理程序:

    $(document).ready(function() {
      $('a[rel*=external]').click(function(){
        window.open($(this).attr('href'));
        return false; 
      });
    });
    

    我认为这是最好的方法,因为:

    • 从语义上讲很清楚:您有一个到外部资源的链接
    • 它符合标准
    • 它会优雅地退化(您与常规 href 属性)
    • 如果用户愿意,它仍然允许用户中键单击链接并在新选项卡中打开它。
        2
  •  13
  •   Igbanam    10 年前

    为什么是 target="_blank" 一个坏主意?

    它应该做你想做的。

    编辑:(见注释)要点,但我确实认为使用javascript来完成这样的任务会让一些人非常不安(那些习惯用鼠标中键点击打开一个新窗口的人,以及那些使用noscript扩展名的人)

        3
  •  11
  •   Mnementh    16 年前

    拜托, 不要强迫 在新窗口中打开链接。

    反对理由:

    • 它违反了最不吃惊的规则。
    • 后退按钮不起作用,用户不可能知道原因。
    • 选项卡式浏览器中会发生什么?新标签还是新窗口?不管发生什么,如果你把标签和窗口混在一起,你想要的是什么?

    我总是听到有利于打开一个新窗口的原因是用户不会离开网站。但是,我绝对不会回到让我恼火的网站。如果这个网站失去了我的控制,那就是一个大麻烦。

    一种方法可能是,你提供两个链接,一个是正常的,另一个在新窗口中打开它。在普通链接后添加第二个小符号。这样,您站点的用户就可以控制他们要单击的链接。

        4
  •  5
  •   alex    13 年前

    这是我为jquery编写的插件

     (function($){  
      $.fn.newWindow = function(options) {       
        var defaults = {
            titleText: 'Link opens in a new window'     
        };
    
         options = $.extend(defaults, options);
    
         return this.each(function() {  
           var obj = $(this);
    
           if (options.titleText) {        
               if (obj.attr('title')) {
                         var newTitle = obj.attr('title') + ' (' 
                                                    + options.titleText + ')';
               } else {
                        var newTitle = options.titleText;
               };              
               obj.attr('title', newTitle);            
           };          
    
           obj.click(function(event) {
              event.preventDefault();  
              var newBlankWindow = window.open(obj.attr('href'), '_blank');
              newBlankWindow.focus();
            });     
           });    
      };  
     })(jQuery); 
    

    示例用法

    $('a[rel=external]').newWindow();
    

    您还可以通过传递一些选项来更改或删除标题文本。

    更改标题文本的示例:

    $('a[rel=external]').newWindow( { titleText: 'This is a new window link!' } );
    

    一起删除的示例

    $('a[rel=external]').newWindow( { titleText: '' } );
    
        5
  •  2
  •   BoboTheCodeMonkey    17 年前

    也许我误解了一些事情,但你为什么不想用target=“\blank”?我就是这样做的。如果您正在寻找最兼容的,那么任何类型的javascript都会被淘汰,因为您不能确定客户端是否启用了JS。

        6
  •  2
  •   Community CDub    8 年前
    <a href="http://some.website.com/" onclick="return !window.open( this.href );">link text</a>
    

    详细信息请参见 answer to another question .

        7
  •  1
  •   Mark S. Rasmussen    17 年前
    <a href="http://www.google.com" onclick="window.open(this.href); return false">
    

    如果用户禁用了JS,这仍然会打开链接(尽管在同一窗口中)。否则,它的工作方式与target=blank完全相同,而且使用起来很容易,因为您只需将onclick函数(可能通过使用jquery)附加到所有普通的标记上即可。

        8
  •  0
  •   roenving    17 年前

    如果您使用任何严格的doctype风格或即将到来的真正的xhtml风格,则不允许使用target…

    使用transitional,无论是html4.01还是xhtml,您都可以使用damirs解决方案,尽管它无法实现window.open()中所必需的windowname属性:

    在普通HTML中:

    <a href="..." target="_blank" onclick="window.open(this.href, 'newWin'); return false;">link</a>
    

    但是,如果您使用一个严格的doctypes,那么打开链接的唯一方法就是使用不带target属性的解决方案…

    --顺便说一句,非JS浏览器的数量经常计算错误,查找计数器的数字表示非常不同的数字,我想知道这些非JS浏览器中有多少是爬虫类的等等!-)

        9
  •  0
  •   Shadow2531    17 年前

    如果我在表单页面上单击moreinfo.html链接(例如)会导致数据丢失,除非我在新的选项卡/窗口中打开它,请告诉我。

    你可以骗我用window.open()或target=“_blank”打开一个新的选项卡/窗口,但我可能禁用了目标和弹出窗口。如果您需要JS、Targets和弹出窗口来欺骗我打开一个新窗口/选项卡,请在我开始使用表单之前告诉我。

    或者,将到另一个页面的链接设为表单请求,以便访问者提交时保存当前表单数据,以便在可能的情况下从上一次继续。

        10
  •  0
  •   Mac    15 年前

    我用这个…

    $(function() {
      $("a:not([href^='"+window.location.hostname+"'])").click(function(){
        window.open(this.href);
        return false;
      }).attr("title", "Opens in a new window");
    });