Skip to content

Commit 1839a30

Browse files
committed
看书练习备忘
1 parent c98d854 commit 1839a30

6 files changed

+259
-74
lines changed

memo/函数节流(延迟执行).html

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head lang="en">
4+
<meta charset="UTF-8">
5+
<title>函数节流(延迟执行)</title>
6+
</head>
7+
<body>
8+
<script>
9+
var throttle = function (fn, interval) {
10+
var __self = fn, // 保存需要被延迟执行的函数引用
11+
timer, // 定时器
12+
firstTime = true; // 是否是第一次调用
13+
14+
return function () {
15+
var args = arguments,
16+
__me = this;
17+
18+
if (firstTime) { // 如果是第一次调用,不需要延迟执行
19+
__self.apply(__me, arguments);
20+
return firstTime = false;
21+
}
22+
23+
if (timer) {
24+
return false;
25+
}
26+
27+
timer = setTimeout(function () { //延迟一段时间执行
28+
clearTimeout(timer);
29+
timer = null;
30+
__self.apply(__me, args);
31+
}, interval || 500)
32+
}
33+
};
34+
35+
window.onresize = throttle(function () {
36+
console.log(1);
37+
}, 500);
38+
</script>
39+
</body>
40+
</html>

memo/函数节流(延迟执行).js

Lines changed: 0 additions & 29 deletions
This file was deleted.

memo/分时函数.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head lang="en">
4+
<meta charset="UTF-8">
5+
<title>分时函数</title>
6+
</head>
7+
<body>
8+
<script>
9+
var timeChunk = function (ary, fn, count) { // 参数分别是:需处理的数据数组,处理数据的函数体,一次处理多少个
10+
11+
var obj, // 需处理的数组
12+
t; // 定时器
13+
14+
var len = ary.length;
15+
16+
var start = function () {
17+
for (var i = 0; i < Math.min(count || 1, ary.length); i++) { // 直到i被执行count个or执行完最后几个
18+
19+
// 每次拿一个值进行函数处理,并推出这个值.
20+
obj = ary.shift();
21+
fn(obj);
22+
}
23+
};
24+
25+
return function () {
26+
t = setInterval(function () {
27+
28+
// 没有要参数直接跳出
29+
if (len === 0) {
30+
return clearInterval(t);
31+
}
32+
33+
// 执行批量处理函数
34+
start();
35+
36+
}, 200);
37+
};
38+
39+
};
40+
41+
var ary = [];
42+
43+
for (var i = 1; i <= 1000; i++) {
44+
ary.push(i);
45+
}
46+
47+
var renderFriendList = timeChunk(ary, function (n) {
48+
var div = document.createElement('div');
49+
div.innerHTML = n;
50+
document.body.appendChild(div);
51+
}, 100);
52+
53+
renderFriendList();
54+
</script>
55+
</body>
56+
</html>

memo/分时函数.js

Lines changed: 0 additions & 45 deletions
This file was deleted.

