15

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

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

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

3 ответа3

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

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", пока удерживается клавиша.

0

Вот еще один пользовательский скрипт, который оборачивает любой элемент с атрибутом 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);
})();

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .