Firefox
Up one level2008/01/27
左ダブルクリックでリンク先をバックグラウンドのタブで開くuserChrome.js
nさんが、こういう操作をしていて使いやすそうに感じたので、userChrome.js用の拡張として作ってみました。
リンクを左ダブルクリックすると、そのリンクをバックグラウンドの新規タブで開きます。 200ms以内に二回目のクリックがなければ、同じタブでそのリンクを開きます。
作りが結構適当なので、もし使ってみようと思う方は、注意して使ってください。 (いくつかの不具合を確認しています)
(function() {
var gTimer = null;
function findLink(element) {
switch (element.tagName) {
case 'A': return element;
case 'B': case 'I': case 'SPAN': case 'SMALL':
case 'STRONG': case 'EM': case 'BIG': case 'SUB':
case 'SUP': case 'IMG': case 'S':
var parent = element.parentNode;
return parent && findLink(parent);
default:
return null;
}
}
function click(element, view) {
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click', true, true, view, 0,
0, 0, 0, 0, false, false, false, false, 0, element);
return !element.dispatchEvent(e);
}
function openTab(href) {
if ('TreeStyleTabService' in window)
TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab, false);
return gBrowser.addTab(href);
}
function findFrames(frame) {
var frames = frame.frames;
var fs = {};
for (var i = 0, len = frames.length; i < len; ++i) {
var f = frames[i];
fs[f.name] = f;
var children = findFrames(f);
for (k in children) {
var f = children[k];
fs[f.name] = f;
}
}
return fs;
}
function followLink(args) {
var link = args.link;
var newTab = args.newTab;
var window = args.window;
var activate = args.activate;
var href = link.href;
var target = link.target;
if (newTab) {
var tab = openTab(href);
if (activate) {
gBrowser.selectedTab = tab;
}
} else if (!target || target == '_self') {
window.location.href = href;
} else {
switch (target) {
case '_top':
window.top.location.href = href;
break;
case '_parent':
window.parent.location.href = href;
break;
case '_blank':
gBrowser.selectedTab = openTab(href);
break;
default:
var frames = findFrames(window.top);
var frame = frames[target];
if (frame) {
frame.location.href = href;
} else {
gBrowser.selectedTab = openTab(href);
}
}
}
}
gBrowser.mPanelContainer.addEventListener('click', function(e) {
if (e.button == 0 && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
var link = findLink(e.target);
if (link) {
var href = link.href;
if (href && href.match(/^(https?|ftp):\/\//)) {
e.preventDefault();
e.stopPropagation();
if (!gTimer) {
gTimer = setTimeout(function() {
try {
if (click(link, e.view)) {
followLink({ link: link, window: e.view, newTab: false });
}
clearTimeout(gTimer);
} finally {
gTimer = null;
}
}, 200);
}
}
}
}
}, false);
gBrowser.mPanelContainer.addEventListener('dblclick', function(e) {
if (gTimer) {
try {
clearTimeout(gTimer);
var link = findLink(e.target);
if (link) {
var href = link.href;
if (href.match(/^(https?|ftp):\/\//) && click(link, e.view)) {
followLink({ link: link, window: e.view, newTab: true, activate: false });
}
}
} finally {
gTimer = null;
}
}
}, false);
})();
- Category(s)
- Firefox
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/mizyo/5de630eb30af30ea30c330af30ea30f330af5148309230c330af30e930a630f3306e30bf958b304fuserchrome.js/tbping