Як відкрити вперті посилання javascript у новій вкладці чи новому вікні?


17

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

Поширений приклад, веб-сайти taleo HR http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Незалежно від того, що я намагаюся, я можу переслідувати посилання лише натискаючи на них нормально; Я не можу відкрити їх у новому вікні. Чи є спосіб обходити це?


Так, href встановлено на #, а JS викликається при події onclick посилань (сайт не працює з відключеним JS). Можливо, є якийсь плагін браузера, який може вирішити це.
Каран


Так, я завжди думав, що це надзвичайно нерозумно
Gigala

дивіться також: superuser.com/questions/854797/…
braham-snyder

Відповіді:


3

Ваше питання стосується Taleo, тому моя відповідь буде занадто :)

Я зашифрував UserScript, який робить все, що ви хочете: він замінює всі посилання 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 UserScript встановить усі посилання 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", поки утримується ключ.


1

Ось ще один сценарій користувача, який обертає будь-який елемент з onclick="document.location='some_url'"атрибутом в <a href=some_url>елементі та видаляє onclick.

Я написав це для конкретного сайту, але це досить загальне, щоб воно могло бути корисним іншим. Не забудьте змінити @match 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);
})();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.