Чи можу я створити посилання з 'target =' _ blank '' у Markdown?


460

Чи є спосіб створити посилання в Markdown, яке відкриється в новому вікні? Якщо ні, то який синтаксис ви рекомендуєте це зробити. Я додам його до компілятора розмітки, який використовую. Я думаю, що це має бути варіант.


Отже, як зазначено у відповідях, це не є ознакою розмітки. Якщо ви хотіли зробити це за замовчуванням на веб-сайті за всіма посиланнями, Девід Морроу має відповідь . Або якщо ви просто хотіли це зробити в одному екземплярі, то у відповіді Матчу йдеться про те, що ви повинні насправді написати це в HTML.
JGallardo


Ваше запитання не стосується того, чим ви займаєтесь, але деякі механізми розмітки або веб-переглядачі (не впевнені, які) визнають, коли створене вами посилання вказують на інший домен, і відкриють їх у новій вкладці. Для мене є випадки, коли вилучення sз цього https:достатньо, щоб отримати потрібну функціональність.
Джош Густ

Відповіді:


377

Що стосується синтаксису Markdown, якщо ви хочете детальніше ознайомитись, вам просто доведеться використовувати HTML.

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

Більшість двигунів Markdown, які я бачив, дозволяють звичайний старий HTML, лише для таких ситуацій, коли загальна система розмітки тексту просто не перерізає його. (Наприклад, двигун StackOverflow.) Потім вони запускають весь вихід через фільтр білого списку HTML, незалежно, оскільки навіть документ, що лише для Markdown, може легко містити атаки XSS. Якщо ви або ваші користувачі хочете створити _blankпосилання, вони, ймовірно, все ще можуть.

Якщо це функція, яку ви часто використовуєте, можливо, має сенс створити власний синтаксис, але це, як правило, не є життєво важливою ознакою. Якщо я хочу запустити це посилання у новому вікні, я сам натискаю клавішу ctrl, дякую.


19
Я знаєте, що? Я згоден з тобою і Алекс . Я вирішив взагалі не використовувати _blank. Краще користувацьке обслуговування - зберігати речі в одному веб-переглядачі. Вони можуть просто натиснути назад або натиснути команду (користувач Mac тут :)), як ви кажете.
ma11hew28

1
Я маю запустити JavaScript на сторінці, яка додає _blank до всіх посилань за межами мого домену. як у @alex є наступна відповідь
David Silva Smith

