在新标签页中打开链接

所有链接都将在新标签页中打开

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         在新标签页中打开链接
// @namespace    http://tampermonkey.net/
// @version      2
// @description  所有链接都将在新标签页中打开
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 定义不受影响的域名数组
    var excludedDomains = [
        'example.com', // 在此添加任何不受影响的域名
    ];

    // 定义应下载而不是在新标签页中打开的文件扩展名数组
    var downloadExtensions = [
        'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar', 'tar', 'gz',
    ];

    // 定义应排除或保留的链接属性数组
    var linkAttributes = {
        exclude: [
            'hreflang', 'media', 'ping', 'rel', 'target', 'type', 'onclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmouseout',
        ],
        preserve: [
            'title', 'class', 'id', 'style',
        ],
    };

    // 获取页面上的所有链接
    var links = document.getElementsByTagName('a');

    // 循环遍历链接,并将target="_blank"属性添加到外部链接
    for (var i = 0; i < links.length; i++) {
        var link = links[i];

        // 检查链接是否已经设置为在新标签页中打开
        if (link.target === '_blank') {
            continue;
        }

        // 检查链接是否在排除的域名上
        var domain = link.hostname.replace(/^www\./, '');
        if (excludedDomains.indexOf(domain) !== -1) {
            continue;
        }

        // 检查链接是否为内部链接、mailto链接或tel链接
        if (link.hostname === location.hostname || !link.hostname || link.protocol === 'mailto:' || link.protocol === 'tel:') {
            continue;
        }

        // 检查链接是否为应下载的文件
        var extension = link.pathname.split('.').pop();
        if (downloadExtensions.indexOf(extension) !== -1) {
            link.setAttribute('download', '');
            continue;
        }

        // 检查链接是否具有任何被排除的属性
        var attributes = link.attributes;
        for (var j = 0; j < attributes.length; j++) {
            var attributeName = attributes[j].name.toLowerCase();
            var attributeValue = attributes[j].value;

            // 排除应排除的属性
            if (linkAttributes.exclude.indexOf(attributeName) !== -1) {
                continue;
            }

            // 保留应保留的属性
            if (linkAttributes.preserve.indexOf(attributeName) !== -1) {
                link.setAttribute(attributeName, attributeValue);
                continue;
            }

            // 为外部链接添加target="_blank"属性
            if (attributeName === 'href') {
                link.setAttribute('target', '_blank');
            }

            // 复制任何其他属性
            link.setAttribute(attributeName, attributeValue);
        }

        // 处理外部链接的文本内容
        var linkText = link.textContent.trim();
        if (!linkText) {
            continue;
        }

        // 检查链接文本是否包含URL
        if (linkText.indexOf('http://') !== -1 || linkText.indexOf('https://') !== -1) {
            continue;
        }
    }
   
})();