From db23badcedc91d36f83580eb6f5dc88fd981c1dd Mon Sep 17 00:00:00 2001 From: Akamaru Date: Fri, 27 Jun 2025 20:47:58 +0200 Subject: [PATCH] =?UTF-8?q?Neu:=20Links=20im=20neuen=20Tab=20=C3=B6ffnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- open-links-in-new-tab.user.js | 90 +++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 open-links-in-new-tab.user.js diff --git a/open-links-in-new-tab.user.js b/open-links-in-new-tab.user.js new file mode 100644 index 0000000..e36070c --- /dev/null +++ b/open-links-in-new-tab.user.js @@ -0,0 +1,90 @@ +// ==UserScript== +// @name Links im neuen Tab öffnen +// @namespace https://git.ponywave.de/Akamaru/Userscripts +// @version 1.0 +// @description Öffnet alle Links auf bestimmten Seiten im neuen Tab. Seiten können hinzugefügt oder entfernt werden. +// @author Akamaru +// @match *://*/* +// @grant GM_registerMenuCommand +// @updateURL https://git.ponywave.de/Akamaru/Userscripts/raw/branch/master/open-links-in-new-tab.user.js +// ==/UserScript== + +(function() { + 'use strict'; + + const STORAGE_KEY = 'openLinksInNewTab_domains'; + + // Domains aus localStorage laden oder Standardwert setzen + function getDomains() { + const data = localStorage.getItem(STORAGE_KEY); + if (data) { + try { + return JSON.parse(data); + } catch { + return []; + } + } + return []; + } + + function setDomains(domains) { + localStorage.setItem(STORAGE_KEY, JSON.stringify(domains)); + } + + function getCurrentDomain() { + return window.location.hostname; + } + + function isActiveDomain() { + const domains = getDomains(); + return domains.includes(getCurrentDomain()); + } + + function addDomain(domain) { + const domains = getDomains(); + if (!domains.includes(domain)) { + domains.push(domain); + setDomains(domains); + alert(`Domain hinzugefügt: ${domain}`); + } else { + alert(`Domain ist bereits in der Liste: ${domain}`); + } + } + + function removeDomain(domain) { + let domains = getDomains(); + if (domains.includes(domain)) { + domains = domains.filter(d => d !== domain); + setDomains(domains); + alert(`Domain entfernt: ${domain}`); + } else { + alert(`Domain ist nicht in der Liste: ${domain}`); + } + } + + function showDomains() { + const domains = getDomains(); + alert('Aktive Domains:\n' + (domains.length ? domains.join('\n') : 'Keine')); + } + + // Menü-Befehle + if (typeof GM_registerMenuCommand !== 'undefined') { + GM_registerMenuCommand('Aktive Domains anzeigen', showDomains); + GM_registerMenuCommand('Diese Seite hinzufügen', () => addDomain(getCurrentDomain())); + GM_registerMenuCommand('Diese Seite entfernen', () => removeDomain(getCurrentDomain())); + } + + // Links anpassen, wenn Domain aktiv ist + if (isActiveDomain()) { + function updateLinks() { + document.querySelectorAll('a[href]:not([target="_blank"])').forEach(link => { + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer'); + }); + } + updateLinks(); + // Für dynamisch geladene Inhalte (z.B. Single Page Apps) + const observer = new MutationObserver(updateLinks); + observer.observe(document.body, { childList: true, subtree: true }); + } +})(); \ No newline at end of file