Open links in current tab

Open links in current tab regardless of _target or site's preferences. Ctrl-click: background tab, Ctrl-Shift-click: foreground tab, Shift-click: new window, Alt-click: force open in current tab

目前为 2016-09-22 提交的版本。查看 最新版本

// ==UserScript==
// @name          Open links in current tab
// @author        wOxxOm
// @description   Open links in current tab regardless of _target or site's preferences. Ctrl-click: background tab, Ctrl-Shift-click: foreground tab, Shift-click: new window, Alt-click: force open in current tab
// @namespace     http://target._blank.is.retarded
// @version       2.1.1
// @include       *
// @run-at        document-start
// @grant         GM_openInTab
// ==/UserScript==

var suppressing;
window.addEventListener('mouseup', function(e) {
	if (e.button > 1)
		return;
	var link = e.target.closest('a');
	if (!link || (link.getAttribute('href') || '').match(/^(javascript|#|$)/))
		return;
	var b = e.button, c = e.ctrlKey, a = e.altKey, s = e.shiftKey, m = e.metaKey;
	if (!a && link.target != '_blank') {
		var observer = new MutationObserver(function(mutations) {
			if (link.target == '_blank') {
				link.removeAttribute('target');
				console.log('[Open links in current tab] prevented dynamic target=_blank for', link.href);
			}
		});
		observer.observe(link, {attributes:true, attributeFilter:['target'], characterData:true});

		var _open = unsafeWindow.open;
		var timeout = setTimeout(function() {
			unsafeWindow.open = _open;
			observer.disconnect();
		}, 50);
		unsafeWindow.open = exportFunction(function(url, name, features) {
			if (!features) {
				console.log('[Open links in current tab] prevented window.open for', url);
				location.href = link.href;
			} else
				_open(url, name, features);
			unsafeWindow.open = _open;
			clearTimeout(timeout);
		}, unsafeWindow);
		return;
	}
	if (!b && !c && !s && !m && (link.href.replace(/#.*/, '') != location.href.replace(/#.*/, '') || a))
		location.href = link.href;
	else if (b == 1 || c && !a && !m)
		GM_openInTab(link.href, !s);
	else if (window.chrome && !b && s && !c && !a && !m)
		link.cloneNode().dispatchEvent(new MouseEvent('click', {shiftKey: true}));
	else
		return;
	suppressing = true;
	prevent(e);
}, true);

window.addEventListener('click', prevent, true);
window.addEventListener('auxclick', prevent, true);

function prevent(e) {
	if (!suppressing)
		return;
	e.preventDefault();
	e.stopPropagation();
	e.stopImmediatePropagation();
	setTimeout(function() {
		suppressing = false;
	}, 50);
}