Comment ouvrir les liens Javascript tenaces dans un nouvel onglet ou une nouvelle fenêtre?

17

Certains sites Web utilisent des hyperliens «créatifs» (javascript?) Qui cassent la fonctionnalité du navigateur, comme la possibilité de cliquer sur les liens Ctrl + clic ou clic milieu pour les ouvrir dans un nouvel onglet.

Un exemple courant, les sites Web taleo HR http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Peu importe ce que j'essaie, je ne peux suivre les liens qu'en cliquant dessus normalement; Je ne peux pas les ouvrir dans une nouvelle fenêtre. Y a-t-il un moyen de contourner cela?

cloneman
la source
Oui, href est défini sur # et JS est invoqué lors de l'événement onclick des liens (le site ne fonctionne pas avec JS désactivé). Peut-être existe-t-il une sorte de plugin de navigateur qui peut gérer cela.
Karan
4
Il y a une demande de solution dans le Bugzilla de Mozilla: Bug 55696 - "Forcer le lien JavaScript à s'ouvrir dans une nouvelle fenêtre ou un nouvel onglet" .
pabouk
Oui, j'ai toujours pensé que c'était extrêmement stupide
Gigala
voir aussi: superuser.com/questions/854797/…
braham-snyder

Réponses:

3

Votre question est spécifique à Taleo, donc ma réponse le sera aussi :)

J'ai codé un UserScript qui fait ce que vous voulez: il remplace tous les liens JavaScript par des liens normaux, vous pouvez donc simplement les cliquer ou les ouvrir dans un nouvel onglet si vous le souhaitez.

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

Vous pouvez le trouver ici: https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

raphaelh
la source
2

Oui. Vous pouvez écrire vos propres scripts pour Greasemonkey (Firefox) ou Tampermonkey (Chrome)

Pour l'exemple que vous avez mentionné, ce Tampermonkey UserScript définira tous les liens JavaScript dans les résultats de la recherche pour qu'ils s'ouvrent dans un nouvel onglet / fenêtre (cela dépend de la configuration du navigateur, ce sont des onglets pour moi).

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

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

Bien que vous puissiez en écrire des versions plus génériques, il sera difficile d'activer cette fonctionnalité pour tous les liens JavaScript sans interrompre les autres possibilités d'utilisation.

Un chemin intermédiaire pourrait être de définir un gestionnaire d'événements pour Ctrl, qui définira temporairement la cible pour TOUS les formulaires sur "_blank" tant que la clé est maintenue.

À presser
la source
1

Voici un autre script utilisateur, qui enveloppe tout élément avec un onclick="document.location='some_url'"attribut dans un <a href=some_url>élément et supprime le onclick.

Je l'ai écrit pour un site spécifique, mais il est suffisamment générique pour être utile à d'autres. N'oubliez pas de modifier l' URL @match ci-dessous.

Cela fonctionne lorsque les liens sont chargés par un appel AJAX, d'où le 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
la source