最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用原生JS實(shí)現(xiàn)data方法示例代碼

 更新時(shí)間:2019年05月28日 10:01:04   作者:拭目以待  
這篇文章主要給大家介紹了關(guān)于如何利用原生JS實(shí)現(xiàn)data方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用原生JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在開發(fā)中經(jīng)常會(huì)在DOM上存儲(chǔ)一些自定義數(shù)據(jù),我們可以通過setAttribute方法來實(shí)現(xiàn)。但是當(dāng)數(shù)據(jù)為引用類型時(shí),存儲(chǔ)后的數(shù)據(jù)卻無效。這里將用原生的JS對(duì)data方法進(jìn)行實(shí)現(xiàn)。

使用setAttribute:

<div id="test-data"></div>
<p class="test-data-list"></p>
<p class="test-data-list"></p>
<p class="test-data-list"></p>
<p class="test-data-list"></p>
var testData = document.querySeletor('#test-data');
testData.setAttribute('baukh', {a:1,b:2})// 執(zhí)行后DOM節(jié)點(diǎn)變化為<div baukh="[object Object]"></div>
testData.getAttribute('baukh'); // => "[object Object]"

可以從上面的代碼中看出,存進(jìn)去的是個(gè)Object,取出來的是Object.toString()所產(chǎn)出的字符串。

分析

在JS經(jīng)典類庫-jQuery中存在data方法是通過jQuery.cache的方式進(jìn)行數(shù)據(jù)存儲(chǔ),那么還有沒有其它方法可以實(shí)現(xiàn)?

由于使用場(chǎng)景不同,我想實(shí)現(xiàn)的方式是將數(shù)據(jù)直接存儲(chǔ)到DOM節(jié)點(diǎn)上,以達(dá)到使用時(shí)更方便簡(jiǎn)捷的目的。

那如何存儲(chǔ)? 變量testData存儲(chǔ)的是通過document.querySeletor('#test-data')獲取到的Element,而Element是Object的一個(gè)實(shí)例。通過[testData instanceof Object]可以進(jìn)行驗(yàn)證。

那么一切都簡(jiǎn)易了,即然是Object類型,那么就可以隨意的增刪自定義屬性。

通過在Element的原型上增加data方法來實(shí)現(xiàn)DOM擴(kuò)展

Element.prototype.data = function(key, value){
 var _this = this,
  _dataName = 'testData', // 存儲(chǔ)至DOM上的對(duì)象標(biāo)記, 這里只是測(cè)試用名
  _data = {};
 // 未指定參數(shù),返回全部
 if(typeof key === 'undefined' && typeof value === 'undefined'){
  return _this[_dataName];
 }
 // setter
 if(typeof(value) !== 'undefined'){
  // 存儲(chǔ)值類型為字符或數(shù)字時(shí), 使用attr執(zhí)行
  var _type = typeof(value);
  if(_type === 'string' || _type === 'number'){
   _this.setAttribute(key, value);
  }
  _data = _this[_dataName] || {};
  _data[key] = value;
  _this[_dataName] = _data;
  return this;
 }
 // getter
 else{
  _data = _this[_dataName] || {};
  return _data[key] || _this.getAttribute(key);
 }
};

這里來試一下:

var testData = document.querySelector('#test-data');
// 字符串類型測(cè)試
testData.data('name', 'baukh');
console.log(testData.data('name')); // => 'baukh'
// 對(duì)象類型測(cè)試
testData.data('info', {'name': 'baukh', 'age': 27});
console.log(testData.data('info')); // => Object {name: "baukh", age: 27}

解決NodeList存儲(chǔ)

現(xiàn)在還有一個(gè)問題, 通過Element.prototype綁定的方法只支持Element類生效,而對(duì)NodeList類并無效果.

可以通過下面這些代碼進(jìn)行效果測(cè)試:

var testDataList = document.querySelectorAll('.test-data-list'); // 獲取的為NodeList 而非 Element
testDataList.data('name', 'baukh'); // Uncaught TypeError: testDataList.data is not a function

這肯定不是想要的結(jié)果, 那么NodeList類就需要如下處理:

NodeList.prototype.data = function (key, value) {
 // setter
 if(typeof(value) !== 'undefined'){
  [].forEach.call(this, function (element, index) {
   element.data(key, value);
  });
  return this;
 }
 // getter
 else{
  return this[0].data(key, value); // getter 將返回第一個(gè)
 }
};

來測(cè)試下NodeList類的data實(shí)現(xiàn):

var testDataList = document.querySelectorAll('.test-data-list'); // 獲取的為NodeList 而非 Element
testDataList.data('name', 'baukh'); // Uncaught TypeError: testDataList.data is not a function
// 字符串類型測(cè)試
testDataList.data('name', 'baukh');
console.log(testDataList.data('name')); // => 'baukh'
// 對(duì)象類型測(cè)試
testDataList.data('info', {'name': 'baukh', 'age': 27});
console.log(testDataList.data('info')); // => Object {name: "baukh", age: 27}

