Algunos sitios web utilizan hipervínculos "creativos" (¿javascript?) que interrumpen la funcionalidad del navegador, como la capacidad de presionar Ctrl+clic o hacer clic con el botón central en los enlaces para abrirlos en una nueva pestaña.
Un ejemplo común: los sitios web de recursos humanos de Taleo http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9
No importa lo que intente, sólo puedo seguir enlaces haciendo clic en ellos normalmente; No puedo abrirlos en una ventana nueva. ¿Hay alguna manera de evitar esto?
Respuesta1
Tu pregunta es específica de Taleo, por lo que mi respuesta también lo será :)
He codificado un UserScript que hace lo que quieres: reemplaza todos los enlaces de JavaScript con enlaces normales, por lo que puedes simplemente hacer clic en ellos o abrirlos en una nueva pestaña si lo deseas.
// ==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();
};
}
Lo puedes encontrar aquí:https://github.com/raphaelh/taleo_fix/blob/master/Taleo_Fix.user.js
Respuesta2
Sí. Puedes escribir tus propios guiones paramono graso(Firefox) oMono manipulador(Cromo)
Para el ejemplo que mencionaste, este UserScript de Tampermonkey configurará todos los enlaces de JavaScript en los resultados de búsqueda para que se abran en una nueva pestaña/ventana (esto depende de la configuración del navegador, para mí son pestañas).
// ==UserScript==
// @name open links in tabs
// @match http://rogers.taleo.net/careersection/technology/jobsearch.ftl*
// ==/UserScript==
document.getElementById('ftlform').target="_blank"
Aunque puede escribir versiones más genéricas de esto, será difícil habilitar esta funcionalidad para todos los enlaces de JavaScript sin alterar otras funciones de uso.
Una ruta intermedia podría ser establecer un controlador de eventos para Ctrl, que establecerá temporalmente el objetivo para TODOS los formularios en "_blank" mientras se mantenga presionada la tecla.
Respuesta3
Aquí hay otro script de usuario, que envuelve cualquier elemento con un onclick="document.location='some_url'"
atributo en un <a href=some_url>
elemento y elimina el archivo onclick
.
Lo escribí para un sitio específico, pero es lo suficientemente genérico como para que pueda resultar útil a otros. No olvides cambiar el@fósforoURL a continuación.
Esto funciona cuando los enlaces se cargan mediante una llamada AJAX, de ahí el 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);
})();