Tag: expando

为什么jQuery的.data()函数能更好地防止内存泄漏?

关于jQuery实用程序函数jQuery.data(),在线文档说: “jQuery.data()方法允许我们以一种不受循环引用安全的方式将任何类型的数据附加到DOM元素,从而避免内存泄漏。” 为什么使用: document.body.foo = 52; 可以导致内存泄漏 – 或者在什么条件下 – 以便我应该使用 jQuery.data(document.body, ‘foo’, 52); 在任何情况下,我是否总是更喜欢.data()而不是使用expandos? (如果你能提供一个比较差异的例子,我将不胜感激) 谢谢, burak ozdogan

为什么JQuery没有公开其UUIDfunction?

在引擎盖下,JQuery使用“UUIDs”(它只是一个jQuery.uuid维护的计数器)的jQuery.uuid来解决浏览器在从Javascript中将属性附加到DOM中的标记时众所周知的内存泄漏问题。 代替这样做,JQuery使用$.data(tag, name, value)将数据存储在从uuid键入的映射中(可以通过检查tag[jQuery.expando]来确定的键)。 虽然$.data()非常有用,但有时您希望将数据映射到标记而不将数据转储到一个全局存储桶中 – 您需要自己的小数据桶,例如,检查或循环的长度通过。 作为一个人为的例子,假设你有点击时可以旋转通过4种状态之一的图标。 当一个处于状态2时,您希望将其添加到状态2中的图标数组。最明显的方法是将标记添加到数组中; 但这样做会造成内存泄漏。 你可以在复选框上调用$.data() ,但这并不能完成你想要做的事情 – 你必须遍历检查$.data()所有复选框,以确定哪些是并且不在列表中。 你需要在一个数组中存储一些标签的抽象,这就是jQuery的UUID。 您可以编写自己的UUIDfunction,但理想情况下,您只需利用已内置于JQuery的UUIDfunction,以实现代码大小和质量原因。 您可以通过调用$.data(tag, ‘irrelevant’, 1)隐式地将JUI附加到$.data(tag, ‘irrelevant’, 1)然后检查tag[jQuery.expando]以获取其UUID,最后在列表中使用它…但这有点像黑客。 真正理想的是在公共API中公开以下内容: $.getUuid(tag) :检查并创建一个UUID(如果不存在) – 理想情况下,该方法是从$.data()分解出来的,并为传入的标记创建或获取uuid。 那么,有没有一个原因在jQuery中没有考虑到它自己的方法? 这在某种程度上有害吗? 它只是从来没有看起来有用吗? 我应该注意到,我实际上已经在我们正在使用的jQuery版本中考虑了它,并且它非常有用。 但也许存在潜在的风险,我没有在我的使用中遇到过。 我也知道一个插件可以实现这一点,但它有点破碎 – 并且有两个代码路径来执行相同的UUIDfunction既有点浪费又有点脆弱。

向HTML元素添加元数据的最佳方法

我正在尝试整合一种在HTML中标记各种组件的方法,这些组件由jQuery脚本解析并在页面加载时创建。 例如,目前我可以将以下内容放入我的页面.. This is a button 当jQuery脚本找到它时,它会注入创建一个带有图标的按钮所需的html以及所有必要的事件等。 然而,这很麻烦,需要很多长类名。 我宁愿做这样的事…… 它不是那么短,但在我看来更整洁,需要更少的解析。 麻烦的是,我已经对“expandos”进行了一些研究,我相当肯定有些浏览器会不喜欢它并且它不会validation。 有人有更好的建议吗?