Les liens externes ne s'ouvrent pas dans un nouvel onglet par défaut

Bonjour,

Récemment, tous les liens externes sur mon forum ont cessé de s’ouvrir dans un nouvel onglet. J’ai vérifié à nouveau l’option « ouvrir les liens externes dans un nouvel onglet par défaut » et elle est bien cochée :

J’ai examiné le code HTML des liens via l’inspecteur d’éléments et target="_blank" est clairement absent.

Que dois-je faire ?

L’avez-vous essayé en mode sans échec ? Peut-être qu’un nouveau thème, un composant de thème ou un plugin interfère ? :face_with_monocle:

J’ai essayé le site en mode sans échec, mais le problème persiste.

Quelle version de Discourse utilisez-vous ? Cela me facilitera la tâche pour voir si je peux reproduire le problème.

Je exécute la dernière version 2.7.0.beta1

Pouvez-vous tester cela ici sur Meta ? Définissez vos préférences ici pour ouvrir les liens externes dans un nouvel onglet et voyez si cela fonctionne pour vous. Cela fonctionne très bien pour moi.

Bonjour @riteshsaini,

L’une de vos premières étapes de dépannage les plus efficaces serait d’examiner directement le DOM en utilisant la console de développement web ; et d’inspecter les attributs exacts de votre lien, en particulier l’attribut “target”.

Souvent, vous ne pouvez pas voir ces attributs du DOM en lisant directement le code source (ces attributs peuvent exister dans le DOM mais pas dans le code source), vous devrez donc interroger le DOM pour obtenir les attributs (pour en être certain à 100 %).

J’espère que cela a du sens.

Je pense que c’est ce qu’il a fait ici

Non. Lire le code source n’est pas la même chose que d’examiner le DOM.

Les attributs du DOM peuvent être différents (et le sont souvent) de ceux du code source ; en particulier sur les sites web qui utilisent beaucoup de JavaScript pour manipuler le DOM (comme Discourse).

C’est pourquoi j’ai spécifiquement mentionné d’interroger le DOM et non pas simplement de regarder le code source :slight_smile:

Cependant, je suis d’accord avec toi @osioke : le code source montre clairement que l’attribut target est manquant ; mais lorsque nous examinons le DOM, nous serons « certains » de la valeur de l’attribut, car le DOM peut se trouver dans un état différent de celui du code source (et l’est souvent).

Personnellement, je suis un grand partisan de « ne jamais rien supposer », c’est pourquoi j’ai suggéré à @riteshsaini de « s’assurer » en vérifiant le DOM, puis de « continuer à partir de là ».

Il est tout à fait possible que les attributs target des liens dans le DOM et dans le code source soient dans le même état ; mais je recommande toujours aux personnes qui dépannent des problèmes de ne pas supposer ce genre de détails ; d’où ma suggestion d’interroger le DOM comme étape de dépannage.

J’espère que cela t’aidera.

Au lieu de modifier les paramètres, j’utilise cette méthode

Démo : Theme Creator

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange((url, title) => {
        // Ouvrir automatiquement les liens externes dans un nouvel onglet ou une nouvelle fenêtre
        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>

… et en illustrant parfaitement, grâce à un exemple solide de l’API Discourse, comment le DOM et le code source peuvent se trouver dans des états différents, ce qui fait que vous ne verrez pas les attributs cibles définis par le JavaScript ci-dessus dans le code HTML source :slight_smile:

@Bcat merci de partager ce bout de code. Mais où devrais-je l’ajouter ?

PS : désolé pour la question naïve. Je ne suis pas développeur et je découvre complètement Discourse :slight_smile:

Salut @neounix, merci pour ta réponse.

Je ne suis pas vraiment sûr de comment faire cela :slight_smile: éclaire-moi là-dessus si tu as un peu de temps libre.

Voir le sujet : Installing a theme or theme component

discourse-automatically-open-external-links-in-new-tab.zip|pièce jointe (843 octets)

Avez-vous vérifié les paramètres de votre profil personnel sous preferences/interface ? Car généralement, cette situation se produit lorsque l’ouverture des liens externes dans un nouvel onglet est désactivée dans votre profil personnel.

La case n’était pas cochée, alors je l’ai cochée. Maintenant, les liens s’ouvrent dans un nouvel onglet uniquement lorsque je suis connecté. Si je vérifie le site dans un onglet de navigation privée, cela ne fonctionne toujours pas.

Cela fonctionne parfaitement ! Merci beaucoup :slight_smile:

Y a-t-il une solution pour ajouter rel="nofollow" à tous les liens externes, même ceux ajoutés par un administrateur ?

Je cherche une solution depuis des mois.

Pour les forums dédiés au partage et au téléchargement via des liens Bitly ou d’autres sites (moins sécurisés), seriez-vous prêt à utiliser rel="noopener noreferrer" à la place de rel="nofollow" ?
Vous pouvez en savoir plus sur noopener noreferrer.

Je peux envisager d’ajouter noopener noreferrer, mais je devrai tout de même inclure nofollow en même temps. En effet, je ne souhaite pas que Google suive ou indexe ces liens, car il s’agit de liens d’affiliation. Seul nofollow permet de faire cela.

Ajoutez links[i].rel = 'nofollow'; ou Fichier : discourse-automatically-open-external-links-in-new-tab.zip (856 octets)