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

17

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

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

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

cloneman
источник
Да, для href установлено значение # и JS вызывается при событии ссылок onclick (сайт не работает с отключенным JS). Возможно, есть какой-то плагин для браузера, который может справиться с этим.
Каран
Да, я всегда думал, что это очень глупо
Гигала
см. также: superuser.com/questions/854797/…
braham-snyder

Ответы:

3

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

Я написал код пользователя, который делает то, что вы хотите: он заменяет все ссылки 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

raphaelh
источник
2

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

В приведенном выше примере пользовательский код 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», пока удерживается клавиша.

Squeezy
источник
1

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

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

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