第一組:楊昊 真干貨——Js事件委托
一份好的代碼,不僅僅要寫(xiě)的美觀(guān)构捡,還要性能卓越液南。事件委托可以說(shuō)就是這樣一種——“技巧”外驱?不多說(shuō)制妄,進(jìn)入正題。
關(guān)于事件委托
《JavaScript高級(jí)程序設(shè)計(jì)》中是這樣解釋的:事件委托就是利用事件冒泡贫橙,只指定一個(gè)事件處理程序,就可以管理某一類(lèi)型的所有事件譬涡。
使用事件委托的好處
比如現(xiàn)在有這樣一個(gè)經(jīng)典的例子——JS計(jì)算器闪幽,一般的簡(jiǎn)易計(jì)算器上都至少有20個(gè)按鍵,通常情況下對(duì)這些按鍵的響應(yīng)是為每個(gè)按鍵綁定一個(gè)click事件涡匀,這樣做是沒(méi)有問(wèn)題的盯腌。但是,如果是更多的按鍵呢陨瘩,100個(gè)腕够,有可能1000個(gè)(一般不可能)。
我們先來(lái)認(rèn)清一個(gè)事實(shí):在JavaScript中舌劳,添加到頁(yè)面上的事件處理程序數(shù)量將直接關(guān)系到頁(yè)面的整體運(yùn)行性能帚湘,因?yàn)樾枰粩嗟呐cdom節(jié)點(diǎn)進(jìn)行交互,訪(fǎng)問(wèn)dom的次數(shù)越多甚淡,引起瀏覽器重繪與重排的次數(shù)也就越多大诸,就會(huì)延長(zhǎng)整個(gè)頁(yè)面的交互就緒時(shí)間。要知道贯卦,JS中函數(shù)是以對(duì)象的形式存在的资柔,也就意味著它需要占內(nèi)存。
所以說(shuō)要想進(jìn)行性能優(yōu)化撵割,其中的主要思想之一就是減少DOM操作贿堰。如果要用事件委托,就會(huì)將所有的操作放到j(luò)s程序里面啡彬,與dom的操作就只需要交互一次羹与,這樣就能大大的減少與dom的交互次數(shù),提高性能庶灿。
事件委托的原理
事件委托是利用事件的冒泡原理來(lái)實(shí)現(xiàn)的纵搁,何為事件冒泡呢?就是事件從最深的節(jié)點(diǎn)開(kāi)始往踢,然后逐步向上傳播事件腾誉,舉個(gè)例子:頁(yè)面上有這么一個(gè)節(jié)點(diǎn)樹(shù),div>ul>li>a;比如給最里面的a加一個(gè)click點(diǎn)擊事件菲语,那么這個(gè)事件就會(huì)一層一層的往外執(zhí)行,執(zhí)行順序a>li>ul>div惑灵,有這樣一個(gè)機(jī)制山上,那么我們給最外面的div加點(diǎn)擊事件,那么里面的ul英支,li佩憾,a做點(diǎn)擊事件的時(shí)候,都會(huì)冒泡到最外層的div上,所以都會(huì)觸發(fā)妄帘,這就是事件委托楞黄,委托它們父級(jí)代為執(zhí)行事件。
事件委托的簡(jiǎn)單實(shí)現(xiàn):
現(xiàn)在有這樣一個(gè)頁(yè)面:
<div id="box">
<input type="button" id="add" value="添加" />
<input type="button" id="remove" value="刪除" />
<input type="button" id="move" value="移動(dòng)" />
<input type="button" id="select" value="選擇" />
</div>
常規(guī)的操作是圖1這樣的抡驼,利用事件委托是圖2這樣的鬼廓。只進(jìn)行一次DOM的交互操作,完美致盟!
對(duì)了碎税,這還有個(gè)鏈接,講的真心不錯(cuò)馏锡。https://www.cnblogs.com/liugang-vip/p/5616484.html
第二組:馮佳麗 JS 數(shù)組的reduce()用法小結(jié)——轉(zhuǎn)載
第一次關(guān)注reduce()是在對(duì)象數(shù)組去重里雷蹂。
var arr = [{name:'Thor',id:1},{name:'Locki',id:1},{name:'Tony',id:2}]
var hash= {}
arr = arr.reduce(function(cur,next){
hash[next.id]?'':hash[next.id]===true&&cur.push(next)
return cur
},[])
上面代碼是從數(shù)組arr里去掉重復(fù)id的元素杯道。
arr.reduce(func(),[])傳入了兩個(gè)參數(shù):匿名函數(shù)和空數(shù)組[]匪煌。
在匿名函數(shù)里的兩個(gè)參數(shù):cur指累積變量,next指被遍歷的數(shù)組元素党巾。
如果沒(méi)有指定參數(shù)-空數(shù)組[]萎庭,累積變量cur默認(rèn)是第一個(gè)元素的值
在指定參數(shù)空數(shù)組后,累積變量cur的初始值就變成了空數(shù)組昧港。
所以上面代碼就是判斷hash對(duì)象里是否已存入了當(dāng)前arr數(shù)組元素的id擎椰,如果存入了,則遍歷下一個(gè)元素创肥,并把第一次存入時(shí)的元素添加到累積變量cur里达舒。這樣最后函數(shù)返回的就是去掉重復(fù)id的數(shù)組。
上面是reduce()的一個(gè)應(yīng)用叹侄。下面是關(guān)于reduce()的基本介紹: 參考阮大神的介紹巩搏,reduce()對(duì)數(shù)組進(jìn)行了:遍歷、變形和累積操作趾代。前提是累積變量初始值為數(shù)組贯底。具體看下面例子:
var arr = [0,1,2,3,4]
var handler = function(item,next){
item.push(next+1)
return item
}
arr.reduce(handler(),[])
//輸出結(jié)果是:[1,2,3,4,5]
首先,reduce()對(duì)數(shù)組arr進(jìn)行了遍歷
其次撒强,經(jīng)過(guò)reduce()處理的數(shù)組被修改禽捆。類(lèi)似map()函數(shù)
最后,通過(guò)item這個(gè)累積變量飘哨,把所有元素累積在一起胚想。這個(gè)例子里是通過(guò)push方法。
其實(shí)更能體現(xiàn)reduce()累積作用的例子是下面這個(gè):
var arr = [0,1,2,3,4]
var summary = arr.reduce(function(sum,n){
sum += n
return sum
},0)
console.log(summary)
//輸出結(jié)果為:10
上面代碼里芽隆,arr數(shù)組的每個(gè)成員被遍歷求和浊服。sum作為累積變量统屈,初始值是0.
如果不提供第二個(gè)參數(shù)0,sum初始值也會(huì)默認(rèn)為arr的第一個(gè)元素即0牙躺。
同理愁憔,對(duì)于數(shù)組的階乘,可以很方便的使用如下代碼做到:
var arr = [1,2,3,4,5]
var times = arr.reduce(function(res,n){
res *= n
return res;
})
console.log(times)
//輸出結(jié)果為120
第三組 吳景霞 c# Reverse()的兩點(diǎn)用法
Rervese的基本用途是:反轉(zhuǎn)數(shù)組中元素的順序孽拷,常見(jiàn)的兩種用法如下:
void Array.Reverse(Array array)
static void Main(string[] args)
{
char[] chs = { '清','晨','我','上','馬'};
Array.Reverse(chs);
Console.WriteLine(chs);
Console.ReadKey();
}
運(yùn)行結(jié)果為:馬上我晨清
(更高端一點(diǎn)的用法還有:void Array.Reverse(Array array,int index,int length)吨掌,反轉(zhuǎn)數(shù)組中部分元素的順序)
char[] char.Reverse().Array()
static void Main(string[] args)
{
int[] num = { 1, 3, 2, 4 };
num = num.Reverse().ToArray();
for (int i = 0; i < num.Length; i++)
{
Console.WriteLine(num[i]);
}
Console.ReadKey();
}
運(yùn)行結(jié)果為:
4
2
3
1
第四組:傅云 解決DB層自定義SQL語(yǔ)句與框架中SQL語(yǔ)句的拼接問(wèn)題
如何解決DB層自定義SQL語(yǔ)句與框架中SQL語(yǔ)句的拼接問(wèn)題。
一開(kāi)始乓搬,我就按正常的拼接方法進(jìn)行數(shù)據(jù)庫(kù)的操作思犁,如下:
在運(yùn)行之后會(huì)報(bào)AND附近有語(yǔ)法錯(cuò)誤
于是,加了如下代碼就可以解決這個(gè)問(wèn)題
第五組:王顥 C#控件中的KeyDown进肯、KeyPress 與 KeyUp事件(文末附相關(guān)鏈接)
- 這三個(gè)事件的順序是怎么樣的激蹲?
- KeyDown 觸發(fā)后,KeyUp是不是一定觸發(fā)江掩?
- 三個(gè)事件的定義
- KeyDown学辱、KeyUp 和KeyPress 之間的區(qū)別
- 如何區(qū)分是否按的是小鍵盤(pán)?
- PrScrn按鍵三個(gè)事件能夠捕獲嗎环形?
- {菜單鍵}和{開(kāi)始鍵}KeyPress能夠捕獲嗎策泣?
- 如何捕獲系統(tǒng)的組合鍵?
- 通過(guò)什么方式捕獲PrScrn按鍵事件抬吟?
一. 鍵事件按下列順序發(fā)生:
KeyDown
KeyPress
KeyUp
如一個(gè)控件上可能出現(xiàn)3個(gè)與鍵盤(pán)相關(guān)的事件萨咕,下面是這些事件發(fā)生的常規(guī)順序:
用戶(hù)按“a”鍵,該鍵將被預(yù)處理和調(diào)度火本,而且會(huì)發(fā)生KeyDown事件危队。
用戶(hù)按住“a”鍵,該鍵將被預(yù)處理和調(diào)度钙畔,而且會(huì)發(fā)生KeyPress事件茫陆。
用戶(hù)松開(kāi)“a”鍵,該鍵將被預(yù)處理和調(diào)度擎析,而且會(huì)發(fā)生KeyUp事件簿盅。
二. KeyDown觸發(fā)后,不一定觸發(fā)KeyUp揍魂,當(dāng)KeyDown 按下后桨醋,拖動(dòng)鼠標(biāo),那么將不會(huì)觸發(fā)KeyUp事件现斋。
三. 定義
KeyDown:在控件有焦點(diǎn)的情況下按下鍵時(shí)發(fā)生喜最。
KeyPress:在控件有焦點(diǎn)的情況下按下鍵時(shí)發(fā)生。(下面會(huì)說(shuō)和KeyDown 的區(qū)別)
KeyUp:在控件有焦點(diǎn)的情況下釋放鍵時(shí)發(fā)生步责。
四. KeyPress 和KeyDown 返顺、KeyPress之間的區(qū)別
- KeyPress主要用來(lái)捕獲數(shù)字(注意:包括Shift+數(shù)字的符號(hào))、字母(注意:包括大小寫(xiě))蔓肯、小鍵盤(pán)等除了F1-12遂鹊、SHIFT、Alt蔗包、Ctrl秉扑、Insert、Home调限、PgUp舟陆、Delete、End耻矮、PgDn秦躯、ScrollLock、Pause裆装、NumLock踱承、{菜單鍵}、{開(kāi)始鍵}和方向鍵外的ANSI字符
KeyDown 和KeyUp 通成诿猓可以捕獲鍵盤(pán)除了PrScrn所有按鍵(這里不討論特殊鍵盤(pán)的特殊鍵) - KeyPress 只能捕獲單個(gè)字符
KeyDown 和KeyUp 可以捕獲組合鍵茎活。 - KeyPress 可以捕獲單個(gè)字符的大小寫(xiě)
- KeyDown和KeyUp 對(duì)于單個(gè)字符捕獲的KeyValue 都是一個(gè)值,也就是不能判斷單個(gè)字符的大小寫(xiě)琢唾。
- KeyPress 不區(qū)分小鍵盤(pán)和主鍵盤(pán)的數(shù)字字符载荔。
KeyDown 和KeyUp 區(qū)分小鍵盤(pán)和主鍵盤(pán)的數(shù)字字符。 - 其中PrScrn 按鍵KeyPress采桃、KeyDown和KeyUp 都不能捕獲懒熙。
五. 系統(tǒng)組合鍵的判定
……
……
……
詳情見(jiàn)word文檔
六. 捕獲PrScrn按鍵事件
……
……
……
詳情見(jiàn)word文檔
相關(guān)鏈接:
http://blog.csdn.net/simpkan/article/details/6087727