Некоторые веб-сайты используют «креативные» (javascript?) гиперссылки, которые нарушают функциональность браузера, например, возможность открывать ссылки в новой вкладке с помощью нажатия клавиши Ctrl+щелчок или средней кнопки мыши.
Типичный пример — сайты Taleo HR. http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9
Что бы я ни пытался, я могу только переходить по ссылкам, нажимая на них обычным образом; я не могу открыть их в новом окне. Есть ли способ обойти это?
решение1
Ваш вопрос касается конкретно Талео, поэтому мой ответ будет таким же :)
Я написал пользовательский скрипт, который делает то, что вам нужно: он заменяет все ссылки 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
Да. Вы можете написать свои собственные сценарии дляГрязная обезьяна(Firefox) илиTampermonkey(Хром)
В примере, который вы упомянули, этот пользовательский скрипт Tampermonkey настроит открытие всех ссылок 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» до тех пор, пока удерживается клавиша.
решение3
Вот еще один пользовательский скрипт, который оборачивает любой элемент с onclick="document.location='some_url'"
атрибутом в <a href=some_url>
элемент и удаляет onclick
.
Я написал это для определенного сайта, но это достаточно общее, чтобы быть полезным и другим. Не забудьте изменить@соответствовать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);
})();