Làm cách nào để mở các liên kết javascript cứng đầu trong một tab mới hoặc cửa sổ mới?


17

Một số trang web sử dụng siêu liên kết "sáng tạo" (javascript?) Phá vỡ chức năng của trình duyệt, chẳng hạn như khả năng ctrl + nhấp chuột hoặc liên kết nhấp chuột giữa để mở chúng trong tab mới.

Một ví dụ phổ biến, các trang web nhân sự taleo http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9

Bất kể tôi cố gắng gì, tôi chỉ có thể theo liên kết bằng cách nhấp vào chúng bình thường; Tôi không thể mở chúng trong một cửa sổ mới. Có cách nào để khắc phục điều này?


Có, href được đặt thành # và JS được gọi trong sự kiện liên kết onclick (trang web không hoạt động với JS bị vô hiệu hóa). Có lẽ có một số loại plugin trình duyệt có thể đối phó với điều này.
Karan

4
Có một yêu cầu cho một giải pháp trong Bugzilla của Mozilla: Bug 55696 - "Buộc liên kết JavaScript phải mở trong cửa sổ mới hoặc tab mới" .
pabouk

Vâng, tôi luôn nghĩ điều này là vô cùng ngớ ngẩn
Gigala

Câu trả lời:


3

Câu hỏi của bạn là dành riêng cho Taleo, vì vậy câu trả lời của tôi cũng sẽ như vậy :)

Tôi đã mã hóa một UserScript thực hiện những gì bạn muốn: nó thay thế tất cả các liên kết JavaScript bằng các liên kết thông thường, vì vậy bạn chỉ cần nhấp vào chúng hoặc mở chúng trong một tab mới nếu bạn muốn.

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

Bạn có thể tìm thấy nó ở đây: https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js


2

Đúng. Bạn có thể viết tập lệnh của riêng mình cho Greasemonkey (Firefox) hoặc Tampermonkey (Chrome)

Đối với ví dụ bạn đã đề cập, Tampermonkey UserScript này sẽ đặt tất cả các liên kết JavaScript trong kết quả tìm kiếm để mở trong tab / cửa sổ mới (điều này phụ thuộc vào cấu hình trình duyệt, đó là tab đối với tôi).

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

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

Mặc dù bạn có thể viết các phiên bản chung hơn về điều này, nhưng việc kích hoạt chức năng này cho tất cả các liên kết JavaScript mà không phá vỡ khả năng sử dụng khác sẽ khó khăn.

Một đường giữa có thể được đặt để xử lý sự kiện Ctrl, điều đó sẽ tạm thời đặt mục tiêu cho TẤT CẢ các biểu mẫu thành "_blank" miễn là khóa được giữ.


1

Đây là một usercript khác, bao bọc bất kỳ phần tử nào với một onclick="document.location='some_url'"thuộc tính trong một <a href=some_url>phần tử và loại bỏ phần tử onclick.

Tôi đã viết nó cho một trang web cụ thể, nhưng nó đủ chung chung để nó có thể hữu ích cho những người khác. Đừng quên thay đổi URL @match bên dưới.

Điều này hoạt động khi các liên kết được tải bởi một cuộc gọi AJAX, do đó là MutingObserver.

// ==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);
})();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.