forked from ywzhaiqi/userChromeJS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
moveButton.uc.js
140 lines (116 loc) · 4.77 KB
/
moveButton.uc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// ==UserScript==
// @name moveButton.uc.js
// @description 移动或克隆按钮/菜单到任意位置
// @author ywzhaiqi
// @namespace [email protected]
// @include main
// @charset UTF-8
// @version 0.0.2
// @note 2013/06/03 ver0.0.3 改进一些情况下无法移动的问题。
// @note 2013/05/22 ver0.0.2,新增参数 clone: true(克隆按钮/菜单,原来的保留)
// @note 2013/05/21 初始版本
// ==/UserScript==
/*
功能:移动或克隆按钮/菜单到任意位置
建议只移动不可移动的按钮。如果移动后位置不正确可能用css固定了,如果移动后出现空白
填写的 buttons 说明
id: 要移动的按钮/菜单的 Id
示例1: 移动 "翻译按钮" 到 "scriptish按钮" 的前面
{ id: "translatorButton", insertBefore: "scriptish-button" },
示例2: 移动 "翻译按钮" 到 "scriptish按钮" 的后面
{ id: "translatorButton", insertAfter: "scriptish-button" },
示例3: 移动 "翻译按钮" 到 "附加组件栏" 的第一个位置
{ id: "translatorButton", bar: "addon-bar", pos: 1 }
示例4:移动 "翻译按钮" 到 原来的第一个位置。(不推荐,建议用css调整)
{ id: "translatorButton", pos: 1 }
示例5:移动 "工具菜单" 到 系统按钮弹出的菜单 "选项" 的下面。
{ id: "tools-menu", insertAfter: "appmenu_customize"}
示例6:克隆 "工具菜单" 到 系统按钮弹出的菜单 "选项" 的下面。
{ id: "tools-menu", insertAfter: "appmenu_customize", clone: true }
参考的工具栏或按钮的Id:
nav-bar(导航工具栏)
unified-back-forward-button(前进后退按钮)
urlbar-container(整个地址栏)
urlbar-icons(地址栏图标,如地址栏下拉按钮、刷新按钮等,uc脚本一般插入的位置)
search-container(整个搜索栏)
home-button(主页按钮)
PersonalToolbar(书签栏)
personal-bookmarks(书签栏中书签部分)
addon-bar(附加组件栏)
status-bar(状态栏,在附加组件栏中,按钮为不可移动)
主要参考了 addMenu.uc.js 和 rebuild_userChrome.uc.xul
*/
(function(){
var moveButton = {
buttons:[
// { id: "autoReaderButton", bar: "PersonalToolbar", pos: 1 },
// { id: "translatorButton", insertAfter: "jsoff-statusbar" },
// { id: "ScrapBookStatusPanel", insertBefore: "scriptish-button" },
],
interval: 200, // 0.2秒间隔
maxcount: 100, // 最大100回,至少 interval * maxcount 秒
count: 0,
timer: null,
init: function(){
setTimeout(function(self){
self.run();
}, 100, this);
},
uninit: function(){
},
handleEvent: function(e){
switch (e.type){
case "beforecustomization":
break;
case "aftercustomization":
break;
}
},
run: function(){
this.timer = setInterval(function(self) {
if (++self.count > self.maxcount || self.move())
clearInterval(self.timer);
}, this.interval, this);
},
move: function(){
var i = 0;
while (i < this.buttons.length){
var info = this.buttons[i];
var button = $(info.id);
if(button){
if(info.clone === true){
button = button.cloneNode(true);
}
let ins;
if (info.insertBefore && (ins = $(info.insertBefore))){
ins.parentNode.insertBefore(button, ins);
this.buttons.splice(i, 1);
continue;
}
if (info.insertAfter && (ins = $(info.insertAfter))){
ins.parentNode.insertBefore(button, ins.nextSibling);
this.buttons.splice(i, 1);
continue;
}
if (info.pos && (parseInt(info.pos, 10) > 0)){
let bar = $(info.bar) || button.parentNode;
ins = bar.children[parseInt(info.pos, 10) - 1];
if(ins){
bar.insertBefore(button, ins);
}else{
bar.appendChild(button);
}
this.buttons.splice(i, 1);
continue;
}
}
i++;
}
return this.buttons.length === 0 ? true : false;
}
};
moveButton.init();
function debug() { content.console.log(arguments); }
function $(id) { return document.getElementById(id); }
function $A(args) { return Array.prototype.slice(args); }
})();