【发布时间】:2011-05-06 01:42:51
【问题描述】:
我一遍又一遍地听说“将 DOM 用作数据库”是不好的做法。
虽然我基本同意这种观点,但这个问题更多的是关于非黑白案例。记住 jQuery 的 .data() 方法和 HTML5 数据属性规范的最新修订,为了方便而将一些数据粘贴到 DOM 中真的有那么糟糕吗?
例如,我最近通过执行以下操作在充满输入的表上实现了“实时”计算功能:
<table>
<tr>
<td><input type="text"></td>
</tr>
<tr>
<td><input type="text"></td>
</tr>
</table>
jQuery:
$('table').bind('calculate',function(){
var total = 0;
$(this).find('tr').each(function(){
total += $(this).data('value');
});
// display total
});
$('table input').bind('change keyup',function(){
$(this).closest('tr').data('value',$(this).val());
$(this).closest('table').trigger('calculate');
});
这是一个过于简化的示例,因为我可以跳过对.data() 的调用并直接进入输入值,但让我们想象一个稍微复杂一点的场景,其中输入以外的元素正在影响行值。
这种情况下使用DOM存储简单数据有错吗?
【问题讨论】:
-
DOM 树中的节点是数据。
-
触摸。但你知道我的意思......人们建议我总是在这里创建某种记忆模型。这样可以省去我的麻烦还是真的可以吗?
-
我要么误解了这个问题,要么误解了 jQuery 的 data() 方法的工作原理。我认为 jQuery 将这些值存储在其缓存中,而不是直接将数据附加到 DOM。
-
@kennis,也不行!我只是不知道 jQuery 的 data() 方法将值存储在缓存中。我对此感到困惑:
As of jQuery 1.4.3 HTML 5 data- attributes will be automatically pulled in to jQuery's data object. The treatment of attributes with embedded dashes was changed in jQuery 1.6 to conform to the W3C HTML5 specification.我只是假设由于 data-attributes 和 .data() 似乎是耦合的,所以 jQuery 正在使用 DOM。但显然还有一些其他的魔法正在发生。我应该检查一下来源... -
jQuery claims 不将其存储在 DOM 中:“数据属性在第一次访问数据属性时被拉取,然后不再访问或改变(所有数据值随后内部存储在 jQuery 中)。”
标签: javascript jquery dom