将数据存储到 DOM - 元素值与数据属性

2024-02-27

要将值存储在 DOM 元素中,我们可以通过data属性

$("#abc").data("item", 1),检索做$("#abc").data("item")

但今天我了解到我们也可以这样做:

$("#abc")[0].item = 1,检索做$("#abc)[0].item

它们之间有什么区别? 哪一个更好?哪一个具有更广泛的兼容性?


.data()存在有几个原因:

  1. 如果将 JS 对象放入 DOM 对象的属性中,某些(大多数是较旧的)浏览器会出现内存泄漏问题。这在 DOM 和 JS 世界(具有单独的垃圾收集器)之间创建了引用,这会导致问题并可能导致内存泄漏。通过使用将引用完全保留在 JS 世界中.data()而不是 DOM 属性解决了这个问题。老实说,我不知道这在现代浏览器中仍然是一个多大的问题。很难测试,使用已知安全的方法更容易。

  2. 从历史上看,某些宿主对象不支持使用直接属性语法添加任意属性,例如obj.prop = 1;. .data()这样您就可以将数据与任何对象关联起来,无论它是否有能力处理任意属性。

  3. 名称冲突。.data()在 DOM 对象上创建一个且唯一一个自定义属性,该属性只是一个 id 值(字符串)。然后您可以随意使用任何您想要的键.data()零担心与 DOM 对象上预先存在的属性名称发生冲突。.data()本质上是它自己的自定义属性的命名空间。

  4. 读取 HTML5“data-xxx”属性。当你读到一个.data("xxx")尚未写入实际 jQuery 数据存储的属性,jQuery 将读取"data-xxx"DOM 对象上的属性。如果它找到该属性,它会返回该值,并且实际上也会强制其类型,以便“false”变成 Javascriptfalse。如果你然后写.data("xxx", "foo"),该值不会覆盖到 DOM 对象上,而是写入 jQuery 存储,从那时起,所有未来的读写都来自 jQuery.data()店铺。这很有用的原因之一是自定义属性(与自定义属性不同)只能是字符串,但是.data("xxx", yyy)可以编写和存储任何JS数据类型。

因此,如果您想使用已知安全的方法,即使在较旧的浏览器中也不易发生内存泄漏,请使用.data()而不是在 DOM 对象上创建您自己的自定义属性。

我怀疑在未来的某个时候,浏览器可能会被认为足够安全,您可以将 JS 对象引用存储在自定义 DOM 属性中,而不必担心内存泄漏,此时可能没有太多理由使用类似的东西.data()- 尽管上面的问题 #3 仍然存在。


使用时有一些缺点.data().

  1. 如果您将大量数据存储在.data()然后你删除相应的 DOM 对象而不使用 jQuery 的方法来删除它(比如你使用.removeChild()直接或您只需设置.innerHTML在父级),数据存储在.data()store 将被孤立并且永远不会被清理,因为 jQuery 不知道相应的 DOM 对象已被删除。这将导致 javascript 中的一些数据保留在您永远不会使用的数据结构中。虽然从技术上讲这并不是泄漏(因为数据仍然可供使用),但它与浪费一些内存具有大致相同的效果。如果你使用.data(),您应该只使用 jQuery 方法来删​​除或替换 DOM 对象,因为它们可以防止浪费内存。

  2. 由于上述问题,当您使用 jQuery 的方法可能导致 DOM 对象被删除时,jQuery 必须做额外的工作来确保.data()使用自己的方法时会被清理。这会降低性能.html("xxx"), .remove(), etc...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据存储到 DOM - 元素值与数据属性 的相关文章

  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 通过 CDN 使用 Dojo 时如何加载自定义 AMD 模块?

    我正在使用 google 的 CDN 并尝试使用他们的加载程序加载我自己的 AMD 模块 我知道我做错了什么 但我被困住了 有任何想法吗
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • 如何判断 jquery 对话框是否打开? [复制]

    这个问题在这里已经有答案了 寻找通用案例解决方案来确定当前是否打开任何 jquery 对话框 有多个 试过 ui dialog content dialog isOpen true ui dialog dialog isOpen true
  • jQuery 获取元素内的鼠标位置

    我希望制作一个控件 用户可以在 div 内单击 然后拖动鼠标 然后松开鼠标以指示他们想要的内容有多长 这是针对日历控件的 因此用户将指示特定事件的时间长度 看起来最好的方法是在父 div 上注册一个 mousedown 事件 而父 div
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • Jquery 验证不能正确验证数字?

    我在使用 jquery 非侵入式验证验证数字时遇到问题 我使用的版本是 ASP NET MVC 3 jQuery 1 9 1 jQuery 用户界面 1 10 1 JQuery 验证 1 11 0 我试图验证的输入是
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • 在 ASP.NET Core MVC 中访问从视图到控制器的隐藏值

    我需要帮助使用 jQuery 从 ASP NET Core razor 视图页面传递隐藏控件值 jQuery 用于获取动态控件选定的值 section scripts
  • Javascript/Jquery:确定用户是否使用鼠标滚轮、滚动条或键盘滚动

    我正在尝试让用户界面正常工作 如果他们使用鼠标滚轮 我需要让它以一种方式滚动 如果他们使用滚动条 我需要让它以另一种方式滚动 如果他们使用键盘 我需要让它以另一种方式滚动 我相信滚轮和滚动条都充当鼠标事件 但是当单击滚动条时我无法让 jav
  • 如何在 AngularJS 循环内使用标签

    所以我在里面ng repeat像这样 li li

随机推荐