mass Framework data模块 v4
对v3进行改进,原来是用两个引用数组为元素节点提供UUID,另外两个数组提供缓存体。v4中删掉Data类,只有一个数组来为元素节点提供UUID,再用一个数组提供缓存体。缓存体之上有一个data对象属性,用于保存用户数据。相对于v3与jQuery2.0的新方案,它会在没有私有数据与用户数据时,会把这两个数组对应位置上的元素删掉,防止无限膨胀。
//================================================== // 数据缓存模块 //================================================== define( "data" , [ "$lang" ], function ($) { var owners = [], caches = []; /** * 为目标对象指定一个缓存体 * @param {Any} owner * @return {Object} 缓存体 * @api private */ function add(owner) { var index = owners.push(owner); return caches[index - 1] = { data: {} }; } /** * 为目标对象读写数据 * @param {Any} owner * @param {Object|String} name ? 要处理的数据或数据包 * @param {Any} data ? 要写入的数据 * @param {Boolean} pvt ? 标识为内部数据 * @return {Any} * @api private */ function innerData(owner, name, data, pvt) { //IE678不能为文本节点注释节点添加数据 var index = owners.indexOf(owner); var table = index === -1 ? add(owner) : caches[index]; var getOne = typeof name === "string" //取得单个属性 var cache = table; //私有数据都是直接放到table中,普通数据放到table.data中 if (!pvt) { table = table.data; } if (name && typeof name == "object" ) { $.mix(table, name); //写入一组属性 } else if (getOne && data !== void 0) { table[name] = data; //写入单个属性 } if (getOne) { if (name in table) { return table[name]; } else if (!pvt && owner && owner.nodeType == 1) { //对于用HTML5 data-*属性保存的数据, 如<input id="test" data-full-name="Planet Earth"/> //我们可以通过$("#test").data("full-name")或$("#test").data("fullName")访问到 return $.parseData(owner, name, cache); } } else { return table; } } /** * 为目标对象移除数据 * @param {Any} owner * @param {Any} name ? 要移除的数据 * @param {Boolean} pvt ? 标识为内部数据 * @return {Any} * @api private */ function innerRemoveData(owner, name, pvt) { var index = owners.indexOf(owner); if (index > -1) { var delOne = typeof name == "string" , table = caches[index], cache = table, clear = 1 if (delOne) { if (!pvt) { table = table.data; } if (table) { delOne = table[name]; delete table[name]; } for ( var key in cache) { if (key == "data" ) { for ( var i in cache.data) { clear = 0; break ; } } else { clear = 0; break ; } } if (clear) { owners.splice(index, 1); caches.splice(index, 1); } } return delOne; //返回被移除的数据 } } $.mix({ //判定是否关联了数据 hasData: function (owner) { return owners.indexOf(owner) > -1; }, // 读写用户数据 data: function (target, name, data) { return innerData(target, name, data); }, //读写内部数据 _data: function (target, name, data) { return innerData(target, name, data, true ); }, //移除用户数据 removeData: function (target, name) { return innerRemoveData(target, name); }, //移除内部数据 _removeData: function (target, name) { return innerRemoveData(target, name, true ); }, //将HTML5 data-*的属性转换为更丰富有用的数据类型,并保存起来 parseData: function (target, name, cache, value) { var data, key = $.String.camelize(name), _eval if (cache && (key in cache)) return cache[key]; if (arguments.length != 4) { var attr = "data-" + name.replace(/([A-Z])/g, "-$1" ).toLowerCase(); value = target.getAttribute(attr); } if ( typeof value === "string" ) { //转换 /^(?:\{.*\}|null|false|true|NaN)$/ if (/^(?:\{.*\}|\[.*\]| null | false | true |NaN)$/.test(value) || +value + "" === value) { _eval = true ; } try { data = _eval ? eval( "0," + value) : value; } catch (e) { data = value; } if (cache) { cache[key] = data; } } return data; }, //合并数据 mergeData: function (cur, src) { if ($.hasData(cur)) { var oldData = $._data(src), curData = $._data(cur), events = oldData.events; $.Object.merge(curData, oldData); if (events) { curData.events = []; for ( var i = 0, item; item = events[i++];) { $.event.bind(cur, item); } } } } }); return $ }); |
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码


机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义