精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用jquery實現留言框設計

開發 開發工具
新框架帶來的新的理念,新的開發方式不可否認帶來了生產效率,但是jQuery等就應該被打上“舊時代”面條式代碼的標簽么?

自從React/Vue等框架流行之后,jQuery被打上了面條式代碼的標簽,甚至成了“過街老鼠”,好像誰還在用jQuery,誰就還活在舊時代,很多人都爭先恐后地擁抱新框架,各大博客網站有很大一部分的博客都在介紹新的框架,爭當時代的“弄潮兒”。新框架帶來的新的理念,新的開發方式不可否認帶來了生產效率,但是jQuery等就應該被打上“舊時代”面條式代碼的標簽么?

我們從一篇文章說起:《React.js 的介紹 – 針對了解 jQuery 的工程師(譯)》,英文原文是這個《React.js Introduction For People Who Know Just Enough jQuery To Get By》,這篇文章我好久前就看過,現在再把它翻出來,里面對比了下jQuery和React分別實現一個發推的功能,作者用jQuery寫著寫著代碼就亂套了,而用React不管需求多復雜,代碼條理依舊很清晰。

我們一步步按照原文作者的思路來拆解。

(1)輸入個數為0時,發送按鈕不可點擊

如下圖所示,當輸入框沒有內容時,發推按鈕置灰不可點,有內容點才能點。

  1. // 初始化狀態 $("button").prop("disabled"true); // 文本框的值發生變化時 $("textarea").on("input"function() {   // 只要超過一個字符,就   if ($(this).val().length > 0) {     // 按鈕可以點擊     $("button").prop("disabled"false);   } else {     //否則,按鈕不能點擊     $("button").prop("disabled"true);   } }); 

這個代碼本身寫得很累贅,首先,既然一開始那個button是disabled的,那就直接在html上寫個disabled屬性就行了:

  1. <form class="tweet-box"
  2.     <textarea name="textMsg"></textarea> 
  3.     <input disabled type="submit" name="tweet" value="Tweet"
  4. </form> 

第二個要控制按鈕的狀態,其實核心只要一行代碼就行了,不需要寫那么長:

  1. let form = $(".tweet-box")[0]; 
  2. $(form.textMsg).on("input"function() { 
  3.     form.tweet.disabled = this.value.length <= 0; 
  4. }).trigger("input"); 

這個代碼應該夠簡潔了吧,而且代碼在jQuery和原生之間來回切換,游刃有余。

(2)實現剩余字數功能

