NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @namespace https://openuserjs.org/users/shwifty659 // @name VkAwayLinksFix // @description Changes vk.com links from 'https://vk.com/away.php?to=<url>...' to <url>. (vk.com requires sign in when you click these links) // @license MIT // @version 1.0.0 // @include https://vk.com/* // @grant none // @run-at document-end // ==/UserScript== // ==OpenUserJS== // @author shwifty659 // ==/OpenUserJS== (function () { 'use strict'; const hrefPrefix = 'https://vk.com/away.php?'; // fix links initially fixNestedLinks(document.body); // fix links on DOM updates const observer = new MutationObserver(mutationCallback); observer.observe(document.body, { attributes: true, childList: true, subtree: true }); // Fix '<a href="...">' element: change href value from 'https://vk.com/away.php?to=<url>...' to <url> function fixVkAwayLinkElem(linkElem) { const href = linkElem.href; if (!(href && href.startsWith(hrefPrefix))) { return; } const urlParams = new URLSearchParams(href.substring(hrefPrefix.length)); if (urlParams.has('to')) { linkElem.href = urlParams.get('to'); } } // Fix nested link elements function fixNestedLinks(rootNode) { if (!(rootNode && rootNode.querySelectorAll)) { return; } const linkElems = rootNode.querySelectorAll('a[href^="/away.php?"]'); linkElems.forEach((linkElem) => fixVkAwayLinkElem(linkElem)); } // Callback function to execute when mutations are observed function mutationCallback(mutationsList) { for (const mutation of mutationsList) { switch (mutation.type) { case 'childList': /* One or more children have been added to and/or removed from the tree. (See mutation.addedNodes and mutation.removedNodes.) */ mutation.addedNodes.forEach((addedNode) => fixNestedLinks(addedNode)); break; case 'attributes': /* An attribute value changed on the element in mutation.target. The attribute name is in mutation.attributeName, and its previous value is in mutation.oldValue. */ if (mutation.attribute === 'href') { fixVkAwayLinkElem(mutation.target); } break; } } } })();