1 // 当前公用函数
2
3 // 获取非行间样式
4 function getStyle(ele, attr) {
5 // ele: 元素
6 // attr: 属性
7 var w = 0;
8 if (ele.currentStyle) {
9 // ie678
10 // console.log(ele.currentStyle[attr]); // 200px
11 w = ele.currentStyle[attr];
12 } else {
13 // 标准
14 // console.log(getComputedStyle(ele)[attr]); // 200px
15 w = getComputedStyle(ele)[attr];
16 }
17 return w;
18 }
19
20 // 运动函数
21 var timer = null;
22 function move(ele, attr, step, target) {
23 // ele: 元素
24 // attr: 属性
25 // step: 每一步的像素
26 // target: 目标值
27 // 8. 清除定时器
28 clearInterval(timer);
29
30 // 9. 判断当前起始值 和 目标值的关系
31 /*
32 起始值 目标值
33 0 100 正数
34 100 0 负数
35 */
36 // 获取起始值 和 目标值(target)
37 var start = parseInt(getStyle(ele, attr));
38
39 step = start > target ? -step : step;
40
41 // 6. 点击一次 让div 逐渐减小到0 500开始不间断的一直减小 直到0为止
42 timer = setInterval(function () {
43 // 3. 获取当前值
44 var cur = parseInt(getStyle(ele, attr));
45 // 4. 计算结束值 a - 10 === a + (-10)
46 var end = cur + step;
47
48 // 7. 判断 ele 的left是不是到达0
49 if (step < 0 && end <= target || step > 0 && end >= target) {
50 end = target;
51 // 8. 清除定时器
52 clearInterval(timer);
53 }
54
55 // 5. 赋值给ele的left
56 ele.style[attr] = end + 'px';
57 }, 20);
58 }
59
60 // 获取验证码
61 // 0-9 a-z 没有传string string当前值是undefined
62 function getCode(len, string) {
63 // len: 验证码的长度
64 // string: 可传可不传
65 if (!string) {
66 var str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
67 } else {
68 var str = string;
69 }
70 // 有一个变量存储 随机验证码
71 var strNew = '';
72 // 每一次都要生成一个随机数
73 for (var i = 0; i < len; i++) {
74 // str中选出随机的字符---随机下标
75 var num = Math.floor(Math.random() * str.length);
76 // console.log(num, str[num]);
77 strNew += str[num];
78 }
79 return strNew;
80 }
81
82 // 将小于10的数字变成2位数
83 function toTwo(num) { // num = 1
84 num = num < 10 ? '0' + num : num;
85 return num;
86 }
87
88 // 不重复随机验证码
89 // 0-9 a-z 没有传string string当前值是undefined
90 function getNoRCode(len, string) {
91 // len: 验证码的长度
92 // string: 可传可不传
93 if (!string) {
94 var str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
95 } else {
96 var str = string;
97 }
98 // 有一个变量存储 随机验证码
99 var strNew = '';
100 // 每一次都要生成一个随机数
101 for (var i = 0; i < len; i++) {
102 // str中选出随机的字符---随机下标
103 var num = Math.floor(Math.random() * str.length);
104 // console.log(num, str[num]);
105 // strNew += str[num];
106 // 下标对应的字符 在新的字符串中有还是没有 没有的话 加进去 有的话本轮循环作废 i--
107 if (strNew.indexOf(str[num]) == -1) {
108 // 没有
109 strNew += str[num];
110 } else {
111 i--;
112 }
113 }
114 return strNew;
115 }
116
117 // 创建标签
118 function createE(ele, txt) {
119 // ele: 创建的标签
120 // txt: 标签中的内容
121 var td3 = document.createElement(ele);
122 td3.innerHTML = txt;
123 return td3;
124 }
125
126 // 去重数组
127 function qc(array) {
128 var na = [];
129 for (var i = 0; i < array.length; i++) {
130 if (na.indexOf(array[i]) == -1) {
131 na.push(array[i]);
132 }
133 }
134 // console.log(na);
135 return na;
136 }
137
138 // 事件绑定兼容
139 function addE(ele, type, fn) {
140 // ele: 元素
141 // type: 事件类型
142 // 用某个方法是否存在来作为判断条件
143 if (ele.addEventListener) {
144 // 标准
145 ele.addEventListener(type, fn, false);
146 } else {
147 // ie8
148 ele.attachEvent('on' + type, fn);
149 }
150 }
151
152 // 事件绑定取消
153 function removeE(ele, type, fn) {
154 if (ele.removeEventListener) {
155 ele.removeEventListener(type, fn, false);
156 } else {
157 ele.detachEvent('on' + type, fn);
158 }
159 }
160
161
162 // 封装判断滚轮方向的函数
163 function getD(evs) {
164 // evs: 事件对象
165 if (evs.wheelDelta) {
166 // chrome ie
167 return evs.wheelDelta > 0 ? '上' : '下';
168 } else {
169 // ff
170 return evs.detail > 0 ? '下' : '上';
171
172 }
173 }
174
175 // 拖拽函数
176 function drag(ele) {
177 // 按下div
178 ele.onmousedown = function (evs) {
179 // 添加全局捕获
180 if (ele.setCapture) {
181 ele.setCapture();
182 }
183 var ev = window.event || evs;
184 // 鼠标距离页面左侧的距离 元素距离页面左侧的距离
185 // console.log(ev.clientX, ele.offsetLeft);
186 // 求鼠标距离元素左侧的距离ml: 鼠标距离页面的距离cx1 - 元素距离页面左侧的距离ol
187 var ml = ev.clientX - ele.offsetLeft;
188 var mt = ev.clientY - ele.offsetTop;
189 // 移动事件
190 document.onmousemove = function (evs) {
191 // 移动过程中 求出移动的ele的left值: l = cx - ml
192 var ev = window.event || evs;
193 var l = ev.clientX - ml;
194 var t = ev.clientY - mt;
195
196 var maxw = document.documentElement.clientWidth - ele.offsetWidth;
197 var maxh = document.documentElement.clientHeight - ele.offsetHeight;
198 // 判断条件
199 if (l <= 0) {
200 l = 0;
201 }
202 if (t <= 0) {
203 t = 0;
204 }
205 if (l >= maxw) {
206 l = maxw;
207 }
208 if (t >= maxh) {
209 t = maxh;
210 }
211 ele.style.left = l + 'px';
212 ele.style.top = t + 'px';
213 }
214 // 抬起清除移动事件
215 document.onmouseup = function () {
216 document.onmousemove = null;
217 if (ele.releaseCapture) {
218 ele.releaseCapture();
219 }
220 }
221
222 return false;
223 }
224 }
225
226 // 缓冲运动函数
227 function buffMove(ele, json, fn) {
228 clearInterval(ele.wc);
229 ele.wc = setInterval(function () {
230 var tag = true; // true---表示已经到达目标值 false--表示没到
231 // 获取每一个属性 for-in
232 for (var key in json) {
233 // 基于当前的数据 改变一次
234 // 获取当前属性的当前值
235 var l = getStyle(ele, key);
236 if (key == 'opacity') {
237 l = l * 100;
238 } else {
239 l = parseInt(l);
240 }
241 // console.log(l);
242
243 var speed = (json[key] - l) / 20;
244 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
245 var end = l + speed;
246 if (end != json[key]) {
247 tag = false;
248 }
249 if (key == 'opacity') {
250 ele.style[key] = end / 100;
251 } else {
252 // 4. 赋值给ele
253 ele.style[key] = end + 'px';
254 }
255 }
256 // 如果for循环走完 tag还是true 表示假设成立 到达目标值 如果是false 表示没有到达目标
257 if (tag) {
258 // 清除定时器
259 clearInterval(ele.wc);
260 // 表示第一个动画执行结束
261 console.log(fn);
262 fn && fn();
263 }
264 }, 20);
265 }
266
267 // 面向对象的选项卡
268 function Tab(id) {
269 this.id = id;
270 this.btns = null;
271 this.ps = null;
272
273 var cont = document.getElementById(this.id);
274 this.btns = cont.getElementsByTagName('button');
275 this.ps = cont.getElementsByTagName('p');
276 var that = this;
277 // 添加 每个按钮
278 for (var i = 0; i < this.btns.length; i++) {
279 this.btns[i].index = i;
280 // this.btns[i].onclick = this.tip;
281 this.btns[i].onclick = function () {
282 that.tip(this.index);
283 };
284 }
285 }
286
287 Tab.prototype.tip = function (ind) {
288 // 显示对应的内容盒子 盒子和按钮的关系 下标相同
289 for (var j = 0; j < this.ps.length; j++) {
290 this.ps[j].className = '';
291 }
292 this.ps[ind].className = 'active';
293 }
294
295 // ajax请求数据
296 function ajax(type, url, data, fn) {
297 // type: 请求方式 get post
298 // url: 请求地址
299 // data: 请求参数
300 // fn: ajax请求成功后的执行的函数
301 var ajax = new XMLHttpRequest();
302
303 if (type == 'post') {
304 // post
305 // 建立连接
306 ajax.open(type, url, true);
307 // 设置请求头
308 ajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=utf-8');
309 // 发送请求
310 ajax.send(data);
311 } else {
312 // get
313 ajax.open(type, url + '?' + data, true);
314 // 3. 发送请求
315 ajax.send();
316 }
317
318 // 监听事件
319 ajax.onreadystatechange = function () {
320 if (ajax.readyState == 4 && ajax.status == 200) {
321 fn(ajax.response); // 传实参
322 }
323 }
324 }