如下圖所示:

  1. let form = $(".tweet-box")[0],     $leftWordCount = $("#left-word-count");   $(form.textMsg).on("input"function() {     // 已有字數     let wordsCount = this.value.length;     $leftWordCount.text(140 - wordsCount);     form.tweet.disabled = wordsCount <= 0; }); 

(3)添加圖片按鈕

如下圖所示,左下角多了一個選擇照片的按鈕:

 

如果用戶選擇了照片,那么可輸入字數將會減少23個字符,并且Add Photo文案要變成Photo Added。我們先來看下作者是怎么實現的,如下代碼:

  1. if ($(this).hasClass("is-on")) {   $(this)     .removeClass("is-on")     .text("Add Photo");   $("span").text(140 - $("textarea").val().length); } else {   $(this)     .addClass("is-on")     .text("✓ Photo Added");   $("span").text(140 - 23 - $("textarea").val().length); } 

如果代碼像作者這樣寫的話確實是比較亂,而且比較面條式。但是我們可以優雅地實現。首先,選擇照片一般會寫一個input[type=file]的隱藏輸入框蓋在上傳圖標下面:

  1. <div class="upload-container"
  2.     <img src="upload-icon.png" alt> 
  3.     <span id="add-photo">Add Photo</span> 
  4.     <input type="file" name="photoUpload"
  5. </div> 

然后監聽它的change事件,在change事件里面給form套一個類:

  1. $(form.photoUpload).on("change"function() { 
  2.     // 如果選擇了照片則添加一個photo-added的類 
  3.     this.value.length ? $(form).addClass("photo-added"
  4.                 // 否則去掉 
  5.                 : $(form).removeClass("photo-added"); 
  6.              
  7. }); 

然后就可以來實現文案改變的需求了,把上面#add-photo的span標簽添加兩個data屬性,分別是照片添加和未添加的文案,如下代碼所示:

  1. <span id="add-photo" data-added-text="Photo Added" 
  2.       data-notadded-text="Add Photo"
  1. </span> 

通過form的類結合before/after偽類控制html上的文案,如下代碼所示:

  1. #add-photo:before { 
  2.     content: attr(data-empty-text); 
  3.   
  4. form.photo-added #add-photo:before { 
  5.     content: attr("data-added-text); 

這樣就可以了,我們算是用了一個比較優雅的方式實現了一個文案變化的功能,其中CSS的attr可以兼容到IE9,并且這里html/css/js相配合,

共同完成這個變化的功能,這應該也挺好玩的。

剩下一個要減掉23字符的需求,只需要在減掉的時候判斷一下:

  1. $(form.textMsg).on("input"function() { 
  2.     // 已有字數 
  3.     let wordsCount = this.value.length; 
  4.     form.tweet.disabled = wordsCount <= 0; 
  5.     $leftWordCount.text(140 - wordsCount - 
  6.             //如果已經添加了圖片再減掉23個字符 
  7.             ($(form).hasClass("photo-added") ? 23 : 0)); 
  8. }); 

然后在選擇圖片之后trigger一下,讓文字發生變化,如下代碼倒數第二行:

  1. /* 
  2. * @trigger 會觸發文字輸入框的input事件以更新剩余字數 
  3. */ 
  4. $(form.photoUpload).on("change"function() { 
  5.     // 如果選擇了照片則添加一個photo-added的類 
  6.     this.value.length ? $(form).addClass("photo-added") : 
  7.                 // 否則去掉 
  8.                 $(form).removeClass("photo-added"); 
  9.     $(form.textMsg).trigger("input"); 
  10. }); 

這里又使用了事件的機制,用reac應該基本上都是用狀態state控制了。再來看***一個功能。

(4)沒有文字但是有照片發推按鈕要可點

上面是只要沒有文字,那么發推按鈕不可點,現在要求有圖片就可點。這個也好辦,因為如果有圖片的話,form已經有了一個類,所以只要再加一個判斷就可以了:

  1. $(form.textMsg).on("input"function() { 
  2.     // 已有字數 
  3.     let wordsCount = this.value.length; 
  4.     form.tweet.disabled = wordsCount <= 0 
  5.             //disabled再添加一個與判斷 
  6.             && !$(form).hasClass("photo-added"); 
  7.     $leftWordCount.text(140 - wordsCount - 
  8.             //如果已經添加了圖片再減掉23個字符 
  9.             ($(form).hasClass("photo-added") ? 23 : 0)); 
  10. }); 

***看一下,匯總的JS代碼,加上空行和注釋總共只有23行:

  1. let form = $(".tweet-box")[0], 
  2.     $leftWordCount = $("#left-word-count"); 
  3.   
  4. $(form.textMsg).on("input"function() { 
  5.     // 已有字數 
  6.     let wordsCount = this.value.length; 
  7.     form.tweet.disabled = wordsCount <= 0 
  8.             //disabled再添加一個與判斷 
  9.             && !$(form).hasClass("photo-added"); 
  10.     $leftWordCount.text(140 - wordsCount - 
  11.             //如果已經添加了圖片再減掉23個字符 
  12.             ($(form).hasClass("photo-added") ? 23 : 0)); 
  13. }); 
  14.   
  15. /* 
  16. * @trigger 會觸發文字輸入框的input事件以更新剩余字數 
  17. */ 
  18. $(form.photoUpload).on("change"function() { 
  19.     // 如果選擇了照片則添加一個photo-added的類 
  20.     this.value.length ? $(form).addClass("photo-added") : 
  21.             // 否則去掉 
  22.             $(form).removeClass("photo-added"); 
  23.     $(form.textMsg).trigger("input"); 
  24. }); 

html大概有10行,還有6行核心CSS,不過這兩個比較易讀。再來看一下React的完整版本,作者的實現:

  1. var TweetBox = React.createClass({ 
  2.   getInitialState: function() { 
  3.     return { 
  4.       text: ""
  5.       photoAdded: false 
  6.     }; 
  7.   }, 
  8.   handleChange: function(event) { 
  9.     this.setState({ text: event.target.value }); 
  10.   }, 
  11.   togglePhoto: function(event) { 
  12.     this.setState({ photoAdded: !this.state.photoAdded }); 
  13.   }, 
  14.   remainingCharacters: function() { 
  15.     if (this.state.photoAdded) { 
  16.       return 140 - 23 - this.state.text.length; 
  17.     } else { 
  18.       return 140 - this.state.text.length; 
  19.     } 
  20.   }, 
  21.   render: function() { 
  22.     return ( 
  23.       <div className="well clearfix"
  24.         <textarea className="form-control" 
  25.                   onChange={this.handleChange}></textarea> 
  26.         <br/> 
  27.         <span>{ this.remainingCharacters() }</span> 
  28.         <button className="btn btn-primary pull-right" 
  29.           disabled={this.state.text.length === 0 && !this.state.photoAdded}>Tweet</button> 
  30.         <button className="btn btn-default pull-right" 
  31.           onClick={this.togglePhoto}> 
  32.           {this.state.photoAdded ? "✓ Photo Added" : "Add Photo" } 
  33.         </button> 
  34.       </div> 
  35.     ); 
  36.   } 
  37. }); 
  38.   
  39. React.render( 
  40.   <TweetBox />, 
  41.   document.body 
  42. ); 

React的套路是監聽事件然后改變state,在jsx的模板里,使用這些state展示,而jQuery的套路是監聽事件,然后自己去控制DOM展示。

React幫你操作DOM,jQuery要自己去操作DOM,前者提供了便利但同時也失去了靈活性,后者增加了靈活性但同時增加了復雜度。

使用jQuery不少人容易寫出面條式的代碼,但是寫代碼的風格我覺得和框架沒關系,關鍵還在于你的編碼素質,就像你用了React寫class,你就可以說你就是面向對象了?不見得,我在《JS與面向對象》這篇文章提到,寫class并不代表你就是面向對象,面向對象是一種思想而不是你代碼的組織形式。一旦你離開了React的框架,是不是又要回到面條式代碼的風格了?如果是的話那就說明你并沒有沒有掌握面向對象的思想。不過,React等框架能夠方便地組件化,這點是不可否認的。

還有一個需要注意的是,框架會幫你屏蔽掉很多原生的細節,讓你專心于業務邏輯,但往往也讓你喪失了原生的能力不管是html還是js,而這才是最重要的功底。例如說對于事件,由于所有的事件都是直接綁在目標元素,然后通過state或者其它第三方的框架進行傳遞,這樣其實就沒什么事件的概念了。所以需要警惕使用了框架但是喪失了基本的前端能力,再如ajax分頁改變url,或者說單頁面路由的實現方式,還有前后退的控制,基本上能夠完整回答地比較少。很多人都會用框架做頁面,但是不懂JS.

【本文為51CTO專欄作者“太平洋警察”的原創稿件,轉載請通過作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2016-09-26 15:14:28

Javascript前端vue

2009-06-26 15:55:29

Javascript+

2012-04-23 09:12:29

jQuery插件

2011-03-15 09:10:47

iptablesNAT

2011-03-15 14:26:23

iptablesNAT

2020-05-09 10:38:31

Python透視表數據

2015-07-22 12:42:36

Pivot行列轉換

2017-10-27 22:03:35

javascrip

2010-05-24 10:23:34

實現MySQL

2011-07-22 13:22:10

Java.NETDataTable

2023-02-26 01:37:57

goORM代碼

2015-07-06 13:36:14

Redis微博關注關系

2015-07-09 09:49:39

PHPSocket服務器

2020-09-02 08:12:05

CodeDDD代碼

2021-03-02 10:57:39

二叉樹二叉堆節點

2018-08-31 09:55:38

Ansible網絡自動化

2009-02-05 14:17:37

FTP服務器Java

2010-05-25 13:47:53

MySQL 命令

2023-10-26 11:03:50

C語言宏定義

2017-04-26 08:31:10

神經網絡自然語言PyTorch
點贊
收藏

51CTO技術棧公眾號

成人午夜电影网站| 熟女人妻一区二区三区免费看| 成人啪啪18免费游戏链接| а√资源新版在线天堂| 一区二区三区四区高清视频| 久久天天做天天爱综合色| 久久精品久久精品亚洲人| 久久综合伊人77777麻豆| 亚洲色图27p| 欧美大片高清| 国产成人三级在线观看| 最近中文字幕mv在线一区二区三区四区| 青草网在线观看| 又污又黄的网站| 红桃成人av在线播放| 午夜精品福利一区二区三区av| 成人免费网视频| 亚洲最大成人综合网| 少妇一区视频| 久久久精品tv| 日韩av成人在线观看| 亚洲av成人精品一区二区三区| av网站在线免费| 国产酒店精品激情| 久久69精品久久久久久国产越南| 国产成人美女视频| 免费a级毛片在线播放| 美女精品一区| 欧美偷拍一区二区| 日本精品一区| 波多野结衣一本一道| 亚洲天堂日韩在线| 色香色香欲天天天影视综合网| 久久精品国产美女| 国产中文字幕视频| 激情综合网站| 日韩成人在线播放| 国产日韩成人内射视频| www.亚洲.com| 狠狠久久亚洲欧美| 九九九热精品免费视频观看网站| 九九九视频在线观看| 亚洲伊人精品酒店| 一区二区三区在线免费| 成人免费视频网站| 国产做受高潮漫动| 国产一区二区三区日韩精品| 亚洲国产精品成人av| 97在线播放视频| porn视频在线观看| 久久久久高清精品| 久久久久久艹| 欧美日韩国产中文字幕在线| 日本系列欧美系列| 不卡av在线播放| 欧产日产国产精品98| 欧美h版在线观看| 精品高清一区二区三区| 日韩影院一区| www日本高清| 亚洲毛片播放| 日韩在线激情视频| 久久精品色妇熟妇丰满人妻| 136国产福利精品导航网址应用| 7777精品伊人久久久大香线蕉经典版下载| 黄网站色视频免费观看| 撸视在线观看免费视频| 久久久国产一区二区三区四区小说 | 久久久久亚洲av片无码下载蜜桃| 国产三级精品三级在线观看国产| 91久久精品一区二区二区| 黄黄视频在线观看| 青青草视频在线观看| 国产一区在线不卡| 日韩av不卡在线| 嫩草影院一区二区三区| 麻豆精品视频在线观看免费| 69**夜色精品国产69乱| 自拍偷拍第9页| 久久久久久久久99精品大| 精品亚洲一区二区三区在线播放 | 久久精品国产**网站演员| 国产专区精品视频| 日本三级视频在线| 久久久久久久久久久9不雅视频| 久久亚洲精品视频| 另类小说综合网| 给我看免费高清在线观看| 免费看av不卡| 夜夜精品视频一区二区| 亚洲巨乳在线观看| 日韩在线无毛| 国产精品色在线| 精品国产一区二区三| 国产女人高潮时对白| 久久影院亚洲| 欧美影院久久久| 国产精品第一页在线观看| 日本va中文字幕| 色女人综合av| 亚洲欧美在线观看视频| 久久动漫亚洲| 91黄色精品| 国产原创中文av| 日韩成人免费在线| 欧美一二三视频| 又污又黄的网站| eeuss鲁片一区二区三区在线观看| 国产精自产拍久久久久久| 一区二区三区福利视频| 亚洲国产婷婷| 国产欧美久久久久久| 日本xxxxwww| 成人在线视频首页| 亚洲精品欧美精品| 蜜桃视频m3u8在线观看| 亚洲成人av中文| 日本人体一区二区| 黄色污污视频在线观看| 亚洲国产美国国产综合一区二区| 日本女优爱爱视频| 伊人精品综合| 日韩中文字幕免费| 黑鬼狂亚洲人videos| 91精品婷婷色在线观看| 日本精品一区二区三区在线播放视频 | 中文字幕制服丝袜| 首页国产精品| 久久久国产成人精品| 69视频免费在线观看| 成人午夜看片网址| 波多野结衣与黑人| 综合欧美精品| 中文字幕日韩欧美| 天天操天天操天天操天天操天天操| 久久激情中文| 精品国产一区二区三区四区vr| av激情在线| 91精品免费在线观看| 黄大色黄女片18免费| 日韩中文字幕91| 奇米精品在线| 香蕉成人影院| 日韩午夜精品电影| 天天插天天射天天干| 九九免费精品视频在线观看| 中文字幕精品在线| 久久久久久久久久成人| 国产一区二区在线电影| 亚洲图片都市激情| 波多野一区二区| 日本国产一区二区| 少妇光屁股影院| 欧美电影《轻佻寡妇》| 国产精品精品国产| 国产99久一区二区三区a片 | 国产欧美日韩一级| 国产精品久久久久久久久久东京| 婷婷亚洲一区二区三区| 国产精品女同互慰在线看| 成人精品视频一区二区| 国产精品日韩精品在线播放| 亚洲第一精品自拍| 精品无码av在线| 成人黄色小视频在线观看| 日韩精品极品视频在线观看免费| 亚洲人免费短视频| 色哟哟亚洲精品一区二区| 91亚洲精品国偷拍自产在线观看| 99国产精品久久| 在线天堂一区av电影| 国产高潮在线| 亚洲欧美日韩中文在线制服| 久久久久亚洲av无码专区体验| 久久裸体视频| 亚洲一区二区三区色| 国产精品久一| 久久久综合av| www五月婷婷| 五月婷婷久久丁香| www..com.cn蕾丝视频在线观看免费版| 久久99久久久久| 欧美午夜精品久久久久免费视| 亚洲欧美成人影院| 欧美三级欧美一级| 免费a级黄色片| 免费日本视频一区| 清纯唯美一区二区三区| 亚洲精品自拍| 国精产品一区一区三区有限在线| 邻家有女韩剧在线观看国语| 91精品国产色综合久久久蜜香臀| 久久成人激情视频| 香蕉久久a毛片| 国产美女精品久久久| 欧美孕妇性xxxⅹ精品hd| 欧美影视一区二区三区| 国产精品成人免费观看| 久久久久久久综合色一本| 中文字幕成人免费视频| 一区二区三区精品视频在线观看| 99久热re在线精品视频| 国产网站在线免费观看| 6080亚洲精品一区二区| 亚洲免费在线观看av| 国产白丝精品91爽爽久久| 艳母动漫在线观看| 97久久中文字幕| 51午夜精品视频| 成人黄色网址| 亚洲最新视频在线| 亚洲av无码不卡| 亚洲成人精品一区| 免费在线观看一级片| 国产亚洲欧美中文| 天堂网在线免费观看| 日韩理论片av| 国产精品日韩欧美| 日本最新在线视频| 91精品国产91热久久久做人人| 一级黄色大片视频| 亚洲成av人片在www色猫咪| 午夜国产小视频| 国产一区二区在线观看免费| 熟妇人妻va精品中文字幕| 亚洲人成免费| 久久久天堂国产精品| 日韩激情免费| 视频二区一区| 久久99国产成人小视频| 国产一区二区三区奇米久涩| 中文在线综合| 91网免费观看| 精品国产亚洲日本| 91精品视频免费观看| 日本天码aⅴ片在线电影网站| 日韩在线视频免费观看高清中文 | 99视频一区二区三区| 亚洲成人av免费观看| 国产精品videossex久久发布| 国产精品日韩一区二区免费视频 | 久久精品人成| 奇米影视777在线欧美电影观看| 青青久久av北条麻妃海外网| 成人免费在线视频网| 亚洲女人天堂视频| 青梅竹马是消防员在线| 国产视频一区在线| 天堂av电影在线观看| 精品无人区乱码1区2区3区在线| 五月婷婷久久久| 欧美日韩免费观看一区二区三区 | 色一情一乱一乱一91av| 亚洲成人第一网站| 欧美综合一区二区| 免费人成在线观看| 久久久影视传媒| 欧美亚一区二区三区| 国产亚洲欧美在线| 最新黄色av网址| 亚洲人成伊人成综合网小说| 亚洲第一黄色网址| 91麻豆免费观看| 北条麻妃亚洲一区| 国产精品一区在线观看乱码| 韩国av中国字幕| 91一区二区在线| x88av在线| 亚洲色图第一区| 精品一区在线视频| 一本色道综合亚洲| 中文字幕在线2018| 欧美视频免费在线观看| 日韩欧美中文字幕视频| 亚洲午夜久久久久久久久久久 | 91视频这里只有精品| 国产盗摄女厕一区二区三区| 亚洲观看黄色网| 中文字幕不卡一区| yy6080午夜| 国产午夜精品一区二区| 人人干在线观看| 婷婷中文字幕综合| 中文字幕在线日亚洲9| 日韩午夜激情av| 欧美少妇另类| 麻豆国产va免费精品高清在线| 超碰高清在线| 国产美女扒开尿口久久久| 在线观看视频一区二区三区| 蜜桃视频在线观看成人| 亚洲欧洲美洲一区二区三区| 无码免费一区二区三区免费播放 | 深爱激情五月婷婷| 日韩三级免费观看| 手机看片福利在线| 综合国产在线视频| 成人免费图片免费观看| 久久中文字幕国产| 欧美成人精品欧美一级乱| 极品白浆推特女神在线观看| 色婷婷久久久久swag精品| 一级α片免费看刺激高潮视频| 精品国产青草久久久久福利| 91麻豆视频在线观看| 日韩欧美国产麻豆| 成人av无码一区二区三区| 亚洲系列中文字幕| 国产精品秘入口| 亚洲午夜未删减在线观看| 欧美videossex| 色综合五月天导航| 日本无删减在线| 国产欧美日韩中文字幕在线| 日韩激情网站| 欧美日韩综合另类| 国产精品v一区二区三区| 日韩精品视频一二三| www国产精品av| 69精品久久久| 欧美一级二级在线观看| 午夜在线视频播放| 国产精品91在线| 精品美女一区| 亚洲一区二区三区乱码aⅴ| 久久久久久久久久久久电影| 水蜜桃一区二区| 乱码第一页成人| 无码精品一区二区三区在线播放| 一区二区三区在线视频观看58| 国产又粗又大又爽视频| 伊人久久久久久久久久久| 丁香六月综合| 欧美18视频| 噜噜爱69成人精品| 国产成人精品无码免费看夜聊软件| 亚洲成av人影院| 手机在线观看毛片| 久久免费视频网| 国产伦精品一区二区三区免费优势 | 中文字幕一区二区三区四区免费看| 国产丝袜一区二区三区免费视频| gogo久久| 热久久99这里有精品| 卡通动漫国产精品| 日本婷婷久久久久久久久一区二区| 亚洲综合另类| 亚洲久久久久久久| 一本色道a无线码一区v| 可以在线观看的av| 国产精品福利网站| 日韩在线中文| 伊人影院综合在线| 亚洲欧洲国产专区| 欧美一区二区激情视频| 亚洲第一综合天堂另类专| 岛国片av在线| 狠狠爱一区二区三区| 性色一区二区三区| 波多野吉衣中文字幕| 国产精品国产馆在线真实露脸| 欧美色图一区二区| 欧美刺激脚交jootjob| 美女网站视频在线| 国模精品娜娜一二三区| 久久久精品日韩| 国产精品成人在线视频| 91精品国产手机| 免费v片在线观看| 日韩欧美精品一区二区三区经典| 蜜臀国产一区二区三区在线播放 | 欧美孕妇孕交| 国产精品自拍小视频| 午夜国产精品视频| 中文字幕在线综合| 亚洲美女免费在线| 最近中文字幕av| 亚洲精品视频在线播放 | 97超级碰碰| 亚洲全部视频| 国产福利在线导航| 精品美女一区二区三区| av在线第一页| 亚洲一区二区三区四区在线播放 | 亚洲一级片网站| 亚洲一区二区三区四区的| 免费看男男www网站入口在线| 成人激情视频在线| 一区二区三区福利| 日本成人精品视频| 日韩电影中文字幕| 午夜不卡一区| 色涩成人影视在线播放| 国产激情一区二区三区桃花岛亚洲| 亚洲精品视频在线观看免费视频| 中文字幕久久久av一区| 激情视频极品美女日韩| 日韩av卡一卡二| 日韩欧美主播在线| 在线观看午夜av|