3
Я б запропонував (у бажанні бути чітким і чітко читаним) наступний синтаксис: [Visit this page](http::/link.com(отримати уявлення про відкриття .
Августин Рідінгер

4
Simple target = "_ blank" може бути небезпечним! Додати також тег rel = "noopener" у тег! ( sites.google.com/site/bughunteruniversity/nonvuln/… )
Макс Вязников

1
@MaxVyaznikov Цікаво. Як ви вважаєте, було б безпечніше, якби браузери надали верхнє вікно, яке з'явилося для входу? Відокремте інтерфейс для входу для веб-сайтів від підробленого та підробленого інтерфейсу для входу, створеного веб-сторінками "lookalike". Можливо, це буде тепер більш можливим, коли це було складніше в минулому.
1,21 гігаватта

350

Kramdown підтримує це. Він сумісний із стандартним синтаксисом Markdown, але також має багато розширень. Ви б використовували це так:

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

7
Схоже, це не працює за допомогою механізму Markdown на Mac :-(
Netsi1964

48
Чудово працює з jekyll!
благагабар

1
Kramdown синтаксис: [ім'я посилання] (URL_LINK) {: TARGET = "_blank"} може бути розібрано в HTML з допомогою kramdown редактора: http://trykramdown.herokuapp.com/ Я використовував його , тому що у мене вже було чимало kramdown посилання, і хотів уникнути їх повторного введення.
algoquant

4
Чи існує спосіб в jekyll встановити це за замовчуванням? Я хотів би, щоб усі посилання в моїх блогах відкривалися зtarget="_blank"
ahirschberg

10
Це не працює. Він просто відображає {: target = "_ blank"} як текст.
Бенні

113

Я не думаю, що є особливість розмітки.

Хоча можуть бути й інші варіанти, якщо ви хочете автоматично відкривати посилання, які вказують на ваш власний сайт за допомогою 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 .


1
Я згоден з вами, але у випадку, коли ви знаходитесь у кадрі, вам потрібно підірвати кадр із посиланням.
Девід Морроу

2
Я знаходжу єдиний раз, коли я примушую людей до нового вікна, коли я перебуваю на півдорозі речення, яке посилається десь на зовнішнє місце, і я хочу надати джерела для своїх коментарів, не перериваючи потік. Цей js-фрагмент ідеально підходить для цієї мети - дякую, рекомендуємо :)
tehwalrus

14
Я думаю, що цитата Якоба Нільсона тут більше не застосовується. Він скаржиться на відкриття нових вікон, але натомість target = "_ blank" відкривається на новій вкладці. Мені особисто це не подобається, коли посилання на інші домени не відкриваються на нових вкладках.
Олександр Рехштайнер

3
Також: тому, що говорити Jakob Nielsen says you shouldn't do that- жахливий аргумент.
Ола Тувессон

2
Я хочу додати тут, що ЦЕ також є кращим як глобальне рішення. Він тримає ваш Markdown чистим, що і полягає в Markdown.
Адам Майкл Вуд

47

З Markdown-2.5.2 ви можете використовувати це:

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

2
Я спробував це, і мені це не вийшло. Використання з django 1.6
joel goldstick

5
Працює з Jekyll v2.4.0 (може працювати і з більш ранніми версіями)
nicksuch

5
Це крамдаун (і оскільки Jekyll використовує kramdown, він працює з Jekyll).
z3ntu

1
Здається, цей синтаксис не працює в GitLab. Я не впевнений, яка версія Markdown використовується зараз.
Rockin4Life33

Чи є спосіб зробити це за замовчуванням, тому мені не потрібно вказувати його для кожного посилання?
Коннель

8

Одне глобальне рішення - це ввести елемент <base target="_blank"> вашої сторінки <head>. Це ефективно додає ціль за замовчуванням до кожного елемента прив’язки. Я використовую розмітку для створення вмісту на своєму веб-сайті, що базується на Wordpress, і мій налаштування теми дозволить мені ввести цей код у верхню частину кожної сторінки. Якщо ваша тема цього не робить, є плагін


8

Я використовую Grav CMS, і це прекрасно працює:

Тіло / Зміст:
Some text[1]

Тіло / Довідка:
[1]: http://somelink.com/?target=_blank

Просто переконайтеся, що цільовий атрибут передано спочатку, якщо в посиланні є додаткові атрибути, скопіюйте / вставте їх у кінець посилання.

Також працюйте як пряме посилання:
[Go to this page](http://somelink.com/?target=_blank)


Для довідки, тут знаходиться відповідна глава документації .
domsson

7

Для розмітки привидів використовуйте:

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

Знайшов його тут: https://cmatskas.com/open-external-links-in-a-new-window-ghost/


1
мені подобається ваше рішення. тому що я спробував це з різними конфігураціями, здається, що він працює лише у вбудованому зв’язку . можливо, є спосіб зв’язування з посилальними посиланнями . що - щось на кшталт: [open new window][1] \n [1]: (https://abc.xyz" target="_blank). можливо, я щось помиляюсь, або це не ментант працювати таким чином?
MrIsaacs

7

Отже, не зовсім вірно, що ви не можете додати атрибути посилання до URL-адреси розмітки. Щоб додати атрибути, перевірте, що використовується базовий аналізатор розмітки та які їх розширення.

Зокрема, pandoc має розширення для включення link_attributes, яке дозволяє розміщувати посилання. напр

[Hello, world!](http://example.com/){target="_blank"}
  • Для тих , хто прибуває з R (наприклад , використовуючи rmarkdown, bookdown, blogdownі так далі), це синтаксис ви хочете.
  • Для тих, хто не використовує R , можливо , буде потрібно включити розширення у виклику pandocз+link_attributes

Примітка. Це відрізняється відkramdown парсера, яка є однією з прийнятих відповідей вище. Зокрема, зауважте, що крамдаун відрізняється від pandoc тим, що йому потрібна двокрапка - :- на початку фігурних дужок - {}наприклад,

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

Зокрема:

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

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

Це працювало для мене в нашому спеціальному середовищі розмітки. Дякую!
klewis

6

Це можна зробити за допомогою власного коду javascript:

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

JSFiddle Code


6

У своєму проекті я це роблю, і це прекрасно працює:

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

Посилання

Але не всі аналізатори дозволяють вам це робити.


Практично працює, але навіть ваш приклад відображається з URL-адресою, закодованою у заголовку attr, а не як нові attrs (перегляньте джерело чи відредагуйте вузол як html): <a href="https://example.org/" rel="nofollow" title="title&quot; target=&quot;_blank">Link</a>
Graham P Heath

6

Немає простого способу зробити це, і, як @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/


0

Я зіткнувся з цією проблемою, намагаючись реалізувати розмітку за допомогою PHP.

Оскільки посилання, створені користувачем, створені з розміткою, повинні відкриватися в новій вкладці, але посилання на сайт повинні залишатися у вкладці, я змінив розмітку, щоб генерувати лише посилання, які відкриваються в новій вкладці. Тому не всі посилання на сторінці посилаються, лише ті, що використовують розмітку.

У розмітці я змінив весь вихідний посилання, <a target='_blank' href="...">яке було досить просто за допомогою пошуку / заміни.


0

Я не погоджуюся, що краще користувачеві залишатися на одній вкладці браузера. Якщо ви хочете, щоб люди залишилися на вашому веб-сайті або повернулися, щоб прочитати цю статтю, відправте їх на новій вкладці.

Спираючись на відповідь @ 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>


0

За завершений alex відповів (13 грудня 10)

Більш розумна ціль для ін'єкцій можна зробити за допомогою цього коду:

/*
 * 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');

Ви можете змінити винятки regexp, додавши додаткове розширення в (?!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';
        } 
    }
}

0

Автоматизовано лише для зовнішніх посилань, використовуючи GNU sed & make

Якщо хотілося б це робити систематично для всіх зовнішніх посилань, CSS - це не варіант . Однак можна виконати таку sedкоманду, як тільки (X) HTML буде створений з Markdown:

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

Це можна додатково автоматизувати, додавши вищевказану sedкоманду до a makefile. Детальніше дивіться у GNU makeабо дивіться, як я це зробив на своєму веб-сайті .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.