Re: [問題] JQuery事件的設定

看板Web_Design作者 (Arthow Eshes)時間8年前 (2017/03/25 22:38), 8年前編輯推噓4(4012)
留言16則, 4人參與, 最新討論串2/2 (看更多)
引述《lueichun (no anonymous)》之銘言: : 我在stackoverflow上看到一個範例: : http://bit.ly/2nTLOgD : 裡面有這麼一段code: : : function generate_handler( j ) { : return function(event) { : switchBanners(j, true); : }; : } : for(var i = 1; i <= totalBanners; i++){ : $('#slider-' + i).click( generate_handler( i ) ); : } $('xxx').click(這邊要放一個function的參照); 當 xxx 被點擊時才會執行 function,所以一般你最常看到的型式應該是這樣: $('xxx').click(function (event) { // do something }); 現場宣告一個匿名 function 其實就是現場宣告一個 function 的參照進去。 上面那個範例可以改寫成這樣: function f(event) { // do something } $('xxx').click(f); 注意是 f 不是 f(), f 是對 f 這個名稱的 function 的參照, f() 是執行 f 這個 function。 .click(f) 是把 f 這個 function 的參照作為參數傳給 .click, 所以原本的 $('xxx') 被點擊時會執行 f 這個 function。 那你原先舉的範例的 return function 在做什麼? 其實他運作起來會像這樣: (下面是複製你提供的範例程式碼,方便解說不用跳來跳去而已) for(var i = 1; i <= totalBanners; i++){ $('#slider-' + i).click( generate_handler( i ) ); } 還記得只要function名後面有括號,就會直接先呼叫那個function嗎? 執行到 .click( generate_handler(i) ) 的時候, 跟數學一樣,括號優先由內解到外, generate_handler(i) 會先被執行, 至於呼叫 generate_handler(i) 會獲得什麼? function generate_handler( j ) { return function(event) { switchBanners(j, true); }; } 這邊運用閉包的概念產生一個全新的匿名 function 參照, 換句話說呼叫 generate_handler(1) 會回傳一個 function (event) { switchBanners(1, true); } 所以如果迴圈內當下 i === 2,那最後中間那個 .click 那行實際做的事情會變成: $('#slider-' + 2).click( function (event) { switchBanners(2, true); }); 這樣可以理解嗎? -- ● 89 m 9/14 david21911 ◇ 你真是AV神人! 鴻雁往返 (R)回信 (x)站內轉寄 (y)回群組信 (d/D)刪信 (^P)寄發新信 (←/q)離開 稱號:AV神人 耐力+30, 魔法+30, 意志+30, 野生動物訓練成功機率+50% 生命-40, 智力-40, 防禦-10, 保護-25, 女性NPC好感度變化 [請問] 獲得這種稱號該如何處理... http://www.plurk.com/Arsho_Enn -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.168.73.112 ※ 文章網址: https://www.ptt.cc/bbs/Web_Design/M.1490452690.A.8BD.html ※ 編輯: Hevak (1.168.73.112), 03/25/2017 22:39:39

03/26 09:56, , 1F
借串問一下('#slider-' +i)是什麼意思,程式新手沒看過這
03/26 09:56, 1F

03/26 09:56, , 2F
種寫法,謝謝
03/26 09:56, 2F

03/26 11:23, , 3F
了解了 感謝
03/26 11:23, 3F

03/26 12:09, , 4F
'#slider-' + i 是字串串接,以上面 for 迴圈當下是 i 為 2
03/26 12:09, 4F

03/26 12:09, , 5F
的狀況下,'#slider-' + 2 的 數字2 會被自動轉型成 字串2
03/26 12:09, 5F

03/26 12:09, , 6F
,再跟 '#slider' 接起來,變成字串 '#slider-2'
03/26 12:09, 6F

03/26 12:10, , 7F
至於 $('#slider-2') 就是把 '#slider-2' 作為參數傳給 $
03/26 12:10, 7F

03/26 12:10, , 8F
這個 function,假設這個 $ 是 jQuery,效果就是回傳選取
03/26 12:10, 8F

03/26 12:10, , 9F
了 id 為 #slider-2 的 DOM 元素的 jQuery 物件
03/26 12:10, 9F

03/26 12:11, , 10F
所以 $('#slider-2').click(中略) 是對 id 為 slider-2 的
03/26 12:11, 10F

03/26 12:11, , 11F
元素綁定 click 事件的處理 function
03/26 12:11, 11F

03/26 12:26, , 12F
應該說,如果 + 的兩邊都是字串,就會把兩個字串串接起來。
03/26 12:26, 12F

03/26 12:26, , 13F
如果只有其中一邊是字串,
03/26 12:26, 13F

03/26 12:26, , 14F
會自動把另一邊轉成字串(toString)再把兩個字串串接起來。
03/26 12:26, 14F

03/26 13:00, , 15F
再給推,謝謝原po仔細解說
03/26 13:00, 15F

03/26 19:33, , 16F
03/26 19:33, 16F
文章代碼(AID): #1Ore3IYz (Web_Design)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Ore3IYz (Web_Design)