国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

原生JS實(shí)現(xiàn)data方法

wenyiweb / 2258人閱讀

摘要:在開(kāi)發(fā)中經(jīng)常會(huì)在上存儲(chǔ)一些自定義數(shù)據(jù),我們可以通過(guò)方法來(lái)實(shí)現(xiàn)。這里將用原生的對(duì)方法進(jìn)行實(shí)現(xiàn)。能添加自定義屬性的原因就在這里,也是的實(shí)例。

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

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

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

分析

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

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

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

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

通過(guò)在Element的原型上增加data方法來(lái)實(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);
    }
};
這里來(lái)試一下:
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è)問(wèn)題, 通過(guò)Element.prototype綁定的方法只支持Element類生效,而對(duì)NodeList類并無(wú)效果.

可以通過(guò)下面這些代碼進(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è)
    }
};
來(lái)測(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)單不是嗎?

順帶說(shuō)一下,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)去,何者慰籍的感覺(jué)。互勉吧,各位。

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109887.html

相關(guān)文章

  • 原生App與javascript交互之JSBridge接口原理、設(shè)計(jì)與實(shí)現(xiàn)

    摘要:相關(guān)參考中與之間相互調(diào)用的實(shí)現(xiàn)實(shí)現(xiàn)了與相同的機(jī)制的對(duì)象注入漏洞解決方案存在的意義 前期調(diào)研 調(diào)研對(duì)象:支付寶,微信,云之家 調(diào)研文檔:Android中JS與Java的極簡(jiǎn)交互庫(kù) SimpleJavaJsBridge 設(shè)計(jì)需求 閱讀類型的業(yè)務(wù)功能頁(yè)面需要由前端H5實(shí)現(xiàn),需要做到服務(wù)端可控; 頁(yè)面界面更改減少重新發(fā)布新版本的頻率; 功能頁(yè)面部分原型需求無(wú)法實(shí)現(xiàn),需要原生功能支持; 對(duì)未來(lái)...

    Lyux 評(píng)論0 收藏0
  • (轉(zhuǎn))iOS- JSBridge的原理

    摘要:作者心葉時(shí)間原理概述簡(jiǎn)介是代碼與代碼的通信橋梁。目前的一種統(tǒng)一方案是觸發(fā)捕獲原生分析執(zhí)行原生調(diào)用。另外調(diào)用時(shí)處理完畢后一定要及時(shí)通知進(jìn)行回調(diào)要不然這個(gè)回調(diào)函數(shù)不會(huì)自動(dòng)銷毀多了后會(huì)引發(fā)內(nèi)存泄漏。 作者:心葉時(shí)間:2019-03-25 10:18 原理概述 簡(jiǎn)介 JSBridge是Native代碼與JS代碼的通信橋梁。目前的一種統(tǒng)一方案是:H5觸發(fā)url scheme->Native捕獲u...

    txgcwm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<