Docusaurus - как открывать внешние ссылки в новой вкладке?

Я использую Docusaurus и хотел бы открывать внешние ссылки в новых вкладках.

Я бы предпочел использовать для этого код, а не писать html-код в моем документе уценки в соответствии с этот ответ.

Я пробовал этот ответ:

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

А также этот ответ:

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

Я думаю, что эта почта, вероятно, сделает то, что я хочу, я пытался добавить код в _index.js, но Docusaurus прекратил сборку.

(function() {
  var links = document.getElementsByTagName('a');
  for (var i = 0; i < links.length; i++) {
    if (/^(https?:)?///.test(links[i].getAttribute('href'))) {
      links[i].target = '_blank';
    }
  }
})();

Я загрузил код JavaScript в Гитхаб и добавил его в siteConfig.js:

// Add custom scripts here that would be placed in <script> tags.
  scripts: [
    "https://buttons.github.io/buttons.js",
    "https://msdcanderson.github.io/docusaurus-open-link-new-tab.github.io/open-link-new-tab.js"
  ],

Скрипт загружается, но не работает должным образом.

Я ожидаю, что ссылка, написанная в Markdown, откроется в новой вкладке браузера:

[the rmarkdown website](https://rmarkdown.rstudio.com)

Любые идеи были бы замечательными - спасибо

🤔 А знаете ли вы, что...
JavaScript позволяет создавать мобильные приложения для iOS и Android с использованием фреймворков, таких как React Native и NativeScript.


3
1 938
1

Ответ:

Решено

Сопровождающий докузавр здесь!

Вы правы, что Docusaurus не поддерживает это из коробки. Вероятная причина того, что ваш вышеприведенный скрипт не работает, заключается в том, что Docusaurus вводит теги <script> над <body>, и когда скрипт запускается, <body> не загружается и нет тегов <a> для работы. Попробуйте обернуть свой код в document.addEventListener('DOMContentLoaded', ...) следующим образом:

document.addEventListener('DOMContentLoaded', function() {
  var links = document.getElementsByTagName('a');
  for (var i = 0; i < links.length; i++) {
    if (/^(https?:)?///.test(links[i].getAttribute('href'))) {
      links[i].target = '_blank';
    }
  }
});

Однако я рекомендую вам не использовать этот сценарий, а вместо этого добиться эффекта несколькими другими способами:

1. Замечательные плагины

Настройте это с помощью замечательных плагинов. Замечательным является механизм Markdown, который преобразует Markdown в HTML.

Этот замечательный-extlink плагин кажется тем, что вам нужно. Попробуйте добавить его в свой siteConfig! См. документацию siteConfig здесь.

// siteConfig.js
const extlink = require('remarkable-extlink');

const siteConfig = {
  ...
  markdownPlugins: [
    function(md) {
      extlink(md, {
        host: 'yourhost.com', // The hrefs that you DON'T want to be external
      });
    },
  ],
  ...
}

2. Замечательные опции

Remarkable поддерживает создание внешних ссылок путем настройки linkTarget вариант, а Docusaurus показывает это в siteConfig (но не задокументировано) и в данный момент не работает. Я отправил пиар, чтобы исправить это, так что следите за этим в следующем выпуске. Однако я бы не рекомендовал этот подход, поскольку он делает Все ваши ссылки открытыми в новой вкладке, а не только внешние.

3. Используйте HTML в уценке

Лично я бы просто использовал этот вариант, так как он самый быстрый. Кроме того, в этом нет ничего плохого/плохого, и мне нравится, что я могу использовать HTML.

4. Напишите свой собственный замечательный плагин

Напишите свой собственный плагин, который понимает такой синтаксис [link](url){:target = "_blank"} и генерирует нужный HTML. Это может быть лучшим вариантом, если вы не хотите использовать HTML, но требует больших усилий.