mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 10:19:36 -06:00
a771136761
Improves documentation UX by enabling consistent behavior for outbound links across pages
91 lines
2.3 KiB
JavaScript
91 lines
2.3 KiB
JavaScript
(function () {
|
|
'use strict';
|
|
|
|
function HasToken(tokens, token) {
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
if (tokens[i] === token) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function AddRelToken(anchor, token) {
|
|
var rel = (anchor.getAttribute('rel') || '').trim();
|
|
var tokens = rel ? rel.split(/\s+/) : [];
|
|
|
|
if (!HasToken(tokens, token)) {
|
|
tokens.push(token);
|
|
}
|
|
|
|
anchor.setAttribute('rel', tokens.join(' ').trim());
|
|
}
|
|
|
|
function IsExternalHttpLink(url) {
|
|
if (!url) {
|
|
return false;
|
|
}
|
|
|
|
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
return false;
|
|
}
|
|
|
|
return url.origin !== window.location.origin;
|
|
}
|
|
|
|
function InitExternalLinksNewTab() {
|
|
var mainContent = document.querySelector('.main-content');
|
|
if (!mainContent) {
|
|
return;
|
|
}
|
|
|
|
var anchors = mainContent.querySelectorAll('a[href]');
|
|
for (var i = 0; i < anchors.length; i++) {
|
|
var anchor = anchors[i];
|
|
var href = (anchor.getAttribute('href') || '').trim();
|
|
|
|
if (!href) {
|
|
continue;
|
|
}
|
|
|
|
if (href.charAt(0) === '#') {
|
|
continue;
|
|
}
|
|
|
|
if (href.indexOf('mailto:') === 0 || href.indexOf('tel:') === 0 || href.indexOf('javascript:') === 0) {
|
|
continue;
|
|
}
|
|
|
|
var url = null;
|
|
try {
|
|
url = new URL(href, window.location.href);
|
|
} catch (e) {
|
|
continue;
|
|
}
|
|
|
|
if (!IsExternalHttpLink(url)) {
|
|
continue;
|
|
}
|
|
|
|
var target = (anchor.getAttribute('target') || '').trim();
|
|
|
|
if (!target) {
|
|
anchor.setAttribute('target', '_blank');
|
|
target = '_blank';
|
|
}
|
|
|
|
if (target === '_blank') {
|
|
AddRelToken(anchor, 'noopener');
|
|
AddRelToken(anchor, 'noreferrer');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', InitExternalLinksNewTab);
|
|
return;
|
|
}
|
|
|
|
InitExternalLinksNewTab();
|
|
})(); |