memo/策略模式之表单验证.html

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head lang="en">
4+
<meta charset="UTF-8">
5+
<title>策略模式之表单验证</title>
6+
</head>
7+
<body>
8+
<form action="http://www.qian360.com" id="registerForm" method="get">
9+
<label>请输入用户名:<input type="text" name="userName"></label>
10+
<label>请输入密码:<input type="password" name="password"></label>
11+
<label>请输入手机号码:<input type="text" name="phoneNumber"></label>
12+
<input type="submit" value="提交"/>
13+
</form>
14+
15+
<script>
16+
/*********************** 策略对象 ***********************/
17+
18+
var strategies = {
19+
isNonEmpty: function (value, errorMsg) {
20+
if (value === '') {
21+
return errorMsg;
22+
}
23+
},
24+
minLength: function (value, length, errorMsg) {
25+
if (value.length < length) {
26+
return errorMsg;
27+
}
28+
},
29+
isMobile: function (value, errorMsg) {
30+
if (!/^1[3|5|8][0-9]{9}$/.test(value)) {
31+
return errorMsg;
32+
}
33+
}
34+
};
35+
36+
/*********************** Validator类 ***********************/
37+
38+
var Validator = function () {
39+
this.cache = [];
40+
};
41+
42+
Validator.prototype.add = function (dom, rules) {
43+
var self = this;
44+
45+
for (var i = 0, rule; rule = rules[i++];) {
46+
(function (rule) {
47+
var strategAry = rule.strategy.split(':');
48+
var errorMsg = rule.errorMsg;
49+
50+
self.cache.push(function () {
51+
var strategy = strategAry.shift();
52+
strategAry.unshift(dom.value);
53+
strategAry.push(errorMsg);
54+
return strategies[strategy].apply(dom, strategAry);
55+
});
56+
}(rule));
57+
}
58+
};
59+
60+
Validator.prototype.start = function () {
61+
for (var i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
62+
var errorMsg = validatorFunc();
63+
if (errorMsg) {
64+
return errorMsg;
65+
}
66+
}
67+
};
68+
69+
/*********************** 客户调用代码 ***********************/
70+
71+
var registerForm = document.getElementById('registerForm');
72+
73+
var validataFunc = function () {
74+
var validator = new Validator();
75+
var errorMsg = '';
76+
77+
validator.add(registerForm.userName, [{
78+
strategy: 'isNonEmpty',
79+
errorMsg: '用户名不能为空'
80+
}, {
81+
strategy: 'minLength:6',
82+
errorMsg: '用户名长度不能小于10位'
83+
}]);
84+
85+
validator.add(registerForm.password, [{
86+
strategy: 'minLength:6',
87+
errorMsg: '密码长度不能小于6位'
88+
}]);
89+
90+
validator.add(registerForm.phoneNumber, [{
91+
strategy: 'isMobile',
92+
errorMsg: '手机号码格式不正确'
93+
}]);
94+
95+
errorMsg = validator.start();
96+
return errorMsg;
97+
};
98+
99+
registerForm.onsubmit = function () {
100+
var errorMsg = validataFunc();
101+
102+
if (errorMsg) {
103+
alert(errorMsg);
104+
return false;
105+
}
106+
}
107+
</script>
108+
</body>
109+
</html>

memo/通用惰性单例.html

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head lang="en">
4+
<meta charset="UTF-8">
5+
<title>通用惰性单例</title>
6+
</head>
7+
<body>
8+
<input type="button" id="loginBtn" value="创建唯一的iframe"/>
9+
<input type="button" id="div1" value="元素只绑定一次事件"/>
10+
<script>
11+
//通用惰性单例代码
12+
var getSingle = function (fn) {
13+
var result;
14+
return function () {
15+
return result || (result = fn.apply(this, arguments));
16+
}
17+
};
18+
19+
//实例:创建唯一的iframe
20+
var createSingleIframe = getSingle(function () {
21+
var iframe = document.createElement('iframe');
22+
document.body.appendChild(iframe);
23+
return iframe;
24+
});
25+
26+
document.getElementById('loginBtn').onclick = function () {
27+
var loginLayer = createSingleIframe();
28+
loginLayer.src = 'http://www.qian360.com';
29+
};
30+
31+
//实例:元素只绑定一次事件
32+
var bindEvent = getSingle(function () {
33+
document.getElementById('div1').onclick = function () {
34+
alert('click');
35+
};
36+
37+
/*
38+
* 必须给出返回值
39+
* 惰性单例根据这个返回值判断是否已经执行函数体
40+
* */
41+
return false;
42+
});
43+
44+
var render = function () {
45+
console.log('开始渲染列表');
46+
bindEvent();
47+
};
48+
49+
render();
50+
render();
51+
render();
52+
</script>
53+
</body>
54+
</html>

0 commit comments

Comments
 (0)