<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      你不需要 jQuery,但你需要一個(gè) DOM 庫(kù)

      寫這篇文章的目的,一方面是介紹一下自己編寫的模塊化 DOM 庫(kù) domq.js,另一方面是希望大家對(duì) jQuery 有一個(gè)正確的認(rèn)識(shí),即使 jQuery 已經(jīng)逐漸退出歷史舞臺(tái),但是它的 API 將會(huì)以另外一種形式存在下去。

      GitHub:https://github.com/nzbin/domq

      文檔:https://nzbin.gitbooks.io/domq-api/usage.html

      jQuery 不會(huì)死去

      從 GitHub 放棄 jQuery,再到 Bootstrap 5 宣布移除 jQuery,看來(lái)一個(gè)時(shí)代終究要落下帷幕。

      為什么我們會(huì)放棄 jQuery 呢?原因無(wú)非這樣幾個(gè):不需要再進(jìn)行瀏覽器的兼容,原生 DOM 查找已經(jīng)很方便,AJAX 請(qǐng)求有更好的替代方式等等。

      在我看來(lái) jQuery 最大的弊端是無(wú)法分模塊引入,直接引入整個(gè)庫(kù)實(shí)在有些不妥,畢竟太多功能已經(jīng)沒(méi)有用武之地。但是 jQuery 的 DOM 操作依然很有必要。很多人對(duì)我的這個(gè)觀點(diǎn)有些疑問(wèn)。其實(shí)在使用 MVVM 框架的時(shí)候,DOM 操作確實(shí)已經(jīng)很少。但是我們也不可能總是做一些 CRUD 的功能。對(duì)于復(fù)雜的業(yè)務(wù)需求仍然需要一些 DOM 操作。

      假如 jQuery 可以把 DOM 操作相關(guān)的功能模塊分離出來(lái),或許還有很大的使用空間。

      YouDontNeedJQuery,YouMightNotNeedjQuery等。就我個(gè)人而言,純 JS 操作確實(shí)很簡(jiǎn)單,但是并不是很優(yōu)雅,復(fù)雜一點(diǎn)的操作還要經(jīng)常翻 MDN。

      // jQuery
      $('.my #awesome selector');
      
      // JS
      document.querySelectorAll('.my #awesome selector');
      
      // jQuery
      $(el).hide();
      
      // JS
      el.style.display = 'none';
      
      // jQuery
      $(el).after(htmlString);
      
      // JS
      el.insertAdjacentHTML('afterend', htmlString);
      

      以上是 jQuery 和原生 JS 對(duì)比的一個(gè)縮影,結(jié)果顯而易見(jiàn),jQuery 的 API 更加簡(jiǎn)潔。除此之外,jQuery API 的使用形式也非常統(tǒng)一。相反,原生 JS 的 API 使用方式就比較多樣了,既有賦值,又有傳參等。另外原生 JS 的 API 名稱冗長(zhǎng),不方便記憶。這也是很多 JS 庫(kù)誕生的意義。

      很多插件一般都會(huì)有一個(gè) utils 的文件,基本會(huì)對(duì)原生方法做一個(gè)簡(jiǎn)單封裝并提供一些工具方法。

      Zepto 的優(yōu)勢(shì)與弱勢(shì)

      Zepto 是一個(gè)思想超前的庫(kù),為什么我會(huì)有這樣的結(jié)論?Zepto 對(duì)原生方法做了進(jìn)一步的抽象,使用更簡(jiǎn)單。正如我在上文說(shuō)過(guò)的,既然 jQuery 的 API 簡(jiǎn)潔易用,而且我們也更加熟悉,那我們?yōu)槭裁床粚?jQuery 和原生 JS 結(jié)合起來(lái)呢?令人驚訝的是,早在 2010 年,Zepto 的作者就已經(jīng)這樣去做了。用原生 JS 實(shí)現(xiàn)了 jQuery 的大部分 API,可替代率接近九成吧,至少在我編寫的插件中,幾乎可以替換掉所有的 jQuery API。而且 Zepto 也不是一味的使用 document.querySelector 方法,而是根據(jù)性能優(yōu)劣,有選擇的使用 document.getElementById 以及 document.querySelector 等。

      但是 Zepto 也有一些顯而易見(jiàn)的缺陷,畢竟還是上個(gè)時(shí)代的產(chǎn)物,首先就是無(wú)法按需加載,現(xiàn)在我們?cè)趯戫?xiàng)目的時(shí)候更愿意根據(jù)自己的需要引入某些方法,而不是將整個(gè)庫(kù)全部引入,雖然 Zepto 的體積不大,但是作為強(qiáng)迫癥還是有一些厭惡。另外就是 Zepto 本身也有一些 bug,比如 scrollTopscrollLeft 方法。其它不同參見(jiàn)源碼。

      // Zepto
      scrollTop: function(value) {
          if (!this.length) return
          var hasScrollTop = 'scrollTop' in this[0]
          if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset
          return this.each(hasScrollTop ?
              function() { this.scrollTop = value } :
              function() { this.scrollTo(this.scrollX, value) })
      }
      

      document 元素?zé)o法獲得正確的值,我對(duì)這個(gè)問(wèn)題提過(guò) pr 但是沒(méi)有回應(yīng),Zepto 目前基本已經(jīng)停止維護(hù)。正確的方法如下:

      // Domq
      function scrollTop(value) {
          if (!this.length) return
          var hasScrollTop = 'scrollTop' in this[0]
          if (value === undefined) return hasScrollTop
              ? this[0].scrollTop
              : isWindow(this[0])
                  ? this[0].pageYOffset
                  : this[0].defaultView.pageYOffset;
          return this.each(hasScrollTop ?
              function () { this.scrollTop = value } :
              function () { this.scrollTo(this.scrollX, value) })
      }
      

      Domq 的使命

      形如 jQuery 的 DOM 操作庫(kù)有很多,比如 bonzo$dom,但是在我重構(gòu) jQuery 插件時(shí),我發(fā)現(xiàn)沒(méi)有辦法用這些庫(kù)直接替換 jQuery,只有 Zepto 相對(duì)完美,但是我又不希望引入額外的無(wú)用的方法。

      最后我決定改造 Zepto,使之更符合現(xiàn)在的使用習(xí)慣。多說(shuō)一點(diǎn),個(gè)人覺(jué)得 Zepto 的核心函數(shù)稍顯凌亂,命名空間既有 zepto、又有 $Z,感覺(jué)非常混亂,而 domq 的核心函數(shù)只有 D 這一個(gè)命名空間,形態(tài)及功能和 jQuery 的核心函數(shù)幾乎一樣,可以認(rèn)為是一個(gè) mini 版的 jQuery。

      // Zepto 核心方法
      var Zepto = (function() {
          var zepto = {};
          ...
          zepto.Z = function(dom, selector) {
              return new Z(dom, selector)
          }
          ...
          $ = function(selector, context) {
              return zepto.init(selector, context)
          }
          ...
      })()
      
      // Domq 核心方法
      var D = function (selector, context) {
          return new D.fn.init(selector, context);
      }
      
      D.fn = D.prototype = {
      	...
      	init: function(){
      		...
      	}
      	...
      }
      

      當(dāng)然, Domq 最關(guān)鍵的還是按需加載,根據(jù)需要掛載方法,盡量減少不必要的代碼。使用方式很簡(jiǎn)單,但是你需要?jiǎng)?chuàng)建一個(gè)獨(dú)立文件,重新掛載需要的方法到 D 命名空間上,這在編寫插件時(shí)非常有用。

      import {
        D,
        isArray,
        addClass
      } from 'domq.js/src/domq.modular';
      
      // 靜態(tài)方法
      const methods = {
        isArray
      }
      
      // 原型方法
      const fnMethods = {
        addClass
      }
      
      D.extend(methods);
      D.fn.extend(fnMethods);
      

      另外,在做項(xiàng)目時(shí)經(jīng)常會(huì)用到一些工具方法,這時(shí)候用一個(gè)工具庫(kù)暴露這些方法或許是最好的方式。Domq 也有一些常用的工具方法,不過(guò)還需要再迭代一下。

      D.type()
      D.contains()
      D.camelCase()
      D.isFunction()
      D.isWindow()
      D.isEmptyObject()
      D.isPlainObject()
      D.isNumeric()
      D.isArray()
      D.inArray()
      ...
      

      Domq 沒(méi)有太多新的東西,所以也沒(méi)有太多可以介紹的,它已經(jīng)在插件 PhotoViewer 以及實(shí)際項(xiàng)目中得以運(yùn)用,歡迎大家下載使用。

      總結(jié)

      這是一個(gè)好的時(shí)代,也是一個(gè)壞的時(shí)代,jQuery 的落幕確實(shí)讓人感嘆,但是我們完全沒(méi)必要因?yàn)?jQuery 的落幕而放棄 jQuery 的使用方式。正如前文所說(shuō),jQuery 的 DOM 操作在我看來(lái)依然是最好用的,所以,你不需要 jQuery,但你需要一個(gè) DOM 庫(kù)。

      GitHub:https://github.com/nzbin/domq

      posted @ 2019-03-26 07:54  敘帝利  閱讀(5584)  評(píng)論(31)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲欧美在线一区中文字幕| 免费观看又色又爽又黄的崩锅| 狠狠v日韩v欧美v| 不卡视频在线一区二区三区| 亚洲日韩国产精品第一页一区| 日韩在线视频网| 国产一区二区不卡精品视频| 人妻va精品va欧美va| 久热这里只有精品视频3| 久久精品免视看国产成人| 久久久久久久无码高潮| 亚洲精品自拍视频在线看| 国产好大好硬好爽免费不卡| 小污女小欲女导航| 体态丰腴的微胖熟女的特征| 日韩少妇内射免费播放| 亚洲成人av一区二区| 国产一区二区日韩经典| 通州市| 欧美人与动牲交A免费观看| 色综合色国产热无码一| 国产超碰无码最新上传| 久久综合给合久久狠狠狠88| 亚洲国产综合自在线另类| 日本三级理论久久人妻电影| 国产乱对白刺激视频| 蜜桃在线一区二区三区| 爆乳女仆高潮在线观看| 福利视频一区二区在线| 定兴县| 亚洲精品一区二区三区大桥未久| 狠狠色综合网站久久久久久久| 老熟女高潮一区二区三区| 亚洲天堂亚洲天堂亚洲色图| 久久综合久久美利坚合众国| 极品少妇无套内射视频| 欧美乱妇高清无乱码免费| 国产在线国偷精品免费看| 熟女性饥渴一区二区三区| 国产suv精品一区二区四| 激情综合网五月激情五月|