【问题标题】:Can I create links with 'target="_blank"' in Markdown?我可以在 Markdown 中创建带有 'target="_blank"' 的链接吗?
【发布时间】:2011-05-24 10:28:38
【问题描述】:

有没有办法在 Markdown 中创建一个在新窗口中打开的链接?如果不是,您建议使用什么语法来执行此操作?我会将它添加到我使用的 markdown 编译器中。我认为这应该是一种选择。

【问题讨论】:

  • 所以正如答案中所指出的,它不是markdown的功能。如果您想将此设置为整个站点的默认链接,David Morrow 有answer。或者,如果您只想在一个实例中执行此操作,那么 Matchu 的 answer 说您实际上必须用 HTML 编写。
  • 您的问题不是关于您在做什么,但是一些降价引擎或浏览器(不确定是哪个)识别您创建的链接何时指向不同的域并打开那些在新标签中。对我来说,有时从 https: 中删除 s 就足以获得我想要的功能。

标签: html hyperlink markdown target new-window


【解决方案1】:

就 Markdown 语法而言,如果您想获得详细信息,您只需要使用 HTML。

<a href="http://example.com/" target="_blank">Hello, world!</a>

我见过的大多数 Markdown 引擎都允许使用普通的旧 HTML,仅适用于通用文本标记系统无法解决的这种情况。 (例如 StackOverflow 引擎。)然后,无论如何,他们都会通过 HTML 白名单过滤器运行整个输出,因为即使是仅 Markdown 的文档也很容易包含 XSS 攻击。因此,如果您或您的用户想要创建 _blank 链接,那么他们可能仍然可以。

如果这是您将经常使用的功能,那么创建自己的语法可能是有意义的,但它通常不是重要功能。如果我想在新窗口中启动该链接,我会自己按住 ctrl 单击它,谢谢。

