İnatçı javascript bağlantıları yeni bir sekmede veya yeni bir pencerede nasıl açılır?


17

Bazı web siteleri, yeni bir sekmede açmak için ctrl + tıklama veya orta tıklama bağlantıları gibi tarayıcı işlevlerini bozan "yaratıcı" (javascript?) Köprüleri kullanır.

Yaygın bir örnek olarak, taleo HR web siteleri http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Ne denediğim önemli değil, sadece normal linklere tıklayarak linkleri takip edebiliyorum; Onları yeni bir pencerede açamıyorum. Bunun etrafında bir yol var mı?


Evet, href # olarak ayarlanmış ve bağlantıların onclick olayında JS çağrılmıştır (site, JS devre dışı bırakıldığında çalışmaz). Belki bununla başa çıkabilen bir çeşit tarayıcı eklentisi var.
Karan


Evet her zaman bunun son derece saçma olduğunu düşündüm
Gigala

Yanıtlar:


3

Sorunuz Taleo'ya özgü, bu yüzden cevabım da olacak :)

İstediğinizi yapan bir UserScript kodladım: tüm JavaScript bağlantılarını normal bağlantılarla değiştirdi, böylece onları tıklayabilir veya isterseniz yeni bir sekmede açabilirsiniz.

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

Burada bulabilirsiniz: https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js


2

Evet. Greasemonkey (Firefox) veya Tampermonkey (Chrome) için kendi komut dosyalarınızı yazabilirsiniz

Bahsettiğiniz örnek için bu Tampermonkey UserScript, arama sonuçlarındaki tüm JavaScript bağlantılarını yeni sekmede / pencerede açılacak şekilde ayarlayacaktır (bu tarayıcı yapılandırmasına bağlıdır, bu benim için sekmelerdir).

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

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

Bunun daha genel sürümlerini yazabilseniz de, bu işlevi diğer JavaScript bağlantılarında diğer kullanılabilirliği bozmadan etkinleştirmek zor olacaktır.

Orta yol, bir anahtar işlendiği Ctrlsürece TÜM formların hedefini geçici olarak "_blank" olarak ayarlayacak bir olay işleyicisi ayarlamak olabilir .


1

Burada, herhangi bir öğeyi onclick="document.location='some_url'"öznitelik içeren bir öğeye saran <a href=some_url>ve onclick.

Belirli bir site için yazdım, ancak başkaları için yararlı olabilecek kadar genel. Aşağıdaki eşleme URL'sini değiştirmeyi unutmayın .

Bu bağlantılar bir AJAX çağrısı, dolayısıyla MutationObserver tarafından yüklendiğinde çalışır.

// ==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);
})();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.