2017.12.19 Js事件委托菊霜、JS 數(shù)組的reduce()坚冀、c# Reverse()、DB層SQL語(yǔ)句拼接問(wèn)題鉴逞、C#控件中的KeyDown记某、KeyPress 與 KeyUp事件

第一組:楊昊 真干貨——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的交互操作,完美致盟!


圖1
圖2

對(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ù)的操作思犁,如下:


image.png

在運(yùn)行之后會(huì)報(bào)AND附近有語(yǔ)法錯(cuò)誤

于是,加了如下代碼就可以解決這個(gè)問(wèn)題


image.png

第五組:王顥 C#控件中的KeyDown进肯、KeyPress 與 KeyUp事件(文末附相關(guān)鏈接)

  1. 這三個(gè)事件的順序是怎么樣的激蹲?
  2. KeyDown 觸發(fā)后,KeyUp是不是一定觸發(fā)江掩?
  3. 三個(gè)事件的定義
  4. KeyDown学辱、KeyUp 和KeyPress 之間的區(qū)別
  5. 如何區(qū)分是否按的是小鍵盤(pán)?
  6. PrScrn按鍵三個(gè)事件能夠捕獲嗎环形?
  7. {菜單鍵}和{開(kāi)始鍵}KeyPress能夠捕獲嗎策泣?
  8. 如何捕獲系統(tǒng)的組合鍵?
  9. 通過(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ū)別
  1. 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)的特殊鍵)
  2. KeyPress 只能捕獲單個(gè)字符
    KeyDown 和KeyUp 可以捕獲組合鍵茎活。
  3. KeyPress 可以捕獲單個(gè)字符的大小寫(xiě)
  4. KeyDown和KeyUp 對(duì)于單個(gè)字符捕獲的KeyValue 都是一個(gè)值,也就是不能判斷單個(gè)字符的大小寫(xiě)琢唾。
  5. KeyPress 不區(qū)分小鍵盤(pán)和主鍵盤(pán)的數(shù)字字符载荔。
    KeyDown 和KeyUp 區(qū)分小鍵盤(pán)和主鍵盤(pán)的數(shù)字字符。
  6. 其中PrScrn 按鍵KeyPress采桃、KeyDown和KeyUp 都不能捕獲懒熙。
五. 系統(tǒng)組合鍵的判定

……
……
……
詳情見(jiàn)word文檔

六. 捕獲PrScrn按鍵事件

……
……
……
詳情見(jiàn)word文檔

相關(guān)鏈接:
http://blog.csdn.net/simpkan/article/details/6087727

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芍碧,隨后出現(xiàn)的幾起案子煌珊,更是在濱河造成了極大的恐慌,老刑警劉巖泌豆,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定庵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡踪危,警方通過(guò)查閱死者的電腦和手機(jī)蔬浙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贞远,“玉大人畴博,你說(shuō)我怎么就攤上這事±吨伲” “怎么了俱病?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵官疲,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我亮隙,道長(zhǎng)途凫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任溢吻,我火速辦了婚禮维费,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘促王。我一直安慰自己犀盟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蝇狼。 她就那樣靜靜地躺著阅畴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迅耘。 梳的紋絲不亂的頭發(fā)上恶阴,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音豹障,去河邊找鬼冯事。 笑死,一個(gè)胖子當(dāng)著我的面吹牛血公,可吹牛的內(nèi)容都是我干的昵仅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼累魔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摔笤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起垦写,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吕世,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后梯投,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體命辖,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年分蓖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尔艇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡么鹤,死狀恐怖终娃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒸甜,我是刑警寧澤棠耕,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布余佛,位于F島的核電站,受9級(jí)特大地震影響窍荧,放射性物質(zhì)發(fā)生泄漏衙熔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一搅荞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧框咙,春花似錦咕痛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至者铜,卻和暖如春腔丧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背作烟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工愉粤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拿撩。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓衣厘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親压恒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子影暴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 事件流 IE和Netscape開(kāi)發(fā)團(tuán)隊(duì)提出了完全相反的兩種事件流的概念,事件冒泡流和事件捕獲流探赫。 事件冒泡 事件由...
    exialym閱讀 935評(píng)論 0 9
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,605評(píng)論 2 10
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點(diǎn)的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點(diǎn)是DOM的常...
    凜0_0閱讀 1,340評(píng)論 0 8
  • 鍵盤(pán)事件全面控制主要分四個(gè)部分第一部分:瀏覽器的按鍵事件第二部分:兼容瀏覽器第三部分:代碼實(shí)現(xiàn)和優(yōu)化第四部分:總結(jié)...
    ShindouHikaru閱讀 3,906評(píng)論 0 4
  • 想想自己距離高考已經(jīng)兩年了 14年的這個(gè)時(shí)間段是高考分?jǐn)?shù)出來(lái)的時(shí)候 現(xiàn)在想想 當(dāng)時(shí)的自己估計(jì)哭了很久吧 當(dāng)時(shí)許多親...
    夏沫子閱讀 213評(píng)論 2 1