-
Notifications
You must be signed in to change notification settings - Fork 6
/
main.js
251 lines (209 loc) · 8.51 KB
/
main.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
!function () {
//1. 初始化变量
var startHash = init();
var keys = startHash.keys;
var hash = startHash.hash;
//2. 生成键盘
generaetKeyboard(keys, hash);
//3. 监听用户按键盘
listenTiUser(hash);
//3.2 百度和谷歌的搜索框
createSearch()
//4. 优化代码的函数
function getFromLocalStorage(name) {
return JSON.parse(localStorage.getItem(name) || 'null');
}
function tag(tagename) {
return document.createElement(tagename);
}
function createSpan(textContent) {
var span = tag("span");
span.textContent = textContent;
span.className = "text";
return span;
}
function createButton(id) {
//每一个kbd里面加入button
var button = tag("button");
button.textContent = "编辑";
// 每一个button的id都是row[index2],即kbd里面的内容,以便区分
button.id = id;
//添加button点击事件
button.addEventListener('click', function (jfglkhj) {
//☆☆☆☆这里不能用this,也不能用buttonxx,因为buttonxx只是一个容器,每一次循环,里面放的东西都不一样
// 最后他里面放的东西是最后那个createElement("button").所以不行
//例如
// console.log(button);
// 不管按那个键,所有的打印出来的都是最后一个button
//解决方法:使用 jfglkhj.target ,指的就是当前完整元素.
// 例如:
// console.log(jfglkhj);
//console.log(jfglkhj.target);
// console.log(jfglkhj.target.id);
var key = jfglkhj.target.id;//比如说v
//或者jfglkhj['target']['id'];
var x = prompt('给我一个网址');//比如说mtt.com
hash[key] = x;//赋值
var button2 = jfglkhj.target;
var img2 = button2.previousSibling;
img2.src = 'http://' + x + '/favicon.ico';
img2.onerror = function (ev) {
ev.target.src = './point.png';
};
// 问题:刷新之后编辑的网址没有了
// 解决方法:使用localStorage,只要变就备份,只要刷新就覆盖
//如果hash变更,只要编辑了,我就存
localStorage.setItem("zzz", JSON.stringify(hash));//JSON.stringify(hash)把hash变成字符串,存到zzz变量里备份
//上面这句代码的作用:localStorage里有很多桶,吧hash存到zzz这个桶里
//每一次编辑,就把新的hash存到 浏览器里
//然后把这个浏览器里的hash覆盖原来的就可以了
//熟悉原理:一变更就存档
//每次点击编辑后,就把图标换一下
//阻止事件冒泡
event.stopPropagation();
})
return button;
}
function createImg(domain) {
var img = tag("img");
if (domain) {//判断这个是否存在
img.src = 'http://' + domain + '/favicon.ico';
//加http协议,不然会认为是路径
} else {//undefined
//如果src为空,就会进入当前的网址,导致图片显现不出来,所以给他一个存在的图片
img.src = './point.png';
}
img.onerror = function (ev) {
//onerror事件,监听img的get请求错误事件
ev.target.src = './point.png';
//把没有请求到的错误事件的src定为那个点
};
return img;
}
function init() {
var keys = {
'0': { 0: 'q', 1: 'w', 2: 'e', 3: 'r', 4: 't', 5: 'y', 6: 'u', 7: 'i', 8: 'o', 9: 'p', length: 10 },
'1': ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'],
'2': ['z', 'x', 'c', 'v', 'b', 'n', 'm'],
'length': 3
};
var hash = {
'q': 'qq.com',
'w': 'weibo.com',
'e': 'ele.me',
'r': 'bilibili.com',
't': 'taobao.com',
'y': 'juejin.im',
'u': 'blog.csdn.net',
'i': 'iciba.com',
'o': 'bing.com',
'p': 'bilibili.com',
'a': 'aliyun.com',
's': 'segmentfault.com',
'd': 'www.sohu.com',
'f': 'www.qq.com',
'g': 'google.com',
'h': undefined,
'j': 'jianshu.com',
'k': undefined,
'l': 'baidu.com',
'z': 'zhihu.com',
'x': 'xiedaimala.com',
'c': undefined,
'v': undefined,
'b': 'bilibili.com',
'n': 'iqiyi.com',
'm': 'meituan.com'
};
//把localStorage里hash,zzz拿出来
var hashINLocalStorage = getFromLocalStorage('zzz');
if (hashINLocalStorage) { //如果hashINLocalStorage不为空,第二次刷新就不为空了.
hash = hashINLocalStorage;//覆盖hash
}
return {
'keys': keys,
'hash': hash
}
}
function generaetKeyboard(keys, hash) {
//遍历keys,生成kbd标签
for (var index = 0; index < keys['length']; index++) {
var div = tag('div');
var main = document.getElementById('mainxxxx');
main.appendChild(div);
var row = keys[index];
for (var index2 = 0; index2 < row.length; index2++) {
var span = createSpan(row[index2]);
var button = createButton(row[index2]);
var img = createImg(hash[row[index2]]);
var kbd = tag("kbd");
kbd.className = 'kbd';
if (hash[row[index2]] === undefined) {
kbd.setAttribute('title', '未设置网站导航')
} else {
kbd.setAttribute('title', hash[row[index2]])
}
kbd.onclick = function (e) {
var website = e.currentTarget.getAttribute('title');
if (website === '未设置网站导航') {
alert('请编辑此按键的网站再跳转')
} else {
window.open('http://' + website, "_blank");
}
}
var kbd_wrapper = tag("div");
kbd_wrapper.className = 'kbd_wrapper';
kbd.appendChild(span);
kbd.appendChild(img);
kbd.appendChild(button);
kbd_wrapper.appendChild(kbd);
div.appendChild(kbd_wrapper);
}
}
}
function listenTiUser(hash) {
document.onkeypress = function (sjdhfakdhjlsdka) {
let searchInput = document.querySelector('#searchInput')
if (!searchInput.getAttribute('alreadyFocus')) {//如果input没有聚焦
//sjdhfakdhjlsdka这个参数 包含你想要知道的所有信息,是一个hash
var key = sjdhfakdhjlsdka['key'];//得到用户的键
var website = hash[key];//获取网站地址
// location.href = 'http://'+website;//将键变成新的网站的地址
//location.href当前地址栏.地址
//
if (website === undefined) {
alert('请编辑此按键的网站再跳转')
} else {
window.open('http://' + website, "_blank");
}
//window.open 窗口.打开 "_blank"新窗口打开.
}
};
}
function createSearch(){
var searchInput = document.querySelector('#searchInput')
searchInput.addEventListener('focus', (e) => {
searchInput.setAttribute("alreadyFocus", true)
})
searchInput.addEventListener('blur', (e) => {
// e.target
searchInput.removeAttribute("alreadyFocus")
console.log(searchInput.value)
})
var buttonArr = document.querySelectorAll('.search .button')
buttonArr.forEach(function (button) {
button.addEventListener('click', (e) => {
let inputValue = searchInput.value
switch (e.currentTarget.getAttribute('searchEngine')) {
case 'baidu': window.open(`https://www.baidu.com/s?wd=${inputValue}`)
break;
case "google": window.open(`https://www.google.com/search?q=${inputValue}`)
break;
case "bing": window.open(`https://www.bing.com/search?q=${inputValue}`)
break;
default: ;
}
}, true)
})
}
}()