這樣就功能上就完成了.

當(dāng)然也可以將NodeList與Element進(jìn)行互換, 具體情況具體考慮.

很簡(jiǎn)單不是嗎?

順帶說一下,Array類型的數(shù)據(jù),也可以增加自定義屬性。

var ar = [1,2,3];
console.log(ar instanceof Object); //true 能添加自定義屬性的原因就在這里,Array也是Object的實(shí)例。
ar.test1 = {a:1,b:2};
console.log(ar); //[1, 2, 3, test1: Object]
console.log(ar.test1); //Object {a: 1, b: 2}

隨筆一行

這是前端最好的時(shí)代, 這也是前端最壞的時(shí)代。 眾多前端框架滿天飛,隨著 jQuery 在前端行業(yè)的慢慢弱化,總是會(huì)有一種斯人遠(yuǎn)去,何者慰籍的感覺?;ッ惆?,各位。

另推薦個(gè)表格組件gridManager

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • BootStrap入門教程(一)之可視化布局

    BootStrap入門教程(一)之可視化布局

    這篇文章主要介紹了bootstrap可視化布局入門教程的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • JavaScript判斷文件是否存在的實(shí)例代碼

    JavaScript判斷文件是否存在的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于JavaScript判斷文件是否存在的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 如何在CocosCreator中利用常駐節(jié)點(diǎn)做圖層管理

    如何在CocosCreator中利用常駐節(jié)點(diǎn)做圖層管理

    這篇文章主要介紹了如何在CocosCreator中利用常駐節(jié)點(diǎn)做圖層管理,這些技巧非常實(shí)用,希望同學(xué)們看完,回去可以試一下
    2021-04-04
  • 微信小程序調(diào)用支付接口的完整流程記錄

    微信小程序調(diào)用支付接口的完整流程記錄

    我們?cè)谧鲂〕绦蛑Ц断嚓P(guān)的開發(fā)時(shí),總會(huì)遇到這些難題,下面這篇文章主要給大家介紹了關(guān)于微信小程序調(diào)用支付接口的完整流程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 理解Javascript_13_執(zhí)行模型詳解

    理解Javascript_13_執(zhí)行模型詳解

    在《理解Javascript_12_執(zhí)行模型淺析》一文中,我們初步的了解了執(zhí)行上下文與作用域的概念,那么這一篇將深入分析執(zhí)行上下文的構(gòu)建過程,了解執(zhí)行上下文、函數(shù)對(duì)象、作用域三者之間的關(guān)系。
    2010-10-10
  • javascript封裝addLoadEvent實(shí)現(xiàn)頁面同時(shí)加載執(zhí)行多個(gè)函數(shù)的方法

    javascript封裝addLoadEvent實(shí)現(xiàn)頁面同時(shí)加載執(zhí)行多個(gè)函數(shù)的方法

    這篇文章主要介紹了javascript封裝addLoadEvent實(shí)現(xiàn)頁面同時(shí)加載執(zhí)行多個(gè)函數(shù)的方法,實(shí)例分析了onload事件執(zhí)行的原理與同時(shí)執(zhí)行多個(gè)函數(shù)功能的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-07-07
  • Three.js GLTF模型加載實(shí)現(xiàn)示例詳解

    Three.js GLTF模型加載實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了Three.js GLTF模型加載實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Webpack性能優(yōu)化 DLL 用法詳解

    Webpack性能優(yōu)化 DLL 用法詳解

    本篇文章主要介紹了Webpack DLL 用法詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 解決layui輪播圖有數(shù)據(jù)不顯示的情況

    解決layui輪播圖有數(shù)據(jù)不顯示的情況

    今天小編就為大家分享一篇解決layui輪播圖有數(shù)據(jù)不顯示的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript如何獲取到導(dǎo)航條中HTTP信息

    JavaScript如何獲取到導(dǎo)航條中HTTP信息

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何獲取到導(dǎo)航條中HTTP信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

阿勒泰市| 岢岚县| 宁城县| 彭水| 揭东县| 兰西县| 兴和县| 张掖市| 巴林右旗| 灌阳县| 阿合奇县| 寿光市| 巨鹿县| 会理县| 苏州市| 陇南市| 平乐县| 洛南县| 南昌县| 樟树市| 滦南县| 白水县| 闽侯县| 库车县| 图们市| 五寨县| 定远县| 岳阳县| 宝应县| 兴安县| 邹平县| 开封市| 皋兰县| 定西市| 尖扎县| 潼关县| 新和县| 茶陵县| 临猗县| 武川县| 榆社县|