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

17

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

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

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

clonman
fuente
Sí, href está configurado en # y JS se invoca en el evento onclick de enlaces (el sitio no funciona con JS deshabilitado). Quizás haya algún tipo de complemento de navegador que pueda lidiar con esto.
Karan
44
Hay una solicitud de solución en el Bugzilla de Mozilla: Bug 55696 - "Forzar el enlace de JavaScript para abrir en una nueva ventana o nueva pestaña" .
pabouk
Sí, siempre pensé que esto era extremadamente tonto
Gigala
véase también: superuser.com/questions/854797/...
Braham-Snyder

Respuestas:

3

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

Codifiqué un UserScript que hace lo que quiere: reemplaza todos los enlaces de JavaScript con enlaces normales, por lo que puede hacer clic en ellos o abrirlos en una nueva pestaña si lo desea.

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

Puede encontrarlo aquí: https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

raphaelh
fuente
2

Si. Puede escribir sus propios scripts para Greasemonkey (Firefox) o Tampermonkey (Chrome)

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

// ==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 romper otras posibilidades 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.

Apretujado
fuente
1

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 onclick.

Lo escribí para un sitio específico, pero es lo suficientemente genérico como para que pueda ser útil para otros. No olvide cambiar la URL de @match 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);
})();
EM0
fuente