【讨论】:

  • 你知道吗?我同意你和alex。我决定根本不使用_blank。将内容保存在一个浏览器中是一种更好的用户体验。他们可以像你说的那样回击或点击命令(这里是 Mac 用户 :))。
  • 我在页面上运行了 _blank 到我域外的所有链接的 javascript。就像@alex 在下一个答案中一样
  • 我建议(为了明确和内联可读)以下语法:[Visit this page](http::/link.com( 来了解打开的想法。
  • 简单的 target="_blank" 可能很危险!还将 rel="noopener" 添加到标签中! (sites.google.com/site/bughunteruniversity/nonvuln/…)
  • 将内容保存在一个浏览器中并不总是更好的用户体验...如果他们在您的 SPA 中的注册或结帐流程中,并且在最后一步他们需要同意外部页面中的某些条件?除非您使用模式,否则在新窗口中打开确实比用户完全失去上下文并不得不再次经历整个过程更可取。
【解决方案2】:

Kramdown 支持。它与标准 Markdown 语法兼容,但也有许多扩展。你可以这样使用它:

[link](url){:target="_blank"}

【讨论】:

  • 这似乎不适用于 Mac 上的 Markdown 引擎 :-(
  • 与 jekyll 配合得很好!
  • kramdown 语法:[link name](url_link){:target="_blank"} 可以使用 kramdown 在线编辑器解析成 HTML:http://trykramdown.herokuapp.com/ 我使用它是因为我已经有了相当多的 kramdown 引用,并希望避免重新输入它们。
  • jekyll 中有没有办法将其设置为默认值?我希望我的博客文章中的所有链接都以target="_blank" 打开
  • 它不起作用。它只是将 {:target="_blank"} 呈现为文本。
【解决方案3】:

我认为没有降价功能。

如果您想使用 JavaScript 打开指向您自己网站之外的链接,可能还有其他可用选项。

var links = document.links;

for (var i = 0, linksLength = links.length; i < linksLength; i++) {
   if (links[i].hostname != window.location.hostname) {
       links[i].target = '_blank';
   } 
}

jsFiddle.

如果您使用的是 jQuery,它会更简单...

$(document.links).filter(function() {
    return this.hostname != window.location.hostname;
}).attr('target', '_blank');

jsFiddle.

【讨论】:

  • 我同意你的观点,但如果你在 iframe 中,你需要用链接从框架中弹出。
  • 我发现我强迫人们进入新窗口的唯一一次是当我完成一个链接到外部某处的句子的一半时,我想在不中断流程的情况下为我的 cmets 提供资源。这个 js sn-p 是 ideal 的目的 - 谢谢,upvoted :)
  • 我认为 Jakob Nielson 的那句话在这里不再适用。他抱怨打开新窗口,但现在 target="_blank" 在新选项卡中打开。当指向其他域的链接不在新标签页中打开时,我个人不喜欢它。
  • 另外:因为说Jakob Nielsen says you shouldn't do that 是一个可怕的论点。
  • 我要在这里补充一点,这也是一种更可取的全局解决方案。它让你的 Markdown 保持干净,这就是 Markdown 的重点。
【解决方案4】:

使用 Markdown v2.5.2,您可以使用:

[link](URL){:target="_blank"}

【讨论】:

  • 我试过了,但它对我不起作用。与 django 1.6 一起使用
  • 适用于 Jekyll v2.4.0(可能也适用于早期版本)
  • 这是 kramdown(因为 Jekyll 使用 kramdown,所以它适用于 Jekyll)。
  • 似乎无法在 GitLab 中使用此语法。我不确定当前使用的是哪个版本的 Markdown。
  • 有没有办法将它设为默认值,这样我就不必为每个链接都指定它了?
【解决方案5】:

因此,不能将链接属性添加到 Markdown URL 是不完全正确的。要添加属性,请检查正在使用的底层 Markdown 解析器及其扩展名。

特别是,pandoc 具有启用 link_attributes 的扩展,它允许在链接中进行标记。例如

[Hello, world!](http://example.com/){target="_blank"}
  • 对于来自 R 的那些(例如,使用 rmarkdown、bookdown、blogdown 等),这是您想要的语法。
  • 对于那些不使用 R 的用户,您可能需要在对 pandoc 的调用中使用 enable the extension 和 +link_attributes

注意:这与 kramdown 解析器的支持不同,后者是上面公认的答案之一。特别要注意 kramdown 与 pandoc 不同,因为它需要冒号 -- : -- 在花括号的开头 -- {},例如

[link](http://example.com){:hreflang="de"}

特别是:

# Pandoc
{ attribute1="value1" attribute2="value2"}

# Kramdown
{: attribute1="value1" attribute2="value2"}
 ^
 ^ Colon

【讨论】:

  • 这在我们的自定义降价环境中对我有用。谢谢!
【解决方案6】:

一个全球性的解决方案是把&lt;base target="_blank"&gt; 进入您页面的 &lt;head&gt; 元素。这有效地为每个锚元素添加了默认目标。我使用 Markdown 在基于 Wordpress 的网站上创建内容,我的主题定制器将让我将该代码注入每个页面的顶部。如果您的主题不这样做,有一个plug-in

【讨论】:

    【解决方案7】:

    我正在使用 Grav CMS,效果很好:

    正文/内容:
    Some text[1]

    正文/参考:
    [1]: http://somelink.com/?target=_blank

    只要确保先传递目标属性,如果链接中还有其他属性,请将它们复制/粘贴到引用 URL 的末尾。

    也可以作为直接链接:
    [Go to this page](http://somelink.com/?target=_blank)

    【讨论】:

    【解决方案8】:

    您可以通过本机 javascript 代码执行此操作,如下所示:

     
    var pattern = /a href=/g;
    var sanitizedMarkDownText = rawMarkDownText.replace(pattern,"a target='_blank' href=");
    

    JSFiddle Code

    【讨论】:

      【解决方案9】:

      在我的项目中,我正在这样做并且效果很好:

      [Link](https://example.org/ "title" target="_blank")
      

      Link

      但并非所有解析器都允许您这样做。

      【讨论】:

      • 几乎可以工作,但即使您的示例也使用编码到标题 attr 的 url 呈现,而不是作为新的 attrs(查看源代码或将节点编辑为 html):&lt;a href="https://example.org/" rel="nofollow" title="title&amp;quot; target=&amp;quot;_blank"&gt;Link&lt;/a&gt;
      【解决方案10】:

      对于幽灵降价使用:

      [Google](https://google.com" target="_blank)
      

      在这里找到它: https://cmatskas.com/open-external-links-in-a-new-window-ghost/

      【讨论】:

      • 我喜欢你的解决方案。由于我已经尝试过使用不同的配置,它似乎只适用于内联链接。也许有一种方法可以与 reference links 链接。类似:[open new window][1] \n [1]: (https://abc.xyz" target="_blank)。也许我弄错了什么,或者这不适合那样工作?
      【解决方案11】:

      没有简单的方法可以做到这一点,就像@alex 指出的那样,您需要使用 JavaScript。他的回答是最好的解决方案,但为了优化它,您可能只想过滤到帖子内容链接。

      <script>
          var links = document.querySelectorAll( '.post-content a' );  
          for (var i = 0, length = links.length; i < length; i++) {  
              if (links[i].hostname != window.location.hostname) {
                  links[i].target = '_blank';
              }
          }
      </script>
      

      该代码与 IE8+ 兼容,您可以将其添加到页面底部。请注意,您需要将“.post-content a”更改为您用于发布帖子的类。

      如此处所示:http://blog.hubii.com/target-_blank-for-links-on-ghost/

      【讨论】:

        【解决方案12】:

        不是一个直接的答案,但可能会帮助一些最终来到这里的人。

        如果您使用的是GatsbyJS,则有一个插件可以自动将target="_blank" 添加到您的markdown 中的外部链接。

        它被称为gatsby-remark-external-links,用法如下:

        yarn add gatsby-remark-external-links

        plugins: [      
          {
            resolve: `gatsby-transformer-remark`,
            options: {
              plugins: [{
                resolve: "gatsby-remark-external-links",
                options: {
                  target: "_blank",
                  rel: "noopener noreferrer"
                }
              }]
            }
          },
        

        它还负责处理rel="noopener noreferrer"。

        如果您需要更多选项,请参考文档。

        【讨论】:

          【解决方案13】:

          我在尝试使用 PHP 实现 markdown 时遇到了这个问题。

          由于使用 markdown 创建的用户生成链接需要在新选项卡中打开,但站点链接需要保留在选项卡中,因此我将 markdown 更改为仅生成在新选项卡中打开的链接。所以不是页面上的所有链接都会链接出去,只是那些使用markdown的链接。

          在 Markdown 中,我将所有链接输出更改为 &lt;a target='_blank' href="..."&gt;,这很容易使用查找/替换。

          【讨论】:

            【解决方案14】:

            我不同意留在一个浏览器选项卡中会带来更好的用户体验。如果您希望人们留在您的网站上,或者回来阅读该文章,请将他们发送到新标签中。

            以@davidmorrow 的回答为基础,将此 javascript 放入您的网站,然后将外部链接转换为 target=_blank 的链接:

                <script type="text/javascript" charset="utf-8">
                  // Creating custom :external selector
                  $.expr[':'].external = function(obj){
                      return !obj.href.match(/^mailto\:/)
                              && (obj.hostname != location.hostname);
                  };
            
                  $(function(){
                    // Add 'external' CSS class to all external links
                    $('a:external').addClass('external');
            
                    // turn target into target=_blank for elements w external class
                    $(".external").attr('target','_blank');
            
                  })
            
                </script>
            

            【讨论】:

              【解决方案15】:

              您可以使用 {[attr]="[prop]"}

              添加任何属性

              例如 [Google] (http://www.google.com){target="_blank"}

              【讨论】:

                【解决方案16】:

                对于已完成的亚历克斯回答(2010 年 12 月 13 日)

                使用此代码可以实现更智能的注入目标:

                /*
                 * For all links in the current page...
                 */
                $(document.links).filter(function() {
                    /*
                     * ...keep them without `target` already setted...
                     */
                    return !this.target;
                }).filter(function() {
                    /*
                     * ...and keep them are not on current domain...
                     */
                    return this.hostname !== window.location.hostname ||
                        /*
                         * ...or are not a web file (.pdf, .jpg, .png, .js, .mp4, etc.).
                         */
                        /\.(?!html?|php3?|aspx?)([a-z]{0,3}|[a-zt]{0,4})$/.test(this.pathname);
                /*
                 * For all link kept, add the `target="_blank"` attribute. 
                 */
                }).attr('target', '_blank');
                

                您可以通过在(?!html?|php3?|aspx?) 组构造中添加更多扩展来更改正则表达式异常(在此处了解此正则表达式:https://regex101.com/r/sE6gT9/3)。

                对于没有 jQuery 的版本,请检查以下代码:

                var links = document.links;
                for (var i = 0; i < links.length; i++) {
                    if (!links[i].target) {
                        if (
                            links[i].hostname !== window.location.hostname || 
                            /\.(?!html?)([a-z]{0,3}|[a-zt]{0,4})$/.test(links[i].pathname)
                        ) {
                            links[i].target = '_blank';
                        } 
                    }
                }
                

                【讨论】:

                  【解决方案17】:

                  仅外部链接自动化,使用 GNU sed & make

                  如果想系统地为所有外部链接执行此操作,CSS is no option。但是,一旦从 Markdown 创建了 (X)HTML,就可以运行以下 sed 命令:

                  sed -i 's|href="http|target="_blank" href="http|g' index.html
                  

                  这可以通过将上面的sed 命令添加到makefile 来进一步自动化。有关详细信息,请参阅my website 上的 GNU make 或 see how I have done that。

                  【讨论】:

                    【解决方案18】:

                    如果您只想在特定链接中执行此操作,只需使用其他人回答的内联属性列表语法,或者仅使用 HTML。

                    如果您想在所有生成的&lt;a&gt; 标签中执行此操作,取决于您的 Markdown 编译器,也许您需要对其进行扩展。

                    这些天我正在为我的博客做这个,它是由pelican 生成的,它使用Python-Markdown。我找到了Python-MarkdownPhuker/markdown_link_attr_modifier 的扩展名,效果很好。请注意,名为 newtab 的旧扩展似乎在 Python-Markdown 3.x 中不起作用。

                    【讨论】:

                      【解决方案19】:

                      这对我有用:[页面链接](您的网址在此处“(目标|_blank)”)

                      【讨论】:

                        猜你喜欢
                        • 2021-07-28
                        • 2022-10-08
                        • 2023-01-20
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-05-11
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多