一部のWebサイトでは、「クリエイティブ」(JavaScript?)ハイパーリンクを使用しています。これは、Ctrlキーを押しながらクリックするリンクやミドルクリックしてリンクを新しいタブで開く機能など、ブラウザの機能を破壊します。
一般的な例、taleo HR Webサイト http://www.rogers.com/web/Careers.portal?_nfpb=true&_pageLabel=C_CP&_page=9
何を試しても、通常はリンクをクリックするだけでリンクをたどることができます。新しいウィンドウで開くことができません。これを回避する方法はありますか?
あなたの質問はタレオに固有なので、私の答えも次のようになります:)
私はあなたが望むことをするUserScriptをコーディングしました:それはすべての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 UserScriptは、検索結果のすべての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
を削除する別のユーザースクリプトを示します。
特定のサイト用に作成しましたが、他の人に役立つかもしれないほど一般的です。以下の@ match 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);
})();