摘要:在開發(fā)中經(jīng)常會在上存儲一些自定義數(shù)據(jù),我們可以通過方法來實現(xiàn)。這里將用原生的對方法進(jìn)行實現(xiàn)。能添加自定義屬性的原因就在這里,也是的實例。
在開發(fā)中經(jīng)常會在DOM上存儲一些自定義數(shù)據(jù),我們可以通過setAttribute方法來實現(xiàn)。但是當(dāng)數(shù)據(jù)為引用類型時,存儲后的數(shù)據(jù)卻無效。這里將用原生的JS對data方法進(jìn)行實現(xiàn)。使用setAttribute:
var testData = document.querySeletor("#test-data"); testData.setAttribute("baukh", {a:1,b:2})// 執(zhí)行后DOM節(jié)點變化為 testData.getAttribute("baukh"); // => "[object Object]"
可以從上面的代碼中看出,存進(jìn)去的是個Object,取出來的是Object.toString()所產(chǎn)出的字符串。
分析在JS經(jīng)典類庫-jQuery中存在data方法是通過jQuery.cache的方式進(jìn)行數(shù)據(jù)存儲,那么還有沒有其它方法可以實現(xiàn)?
由于使用場景不同,我想實現(xiàn)的方式是將數(shù)據(jù)直接存儲到DOM節(jié)點上,以達(dá)到使用時更方便簡捷的目的。
那如何存儲? 變量testData存儲的是通過document.querySeletor("#test-data")獲取到的Element,而Element是Object的一個實例。通過[testData instanceof Object]可以進(jìn)行驗證。
那么一切都簡易了,即然是Object類型,那么就可以隨意的增刪自定義屬性。
通過在Element的原型上增加data方法來實現(xiàn)DOM擴(kuò)展Element.prototype.data = function(key, value){ var _this = this, _dataName = "testData", // 存儲至DOM上的對象標(biāo)記, 這里只是測試用名 _data = {}; // 未指定參數(shù),返回全部 if(typeof key === "undefined" && typeof value === "undefined"){ return _this[_dataName]; } // setter if(typeof(value) !== "undefined"){ // 存儲值類型為字符或數(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"); // 字符串類型測試 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存儲
現(xiàn)在還有一個問題, 通過Element.prototype綁定的方法只支持Element類生效,而對NodeList類并無效果.
可以通過下面這些代碼進(jìn)行效果測試:
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 將返回第一個 } };來測試下NodeList類的data實現(xiàn):
var testDataList = document.querySelectorAll(".test-data-list"); // 獲取的為NodeList 而非 Element testDataList.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}
這樣就功能上就完成了.
當(dāng)然也可以將NodeList與Element進(jìn)行互換, 具體情況具體考慮.
很簡單不是嗎?
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 在前端行業(yè)的慢慢弱化,總是會有一種斯人遠(yuǎn)去,何者慰籍的感覺?;ッ惆桑魑?。
另推薦個表格組件gridManager
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/109887.html
摘要:相關(guān)參考中與之間相互調(diào)用的實現(xiàn)實現(xiàn)了與相同的機(jī)制的對象注入漏洞解決方案存在的意義 前期調(diào)研 調(diào)研對象:支付寶,微信,云之家 調(diào)研文檔:Android中JS與Java的極簡交互庫 SimpleJavaJsBridge 設(shè)計需求 閱讀類型的業(yè)務(wù)功能頁面需要由前端H5實現(xiàn),需要做到服務(wù)端可控; 頁面界面更改減少重新發(fā)布新版本的頻率; 功能頁面部分原型需求無法實現(xiàn),需要原生功能支持; 對未來...
摘要:作者心葉時間原理概述簡介是代碼與代碼的通信橋梁。目前的一種統(tǒng)一方案是觸發(fā)捕獲原生分析執(zhí)行原生調(diào)用。另外調(diào)用時處理完畢后一定要及時通知進(jìn)行回調(diào)要不然這個回調(diào)函數(shù)不會自動銷毀多了后會引發(fā)內(nèi)存泄漏。 作者:心葉時間:2019-03-25 10:18 原理概述 簡介 JSBridge是Native代碼與JS代碼的通信橋梁。目前的一種統(tǒng)一方案是:H5觸發(fā)url scheme->Native捕獲u...
閱讀 1139·2021-11-15 18:11
閱讀 3235·2021-09-22 15:33
閱讀 3535·2021-09-01 11:42
閱讀 2722·2021-08-24 10:03
閱讀 3682·2021-07-29 13:50
閱讀 2980·2019-08-30 14:08
閱讀 1335·2019-08-28 17:56
閱讀 2320·2019-08-26 13:57