"Открывать внешние ссылки в новой вкладке по умолчанию" не работает

Здравствуйте,

В последнее время все внешние ссылки на моём форуме перестали открываться в новой вкладке. Я дважды проверил опцию «Открывать внешние ссылки в новой вкладке по умолчанию» — она включена:

Я проверил HTML-код ссылок через «Инструменты разработчика», и атрибут target="_blank" явно отсутствует.

Что мне делать?

Вы пробовали это в безопасном режиме? Возможно, новая тема, компонент темы или плагин мешает? :face_with_monocle:

Я попробовал запустить сайт в безопасном режиме, но проблема осталась прежней

Какую версию Discourse вы используете? Так будет проще понять, смогу ли я воспроизвести проблему.

Я использую последнюю версию 2.7.0.beta1

Можете протестировать это здесь, в Meta? Настройте свои предпочтения здесь, чтобы открывать внешние ссылки в новой вкладке, и проверьте, работает ли это у вас. У меня это работает довольно хорошо.

Привет, @riteshsaini

Один из лучших первых шагов в устранении неполадок — это непосредственный осмотр DOM с помощью консоли для разработчиков веб-сайтов, а также проверка точных атрибутов вашей ссылки, в частности атрибута «target».

Часто эти атрибуты DOM нельзя увидеть, просто читая исходный код (они могут существовать в DOM, но отсутствовать в исходном коде), поэтому вам нужно будет запросить DOM, чтобы получить атрибуты (чтобы быть на 100% уверенным).

Надеюсь, это понятно.

Я думаю, именно это он и сделал здесь

Нет. Чтение исходного кода не то же самое, что проверка DOM.

Атрибуты DOM могут отличаться (и часто отличаются) от исходного кода; особенно на веб-сайтах, которые активно используют JavaScript для манипуляции DOM (как Discourse).

Вот почему я конкретно упомянул необходимость запросить DOM, а не просто посмотреть на исходный код :slight_smile:

Однако я согласен с вами, @osioke, что в исходном коде явно отсутствует атрибут target; но при проверке DOM мы будем «уверены» в значении атрибута, поскольку DOM может находиться в ином состоянии, чем исходный код (и часто находится в ином состоянии).

Лично я большой сторонник принципа «никогда ничего не предполагать», поэтому я предложил @riteshsaini «убедиться», проверив DOM, а затем «действовать исходя из этого».

Весьма вероятно, что атрибуты target в ссылке DOM и в исходном коде находятся в одинаковом состоянии; но я всегда рекомендую людям, занимающимся устранением неполадок, не делать подобных предположений; отсюда и моя рекомендация запросить DOM как шаг в процессе диагностики.

Надеюсь, это поможет.

Вместо настройки в параметрах я использую этот способ

Демо: Theme Creator

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange((url, title) => {
        // Автоматически открывать внешние ссылки в новой вкладке или окне
        var pc = 1;
        if ($("html").hasClass("mobile-device")) pc = 0;
        var links = document.links;
        for (var i = 0, linksLength = links.length; i < linksLength; i++) {
            if (links[i].hostname != window.location.hostname) {
                if (pc) links[i].target = '_blank'; else links[i].target = '_self';
            }
        }
    });
</script>

… и наглядно демонстрирует на примере надежного API Discourse, что DOM и исходный код будут находиться в разных состояниях, и вы не увидите целевые атрибуты в исходном коде HTML, установленные вышеупомянутым JS :slight_smile:

@Bcat спасибо за этот фрагмент. Но куда именно его нужно добавить?

PS: извините за глупый вопрос. Я не программист и совершенно новичок в Discourse :slight_smile:

Привет @neounix, спасибо за ответ.

Я не совсем уверен, как это сделать :slight_smile: если у вас есть свободное время, просветите меня по этому вопросу.

Просмотр темы: Installing a theme or theme component

discourse-automatically-open-external-links-in-new-tab.zip|вложение (843 байт)

Проверяли ли вы настройки в своём личном профиле в разделе preferences/interface? Обычно такая ситуация возникает, когда в личном профиле отключено открытие внешних ссылок в новых вкладках.

Галочка была снята, поэтому я поставил её. Теперь ссылки открываются в новой вкладке только когда я авторизован. Если проверить сайт в режиме инкогнито, проблема всё ещё сохраняется.

Всё работает как надо. Просто отлично! Большое спасибо :slight_smile:

Есть ли решение, как добавить rel="nofollow" ко всем внешним ссылкам, даже тем, которые добавлены администратором?

Я уже месяцами пытаюсь это сделать.

Для форумов, где осуществляется обмен и загрузка файлов с использованием ссылок через Bitly или другие сайты (менее безопасно), вы бы рассмотрели возможность использования rel="noopener noreferrer" вместо rel="nofollow"?
Вы можете узнать больше о noopener noreferrer.

Я могу рассмотреть возможность добавления noopener noreferrer, но при этом мне всё равно нужно будет добавить nofollow вместе с ними. Дело в том, что я не хочу, чтобы Google переходил по этим ссылкам или индексировал их, поскольку это партнёрские ссылки. С этим может помочь только nofollow.

Добавьте links[i].rel = 'nofollow'; или Файл: discourse-automatically-open-external-links-in-new-tab.zip (856 байт)