Celeb Glow
news | March 09, 2026

How to open stubborn javascript links in a new tab or new window?

Some websites use "creative" (javascript?) hyperlinks which break browser functionality, such as the ability to ctrl+click or middle click links to open them in a new tab.

A common example, taleo HR websites

No matter what I try, I can only follow links by clicking on them normally; I can't open them in a new window. Is there any way around this?

4

3 Answers

Your question is specific to Taleo, so my answer will be too :)

I've coded a UserScript that does what you want: it replaces all the JavaScript links with normal links, so you can just click them or open them in a new tab if you want.

// ==UserScript==
// @name Taleo Fix
// @namespace
// @description Taleo Fix Links
// @include
// @include
// @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(); };
}

You can find it here:

Yes. You can write your own scripts for Greasemonkey (Firefox) or Tampermonkey (Chrome)

For the example you mentioned, this Tampermonkey UserScript will set all JavaScript links in the search results to open in new tab / window (this depends on browser configuration, it's tabs for me).

// ==UserScript==
// @name open links in tabs
// @match
// ==/UserScript==
document.getElementById('ftlform').target="_blank"

Though you can write more generic versions of this, enabling this functionality for all JavaScript links without breaking other usability will be hard.

A middlepath could be to set an event handler for Ctrl, that will temporarily set the target for ALL forms to "_blank" as long as the key is held.

Here's another userscript, which wraps any element with an onclick="document.location='some_url'" attribute in an <a href=some_url> element and removes the onclick.

I wrote it for a specific site, but it's generic enough that it may be useful to others. Don't forget to change the @match URL below.

This works when the links are loaded by an AJAX call, hence the MutationObserver.

// ==UserScript==
// @name JavaScript link fixer
// @version 0.1
// @description Change JavaScript links to open in new tab/window
// @author EM0
// @match
// @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);
})();

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy