วิธีการเปิดลิงก์จาวาสคริปต์ที่ดื้อดึงในแท็บใหม่หรือหน้าต่างใหม่


17

บางเว็บไซต์ใช้ไฮเปอร์ลิงก์ "สร้างสรรค์" (javascript?) ซึ่งทำลายฟังก์ชันการทำงานของเบราว์เซอร์เช่นความสามารถในการ ctrl + คลิกหรือลิงก์คลิกกลางเพื่อเปิดในแท็บใหม่

ตัวอย่างทั่วไปเว็บไซต์ taleo HR http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

ไม่ว่าฉันจะพยายามทำอะไรฉันสามารถติดตามลิงค์ได้โดยคลิกที่ลิงก์ตามปกติ ฉันไม่สามารถเปิดได้ในหน้าต่างใหม่ มีวิธีใดบ้างไหม?


ใช่ href ถูกตั้งค่าเป็น # และ JS ถูกเรียกใช้ในเหตุการณ์ onclick ของลิงก์ (ไซต์ไม่ทำงานเมื่อปิดใช้งาน JS) อาจมีปลั๊กอินของเบราว์เซอร์บางประเภทที่สามารถจัดการกับสิ่งนี้ได้
Karan

4
มีการร้องขอสำหรับการแก้ปัญหาในของ Mozilla Bugzilla เป็น: Bug 55,696 - "การเชื่อมโยงกองทัพ JavaScript เพื่อเปิดในหน้าต่างใหม่หรือแท็บใหม่"
pabouk

ใช่ฉันคิดเสมอว่านี่มันโง่มาก
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 ทั้งหมดโดยไม่ทำลายการใช้งานอื่นจะยาก

middlepath สามารถตั้งค่าตัวจัดการเหตุการณ์สำหรับCtrlที่จะกำหนดเป้าหมายชั่วคราวสำหรับแบบฟอร์มทั้งหมดเป็น "_blank" ตราบใดที่คีย์ถูกเก็บไว้


1

นี่คือ UserScript อื่นซึ่ง wraps องค์ประกอบใด ๆ กับ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);
})();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.