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