Bagaimana cara membuka tautan javascript yang membandel di tab baru atau jendela baru?

17

Beberapa situs web menggunakan hyperlink "kreatif" (javascript?) Yang memecah fungsionalitas browser, seperti kemampuan untuk ctrl + klik atau tautan klik tengah untuk membukanya di tab baru.

Contoh umum, situs web HR taleo http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Apa pun yang saya coba, saya hanya dapat mengikuti tautan dengan mengkliknya secara normal; Saya tidak bisa membukanya di jendela baru. Apakah ada cara untuk mengatasi ini?

cloneman
sumber
Ya, href diatur ke # dan JS dipanggil pada acara tautan klik (situs tidak berfungsi dengan JS dinonaktifkan). Mungkin ada semacam plugin browser yang dapat menangani hal ini.
Karan
4
Ada permintaan untuk solusi di Bugzilla Mozilla: Bug 55696 - "Paksa tautan JavaScript untuk membuka di jendela baru atau tab baru" .
pabouk
Ya saya selalu berpikir ini sangat konyol
Gigala
lihat juga: superuser.com/questions/854797/…
braham-snyder

Jawaban:

3

Pertanyaan Anda khusus untuk Taleo, jadi jawaban saya juga :)

Saya telah mengode UserScript yang melakukan apa yang Anda inginkan: itu menggantikan semua tautan JavaScript dengan tautan normal, jadi Anda bisa mengkliknya atau membukanya di tab baru jika Anda mau.

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

Anda dapat menemukannya di sini: https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js

raphaelh
sumber
2

Iya. Anda dapat menulis skrip sendiri untuk Greasemonkey (Firefox) atau Tampermonkey (Chrome)

Sebagai contoh yang Anda sebutkan, UserScript Tampermonkey ini akan mengatur semua tautan JavaScript di hasil pencarian untuk dibuka di tab / jendela baru (ini tergantung pada konfigurasi browser, itu tab untuk saya).

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

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

Meskipun Anda dapat menulis lebih banyak versi generiknya, mengaktifkan fungsi ini untuk semua tautan JavaScript tanpa merusak kegunaan lain akan sulit.

Sebuah middlepath mungkin untuk mengatur event handler Ctrl, yang untuk sementara akan menetapkan target untuk SEMUA formulir ke "_blank" selama kunci tersebut dipegang.

Terjepit
sumber
1

Berikut skrip pengguna lain, yang membungkus elemen apa pun dengan onclick="document.location='some_url'"atribut di dalam <a href=some_url>elemen dan menghapus onclick.

Saya menulisnya untuk situs tertentu, tetapi cukup umum sehingga mungkin bermanfaat bagi orang lain. Jangan lupa untuk mengubah @match URL di bawah ini.

Ini berfungsi ketika tautan dimuat oleh panggilan AJAX, karenanya 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
sumber