¶My Solution
My solution to task18 is available on jsfiddle:
¶Compared with others’
¶任务得分第一的团队的 solution
- 
🔖 AGAIN:事件绑定函数的兼容性 1 
 2
 3
 4
 5
 6
 7
 8
 9function addEvent(element, event, handler) { 
 if (element.addEventListener) {
 element.addEventListener(event, handler, false);
 } else if (element.attachEvent) {
 element.attachEvent("on" + event, handler);
 } else {
 element["on" + event] = handler;
 }
 }
- 
🎀 将数据 queue 和与之相关的方法封装成了一个对象 😕 要挑刺的话,我觉得最好不要把 queue对象内部的数据命名为str。
 str让人马上想到字符串而不是数组,而且paint方法内部的局部变量也名为str难免让人产生混淆(比如我读paint方法的相关代码的时候确实弄混了Orz)。1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20//遍历数组的方法,针对数组中每一个元素执行fn函数,并将数组索引和元素作为参数传递,后面用 
 function each(arr, fn) {
 for (var cur = 0; cur < arr.length; cur++) {
 fn(arr[cur], cur);
 }
 }
 window.onload = function() {
 ...
 var queue = {
 queue: [],
 ...
 paint: function() {
 var str = "";
 each(this.queue, function(item){str += ("<div>" + parseInt(item) + "</div>")});
 queueWrapper.innerHTML = str;
 addDivDelEvent();
 },
 ...
 };
 }
- 
语法: array.splice(start, deleteCount, item1ToAdd, item2ToAdd, ...)可以使用 arr.splice(index, 1)来删除index位置上的数组元素(而不用像我那样使用filter方法)。
- 
🎀 循环绑定事件 & 闭包 
| 1 | function addDivDelEvent() { | 
¶任务得分第二的团队的 solution
- 
🔖 nodeNameVStagName
- 
🎀 定义简单的 $函数来减少document.getElementXXX的输入(以偷懒 😛)1 
 2
 3var $ = function (id) { 
 return document.getElementById(id);
 };
- 
🎀 面向对象的封装(逻辑略复杂 😅 - 加入 To Do 豪华午餐) 
¶任务得分第三的团队的 solution
- 
🔖 AGAIN:定义简单的 $函数来减少document.getElementXXX的输入(以偷懒 😛)1 $ = function (el) { return document.querySelector(el); }; 
- 
🔖 利用了数组的 map和join方法,避开了不必要的循环1 
 2
 3
 4
 5function render() { 
 $('#result').innerHTML =
 data.map(function(d) { return "<div>" + d + "</div>"; })
 .join('');
 }另外注意上面代码中的类似于 jQuery 中的 “链式”写法 的写法! 
- 
🎀 通过 [].slice和.call/.apply来使类数组也可以使用数组的方法 & 将[].方法名作为参数传入函数增强了代码复用e.g. Line 36: var args = [].slice.call(arguments, 2);,其中arguments是函数deal的参数(类数组)。
- 
🎀 将四个按钮和队列中元素的五种点击事件抽象为了 deal函数
- 
🎀 try/catch的合理使用
- 
🎀 parseInt()使得007这样的输入(变为7)
- 
🎀 通过 [].indexOf和.call来得出当前节点是父元素的第几个子节点1 
 2
 3
 4function getClickIndex(e) { 
 var node = e.target;
 return [].indexOf.call(node.parentNode.children, node);
 }
- 
😔 小疏忽 - 移除的逻辑没有队列为空的检验:最后弹窗为空时,点击“左侧出/右侧出”会弹出 undefined。
- 从用户体验的角度考虑,对输入的字符串 .trim()一下会比较好。
 P.S. 内心 OS:看到这么简洁的代码真的忍不住想跪舔一下。因某位“缺注释、看不懂”等理由给了 5 分而位列第三实在可惜。以及“五个非洲人”(一本正经的 Five-African)的队名,够我笑一个星期了XD。 
- 移除的逻辑没有队列为空的检验:最后弹窗为空时,点击“左侧出/右侧出”会弹出 
¶To Do
P.S. 出于易读性的考虑,以上代码的命名和缩进可能有所修改。