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

17

Einige Websites verwenden "kreative" (Javascript?) Hyperlinks, die die Funktionalität des Browsers beeinträchtigen, z. B. die Möglichkeit, mit gedrückter Strg-Taste oder mittlerer Maustaste auf Links zu klicken, um diese in einem neuen Tab zu öffnen.

Ein häufiges Beispiel sind die 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 sie normal anklicke. Ich kann sie nicht in einem neuen Fenster öffnen. Gibt es einen Weg, dies zu umgehen?

Cloneman
quelle
Ja, href ist auf # gesetzt und JS wird beim Klicken auf Links aufgerufen (Site funktioniert nicht, wenn JS deaktiviert ist). Vielleicht gibt es eine Art Browser-Plugin, das sich damit befasst.
Karan
4
Es gibt eine Anfrage nach einer Lösung in Mozillas Bugzilla: Bug 55696 - "JavaScript-Link zum Öffnen in neuem Fenster oder neuem Tab erzwingen" .
Pabouk
Ja, ich fand das immer extrem albern
Gigala
siehe auch: superuser.com/questions/854797/...
braham-snyder

Antworten:

3

Ihre Frage ist spezifisch für Taleo, daher wird meine Antwort auch lauten :)

Ich habe ein UserScript geschrieben, das macht, was Sie wollen: Es ersetzt alle JavaScript-Links durch normale Links, sodass Sie sie einfach anklicken oder in einem neuen Tab öffnen können, wenn Sie möchten.

// ==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

raphaelh
quelle
2

Ja. Sie können Ihre eigenen Skripte für Greasemonkey (Firefox) oder Tampermonkey (Chrome) schreiben.

In dem von Ihnen erwähnten Beispiel werden in diesem Tampermonkey-UserScript alle JavaScript-Links in den Suchergebnissen so eingestellt, dass sie in einem neuen Tab / Fenster geöffnet werden (dies hängt von der Browserkonfiguration ab und ist für mich von Tabs abhängig).

// ==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 andere Benutzerfreundlichkeit zu beeinträchtigen.

Ein Mittelweg könnte sein, einen Ereignishandler für festzulegen Ctrl, der das Ziel für ALLE Formulare vorübergehend auf "_blank" setzt, solange der Schlüssel gehalten wird.

Quetschen
quelle
1

Hier ist ein weiteres Userscript, das ein beliebiges 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, damit es für andere nützlich sein kann. Vergessen Sie nicht, die unten stehende @match- URL zu ändern .

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);
})();
EM0
quelle