¿Cómo abrir enlaces rebeldes de JavaScript en una nueva pestaña o ventana?

¿Cómo abrir enlaces rebeldes de JavaScript en una nueva pestaña o ventana?

Algunos sitios web utilizan hipervínculos "creativos" (¿javascript?) que interrumpen la funcionalidad del navegador, como la capacidad de presionar Ctrl+clic o hacer clic con el botón central en los enlaces para abrirlos en una nueva pestaña.

Un ejemplo común: los sitios web de recursos humanos de Taleo http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

No importa lo que intente, sólo puedo seguir enlaces haciendo clic en ellos normalmente; No puedo abrirlos en una ventana nueva. ¿Hay alguna manera de evitar esto?

Respuesta1

Tu pregunta es específica de Taleo, por lo que mi respuesta también lo será :)

He codificado un UserScript que hace lo que quieres: reemplaza todos los enlaces de JavaScript con enlaces normales, por lo que puedes simplemente hacer clic en ellos o abrirlos en una nueva pestaña si lo deseas.

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

Lo puedes encontrar aquí:https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

Respuesta2

Sí. Puedes escribir tus propios guiones paramono graso(Firefox) oMono manipulador(Cromo)

Para el ejemplo que mencionaste, este UserScript de Tampermonkey configurará todos los enlaces de JavaScript en los resultados de búsqueda para que se abran en una nueva pestaña/ventana (esto depende de la configuración del navegador, para mí son pestañas).

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

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

Aunque puede escribir versiones más genéricas de esto, será difícil habilitar esta funcionalidad para todos los enlaces de JavaScript sin alterar otras funciones de uso.

Una ruta intermedia podría ser establecer un controlador de eventos para Ctrl, que establecerá temporalmente el objetivo para TODOS los formularios en "_blank" mientras se mantenga presionada la tecla.

Respuesta3

Aquí hay otro script de usuario, que envuelve cualquier elemento con un onclick="document.location='some_url'"atributo en un <a href=some_url>elemento y elimina el archivo onclick.

Lo escribí para un sitio específico, pero es lo suficientemente genérico como para que pueda resultar útil a otros. No olvides cambiar el@fósforoURL a continuación.

Esto funciona cuando los enlaces se cargan mediante una llamada AJAX, de ahí el 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);
})();

información relacionada