Como abrir links javascript teimosos em uma nova aba ou nova janela?

Como abrir links javascript teimosos em uma nova aba ou nova janela?

Alguns sites usam hiperlinks "criativos" (javascript?) Que quebram a funcionalidade do navegador, como a capacidade de pressionar Ctrl + clique ou clicar com o botão do meio em links para abri-los em uma nova guia.

Um exemplo comum, sites Taleo HR http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Não importa o que eu tente, só consigo seguir os links clicando neles normalmente; Não consigo abri-los em uma nova janela. Existe alguma maneira de contornar isso?

Responder1

Sua pergunta é específica do Taleo, então minha resposta também será :)

Codifiquei um UserScript que faz o que você deseja: substitui todos os links JavaScript por links normais, para que você possa simplesmente clicar neles ou abri-los em uma nova guia, se desejar.

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

Você pode encontrá-lo aqui:https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

Responder2

Sim. Você pode escrever seus próprios scripts paraMacaco Grease(Firefox) ouMacaco Tamper(Cromada)

Para o exemplo que você mencionou, este UserScript Tampermonkey definirá todos os links JavaScript nos resultados da pesquisa para abrir em uma nova guia/janela (isso depende da configuração do navegador, são guias para mim).

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

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

Embora você possa escrever versões mais genéricas disso, será difícil ativar essa funcionalidade para todos os links JavaScript sem interromper outras usabilidades.

Um caminho intermediário poderia ser definir um manipulador de eventos para Ctrl, que definirá temporariamente o destino de TODOS os formulários como "_blank" enquanto a chave for mantida.

Responder3

Aqui está outro userscript, que envolve qualquer elemento com um onclick="document.location='some_url'"atributo em um <a href=some_url>elemento e remove a extensão onclick.

Eu escrevi para um site específico, mas é genérico o suficiente para ser útil para outros. Não se esqueça de mudar o@corresponderURL abaixo.

Isso funciona quando os links são carregados por uma chamada AJAX, daí o 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);
})();

informação relacionada