亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

利用原生JS實現data方法示例代碼

2019-11-19 11:27:05
字體:
來源:轉載
供稿:網友

前言

在開發中經常會在DOM上存儲一些自定義數據,我們可以通過setAttribute方法來實現。但是當數據為引用類型時,存儲后的數據卻無效。這里將用原生的JS對data方法進行實現。

使用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})// 執行后DOM節點變化為<div baukh="[object Object]"></div>testData.getAttribute('baukh'); // => "[object Object]"

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

分析

在JS經典類庫-jQuery中存在data方法是通過jQuery.cache的方式進行數據存儲,那么還有沒有其它方法可以實現?

由于使用場景不同,我想實現的方式是將數據直接存儲到DOM節點上,以達到使用時更方便簡捷的目的。

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

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

通過在Element的原型上增加data方法來實現DOM擴展

Element.prototype.data = function(key, value){ var _this = this,  _dataName = 'testData', // 存儲至DOM上的對象標記, 這里只是測試用名  _data = {}; // 未指定參數,返回全部 if(typeof key === 'undefined' && typeof value === 'undefined'){  return _this[_dataName]; } // setter if(typeof(value) !== 'undefined'){  // 存儲值類型為字符或數字時, 使用attr執行  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');// 字符串類型測試testData.data('name', 'baukh');console.log(testData.data('name')); // => 'baukh'// 對象類型測試testData.data('info', {'name': 'baukh', 'age': 27});console.log(testData.data('info')); // => Object {name: "baukh", age: 27}

解決NodeList存儲

現在還有一個問題, 通過Element.prototype綁定的方法只支持Element類生效,而對NodeList類并無效果.

可以通過下面這些代碼進行效果測試:

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

這肯定不是想要的結果, 那么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 將返回第一個 }};

來測試下NodeList類的data實現:

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

這樣就功能上就完成了.

當然也可以將NodeList與Element進行互換, 具體情況具體考慮.

很簡單不是嗎?

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

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

隨筆一行

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

另推薦個表格組件gridManager

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产自产在线老师啪| 国产91成人video| 亚洲在线视频福利| 国产精品白嫩美女在线观看| 国产精品亚洲激情| 中文字幕精品www乱入免费视频| 久久久久久91香蕉国产| 欧美麻豆久久久久久中文| 日本久久久久久| yellow中文字幕久久| 红桃av永久久久| 伊人久久综合97精品| 91黑丝高跟在线| 亚洲精品aⅴ中文字幕乱码| 精品色蜜蜜精品视频在线观看| 国产精品久久久久999| 亚洲成人av中文字幕| 国产成人综合精品在线| 97色在线播放视频| 精品偷拍各种wc美女嘘嘘| 国内揄拍国内精品少妇国语| 国产精品视频免费在线| 亚洲欧洲日产国产网站| 一区二区欧美激情| 欧美国产乱视频| 亚洲最大成人免费视频| 91超碰中文字幕久久精品| 91视频免费网站| 欧美亚洲一区在线| 亚洲成人教育av| 成人a在线视频| 亚洲综合最新在线| 日韩69视频在线观看| 伊人久久久久久久久久| 国产精品第一区| 久久精品国产免费观看| 亚洲色图综合网| 国产一区二区三区三区在线观看| 疯狂做受xxxx高潮欧美日本| 亚洲精品动漫久久久久| 色婷婷综合久久久久中文字幕1| 精品久久久中文| 久青草国产97香蕉在线视频| 亚洲精品资源在线| 麻豆一区二区在线观看| 7m精品福利视频导航| 九九热最新视频//这里只有精品| 亚洲成人av片| 欧洲永久精品大片ww免费漫画| 国产精品一区专区欧美日韩| 精品一区精品二区| 久久久国产一区二区三区| 亚洲黄色在线看| 日韩中文字幕在线免费观看| 在线观看欧美日韩| 国产精品第二页| 亚洲国产精品免费| 日韩欧美国产一区二区| 中文字幕免费精品一区高清| 欧美一级淫片videoshd| 国产亚洲欧洲黄色| 欧美性极品少妇精品网站| 亚洲男人天堂手机在线| 成人日韩av在线| 久久久久久这里只有精品| 欧美日韩国产精品一区二区不卡中文| 国产精品极品美女在线观看免费| 欧美日本精品在线| 色偷偷av一区二区三区乱| 国产成人精品av在线| 91精品国产自产在线老师啪| 亚洲成成品网站| 亚洲精品国产综合区久久久久久久| 久久视频国产精品免费视频在线| 中文字幕av一区中文字幕天堂| 欧美有码在线观看视频| 91九色蝌蚪国产| 国产精品美女主播| 国产精品露脸自拍| 26uuu亚洲国产精品| 久久资源免费视频| 国产精品偷伦免费视频观看的| 精品偷拍一区二区三区在线看| 777777777亚洲妇女| 成人精品久久一区二区三区| 中文字幕精品一区久久久久| 国产精品美女网站| 中文字幕精品国产| 97**国产露脸精品国产| 久久精品在线视频| 国产亚洲视频中文字幕视频| 国产日韩欧美成人| 国产一区二区三区在线看| 国外成人在线直播| 国产精品一区二区久久久| 欧美大片在线影院| 精品国产依人香蕉在线精品| 亚洲一区二区精品| 国产精品成人观看视频国产奇米| 青草青草久热精品视频在线网站| 久久久久久999| 欧美一区二粉嫩精品国产一线天| 欧美午夜激情在线| 欧美性色xo影院| 国产香蕉精品视频一区二区三区| 精品电影在线观看| 青青草原成人在线视频| 亚洲第一级黄色片| 在线午夜精品自拍| 超碰97人人做人人爱少妇| 亚洲精品99999| 国产69精品久久久久9999| 国产精品免费一区二区三区都可以| 欧美多人乱p欧美4p久久| 奇米四色中文综合久久| 日韩高清a**址| 欧美一区二区影院| 亚洲自拍欧美另类| 亚洲精品久久久久中文字幕欢迎你| 精品国产乱码久久久久酒店| 欧美专区在线观看| 国产精品视频播放| 在线观看日韩www视频免费| 欧美激情一区二区久久久| 影音先锋欧美在线资源| 在线观看欧美www| 久久久久久久一区二区三区| 欧美成人午夜激情视频| 国产91热爆ts人妖在线| 久久国产精品久久久久久| 欧美精品久久一区二区| 国产精品色悠悠| 久久国产精品影片| 免费av一区二区| 亚洲成人网在线| 中文字幕少妇一区二区三区| 亚洲在线免费看| 俺也去精品视频在线观看| 国产午夜精品免费一区二区三区| 欧美日韩加勒比精品一区| 午夜精品国产精品大乳美女| 欧美大片va欧美在线播放| 黑人巨大精品欧美一区二区一视频| 欧美大片免费观看| 日韩电影免费在线观看中文字幕| 成人黄色av网| 日韩中文字幕在线视频播放| 欧美电影免费观看高清完整| 欧美亚洲国产视频| 亚洲最新av在线网站| 久久69精品久久久久久久电影好| 亚洲亚裔videos黑人hd| 日韩中文字幕在线视频| 国产精品一区二区久久久久| 亚州国产精品久久久| 一个人www欧美| 欧美成人免费在线观看| 97在线精品视频| 九九热这里只有在线精品视| 久久精品91久久香蕉加勒比| 日韩性生活视频| 欧美亚洲激情在线| 91久久久国产精品| 91九色国产在线|