Jak otworzyć uparte linki javascript w nowej karcie lub nowym oknie?

17

Niektóre witryny wykorzystują hiperłącza „kreatywne” (javascript?), Które niszczą funkcje przeglądarki, takie jak możliwość klikania linków z wciśniętym klawiszem Ctrl + kliknięcie lub kliknięcie środkowym przyciskiem, aby otworzyć je w nowej karcie.

Typowym przykładem są strony internetowe taleo HR http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Bez względu na to, co próbuję, mogę podążać za linkami, klikając je normalnie; Nie mogę ich otworzyć w nowym oknie. Czy jest na to jakiś sposób?

kloneman
źródło
Tak, href jest ustawiony na #, a JS jest wywoływany przy zdarzeniu linków onclick (strona nie działa z wyłączonym JS). Być może istnieje jakaś wtyczka do przeglądarki, która może sobie z tym poradzić.
Karan
4
W Bugzilli Mozilli: Bug 55696 pojawia się prośba o rozwiązanie - „Wymuś otwieranie łącza JavaScript w nowym oknie lub nowej karcie” .
pabouk
Tak, zawsze uważałem, że to wyjątkowo głupie
Gigala
patrz także: superuser.com/questions/854797/…
braham-snyder

Odpowiedzi:

3

Twoje pytanie dotyczy Taleo, więc moja odpowiedź też będzie :)

Napisałem kod użytkownika, który robi to, co chcesz: zastępuje wszystkie łącza JavaScript zwykłymi linkami, więc możesz je kliknąć lub otworzyć w nowej karcie, jeśli chcesz.

// ==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();
    };
}

Można go znaleźć tutaj: https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

Raphaelh
źródło
2

Tak. Możesz pisać własne skrypty dla Greasemonkey (Firefox) lub Tampermonkey (Chrome)

W podanym przykładzie ten skrypt użytkownika Tampermonkey ustawi wszystkie łącza JavaScript w wynikach wyszukiwania, aby otwierały się w nowej karcie / oknie (zależy to od konfiguracji przeglądarki, to dla mnie zakładki).

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

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

Chociaż możesz napisać bardziej ogólne wersje tego, włączenie tej funkcjonalności dla wszystkich łączy JavaScript bez zerwania innej użyteczności będzie trudne.

Ścieżką pośrednią może być ustawienie modułu obsługi zdarzeń Ctrl, który tymczasowo ustawi cel WSZYSTKICH formularzy na „_blank”, o ile przytrzymany zostanie klawisz.

Ściśnij
źródło
1

Oto kolejny skrypt użytkownika, który otacza dowolny element onclick="document.location='some_url'"atrybutem w <a href=some_url>elemencie i usuwa onclick.

Napisałem go dla konkretnej witryny, ale jest on wystarczająco ogólny, aby mógł być użyteczny dla innych. Nie zapomnij zmienić adresu URL @match poniżej.

Działa to, gdy łącza są ładowane przez wywołanie AJAX, stąd 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
źródło