Как открыть упрямые ссылки JavaScript в новой вкладке или новом окне?

Как открыть упрямые ссылки JavaScript в новой вкладке или новом окне?

Некоторые веб-сайты используют «креативные» (javascript?) гиперссылки, которые нарушают функциональность браузера, например, возможность открывать ссылки в новой вкладке с помощью нажатия клавиши Ctrl+щелчок или средней кнопки мыши.

Типичный пример — сайты Taleo HR. http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Что бы я ни пытался, я могу только переходить по ссылкам, нажимая на них обычным образом; я не могу открыть их в новом окне. Есть ли способ обойти это?

решение1

Ваш вопрос касается конкретно Талео, поэтому мой ответ будет таким же :)

Я написал пользовательский скрипт, который делает то, что вам нужно: он заменяет все ссылки JavaScript обычными ссылками, так что вы можете просто щелкнуть по ним или открыть их в новой вкладке, если хотите.

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

Вы можете найти это здесь:https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

решение2

Да. Вы можете написать свои собственные сценарии дляГрязная обезьяна(Firefox) илиTampermonkey(Хром)

В примере, который вы упомянули, этот пользовательский скрипт Tampermonkey настроит открытие всех ссылок JavaScript в результатах поиска в новой вкладке/окне (это зависит от настроек браузера, у меня это вкладки).

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

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

Хотя вы можете написать более общие версии, включить эту функциональность для всех ссылок JavaScript, не нарушив при этом удобство использования, будет сложно.

Промежуточным путем может быть установка обработчика событий для Ctrl, который временно установит цель для ВСЕХ форм на «_blank» до тех пор, пока удерживается клавиша.

решение3

Вот еще один пользовательский скрипт, который оборачивает любой элемент с onclick="document.location='some_url'"атрибутом в <a href=some_url>элемент и удаляет onclick.

Я написал это для определенного сайта, но это достаточно общее, чтобы быть полезным и другим. Не забудьте изменить@соответствоватьURL-адрес ниже.

Это работает, когда ссылки загружаются с помощью вызова AJAX, отсюда и 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);
})();

Связанный контент