Wie öffnet man hartnäckige Javascript-Links in einem neuen Tab oder neuen Fenster?

Wie öffnet man hartnäckige Javascript-Links in einem neuen Tab oder neuen Fenster?

Einige Websites verwenden „kreative“ (Javascript?) Hyperlinks, die die Browserfunktionalität beeinträchtigen, beispielsweise die Möglichkeit, Links durch Strg+Klick oder mittleres Klicken in einer neuen Registerkarte zu öffnen.

Ein typisches Beispiel: Taleo HR-Websites http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Egal, was ich versuche, ich kann Links nur folgen, indem ich normal darauf klicke; ich kann sie nicht in einem neuen Fenster öffnen. Gibt es eine Möglichkeit, das zu umgehen?

Antwort1

Ihre Frage bezieht sich speziell auf Taleo, daher wird meine Antwort das auch sein :)

Ich habe ein UserScript codiert, das genau das tut, was Sie möchten: Es ersetzt alle JavaScript-Links durch normale Links, sodass Sie einfach darauf klicken oder sie bei Bedarf in einem neuen Tab öffnen können.

// ==UserScript==
// @name        Taleo Fix
// @namespace   https://github.com/raphaelh/taleo_fix
// @description Taleo Fix Links
// @include     http://*.taleo.net/*
// @include     https://*.taleo.net/*
// @version     1
// @grant       none
// ==/UserScript==

function replaceLinks() {
    var rows = document.getElementsByClassName("titlelink");
    var url = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1) + "jobdetail.ftl";

    for (var i = 0; i < rows.length; i++) {
        rows[i].childNodes[0].href = url + "?job=" + rows[i].parentNode.parentNode.parentNode.parentNode.parentNode.id;
    }
}

if (typeof unsafeWindow.ftlPager_processResponse === 'function') {
    var _ftlPager_processResponse = unsafeWindow.ftlPager_processResponse;
    unsafeWindow.ftlPager_processResponse = function(f, b) {
        _ftlPager_processResponse(f, b);
        replaceLinks();
    };
}

if (typeof unsafeWindow.requisition_restoreDatesValues === 'function') {
    var _requisition_restoreDatesValues = unsafeWindow.requisition_restoreDatesValues;
    unsafeWindow.requisition_restoreDatesValues = function(d, b) {
        _requisition_restoreDatesValues(d, b);
        replaceLinks();
    };
}

Sie finden es hier:https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

Antwort2

Ja. Sie können Ihre eigenen Skripte schreiben fürFettaffe(Firefox) oderTampermonkey(Chrom)

Für das von Ihnen genannte Beispiel stellt dieses Tampermonkey-UserScript alle JavaScript-Links in den Suchergebnissen so ein, dass sie in einem neuen Tab/Fenster geöffnet werden (das hängt von der Browserkonfiguration ab, bei mir sind es Tabs).

// ==UserScript==
// @name       open links in tabs
// @match      http://rogers.taleo.net/careersection/technology/jobsearch.ftl*
// ==/UserScript==

document.getElementById('ftlform').target="_blank"

Obwohl Sie allgemeinere Versionen davon schreiben können, wird es schwierig sein, diese Funktionalität für alle JavaScript-Links zu aktivieren, ohne die Benutzerfreundlichkeit zu beeinträchtigen.

Ein Mittelweg könnte darin bestehen, einen Ereignishandler für festzulegen Ctrl, der das Ziel für ALLE Formulare vorübergehend auf „_blank“ setzt, solange die Taste gedrückt gehalten wird.

Antwort3

Hier ist ein weiteres Benutzerskript, das jedes Element mit einem onclick="document.location='some_url'"Attribut in ein <a href=some_url>Element einschließt und das entfernt onclick.

Ich habe es für eine bestimmte Site geschrieben, aber es ist allgemein genug, dass es für andere nützlich sein kann. Vergessen Sie nicht, die@übereinstimmenURL unten.

Dies funktioniert, wenn die Links durch einen AJAX-Aufruf geladen werden, daher der MutationObserver.

// ==UserScript==
// @name         JavaScript link fixer
// @version      0.1
// @description  Change JavaScript links to open in new tab/window
// @author       EM0
// @match        http://WHATEVER-WEBSITE-YOU-WANT/*
// @grant        none
// ==/UserScript==

var modifyLink = function(linkNode) {
    // Re-create the regex every time, otherwise its lastIndex needs to be reset
    var linkRegex = /document\.location\s*=\s*\'([^']+)\'/g;

    var onclickText = linkNode.getAttribute('onclick');
    if (!onclickText)
        return;

    var match = linkRegex.exec(onclickText);
    if (!match) {
        console.log('Failed to find URL in onclick text ' + onclickText);
        return;
    }

    var targetUrl = match[1];
    console.log('Modifying link with target URL ' + targetUrl);

    // Clear onclick, so it doesn't match the selector, before modifying the DOM
    linkNode.removeAttribute('onclick');

    // Wrap the original element in a new <a href='target_url' /> element
    var newLink = document.createElement('a');
    newLink.href = targetUrl;
    var parent = linkNode.parentNode;
    newLink.appendChild(linkNode);
    parent.appendChild(newLink);
};

var modifyLinks = function() {
    var onclickNodes = document.querySelectorAll('*[onclick]');
    [].forEach.call(onclickNodes, modifyLink);
};

var observeDOM = (function(){
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

    return function(obj, callback) {
        if (MutationObserver) {
            var obs = new MutationObserver(function(mutations, observer) {
                if (mutations[0].addedNodes.length || mutations[0].removedNodes.length)
                    callback();
            });

            obs.observe(obj, { childList:true, subtree:true });
        }
    };
})();


(function() {
    'use strict';
    observeDOM(document.body, modifyLinks);
})();

verwandte Informationen