Javascript jQuery数据方法将数据推送到子对象
在jQuery的.data()函数中看到了非常奇怪的行为。当我给父元素赋值时,它的子元素也会被赋值 html:Javascript jQuery数据方法将数据推送到子对象,javascript,jquery,Javascript,Jquery,在jQuery的.data()函数中看到了非常奇怪的行为。当我给父元素赋值时,它的子元素也会被赋值 html: 我是个孩子 我是另一个孩子 js: somearray=[“child1”、“child2”] $(“.things”).data(“最高的”,[]) for(var i=0;i
我是个孩子
我是另一个孩子
js:
somearray=[“child1”、“child2”]
$(“.things”).data(“最高的”,[])
for(var i=0;i
查看此小提琴(控制台日志中记录了问题):
应该发生什么:
$(“#父”)
的数据数组上$(“#父”)。数据(“最高的”)
应该等于[20,20]-它确实是李>
$(“#child1”).data(“最高的”)
==[20,20]我在这里缺少什么?您可以初始化所有。
项
项,使其对同一空数组具有完全相同的引用。因此,当您修改一个数组时,它们都会更改,因为它们都指向同一个数组。请记住,数组是通过引用分配和检索的。因此,这一行:
$(".things").data("tallest",[])
正在为每个.things
对象分配对完全相同数组的引用。改变一个,它们都会改变,这就解释了你的输出
您可以将其修复并简化如下:
// initialize all things to have their own empty array for data
$(".things").each(function() {
$(this).data("tallest", []);
});
["#child1", "#child2"].each(function() {
// get reference to parent data array and push a value onto it
$(this).parent().data("tallest").push(20);
// you don't have to set it back because the array is by reference so already changed
});
在操作数组时,还必须非常小心,因为数组是通过引用传递的。因此,当您从一个地方获取数据并对其进行修改时,您正在修改原始数据,因为获取数组并没有创建副本,它只是有一个引用。我不认为这会影响你,但如果你试图从一个元素中获取数据,修改它并将其分配给另一个元素,那么很容易做到。你可以初始化所有。
事物
项,使它们对同一个空数组具有完全相同的引用。因此,当您修改一个数组时,它们都会更改,因为它们都指向同一个数组。请记住,数组是通过引用分配和检索的。因此,这一行:
$(".things").data("tallest",[])
正在为每个.things
对象分配对完全相同数组的引用。改变一个,它们都会改变,这就解释了你的输出
您可以将其修复并简化如下:
// initialize all things to have their own empty array for data
$(".things").each(function() {
$(this).data("tallest", []);
});
["#child1", "#child2"].each(function() {
// get reference to parent data array and push a value onto it
$(this).parent().data("tallest").push(20);
// you don't have to set it back because the array is by reference so already changed
});
在操作数组时,还必须非常小心,因为数组是通过引用传递的。因此,当您从一个地方获取数据并对其进行修改时,您正在修改原始数据,因为获取数组并没有创建副本,它只是有一个引用。我不认为这会影响您,但如果您尝试从一个元素获取数据,修改它并将其分配给另一个元素,则很容易做到这一点。问题在于:
$(".things").data("tallest",[])
您正在将相同的数组放入每个元素的数据中。因此,通过原型继承,它们都共享对同一数组的引用
改为:
$(".things").each(function(){
$(this).data("tallest",[])
})
每个都有自己独特的阵列
简单对象引用示例:
var a=[];
var b=a;
b.push('foo');
alert(a[0]); //foo
问题在于:
$(".things").data("tallest",[])
您正在将相同的数组放入每个元素的数据中。因此,通过原型继承,它们都共享对同一数组的引用
改为:
$(".things").each(function(){
$(this).data("tallest",[])
})
每个都有自己独特的阵列
简单对象引用示例:
var a=[];
var b=a;
b.push('foo');
alert(a[0]); //foo
为什么要把20推到一个阵列上?既然HTML标记中没有元素
$('child1')
或$('child2')
(您省略了#
),那么$(tocheck)
应该是什么目标。仅供参考,没有理由在HTML标记中包含数据=“[]”
,因为您正在用JS初始化它。@jfriend00-实际上,最初绘制这些值时,后端可以在其中插入值。文档的初始状态是从Rails后端加载的,然后各种情况会导致此函数重新初始化“最高”值。这只是一个简化版本,但是有足够的片段,如果我做了一些愚蠢的事情,你们可以找到它。为什么你们要把20推到一个数组上?既然HTML标记中没有元素$('child1')
或$('child2')
(您省略了#
),那么$(tocheck)
应该是什么目标。仅供参考,没有理由在HTML标记中包含数据=“[]”
,因为您正在用JS初始化它。@jfriend00-实际上,最初绘制这些值时,后端可以在其中插入值。文档的初始状态是从Rails后端加载的,然后各种情况会导致此函数重新初始化“最高”值。这只是一个简化版本,但是有足够的片段,如果我做了一些愚蠢的事情,你们可以找到它。我没有注意到tocheck
问题……反正不需要这一行,因为data()中存储的数组已经被更新了reference@charlietfl-我想任务可能不需要,除了第一次数据实际上还没有出现在jQuery的javascript中——只出现在属性中。然后,我想它必须被设置回去,但是在JSFIDLE关闭的情况下,我无法轻松地进行测试。看这里,我删除了最后一行,并使用each
来创建初始数组。angular.js一直在使用这些东西……在这个框架中,这些事情一直在发生。一切都是基于对数据的继承binding@charlietfl-是的,我意识到他们已经将所有数据初始化到[]
,它将始终是一个引用,不需要返回任何作业。我已经更新了我的简化版本。是的……如果OP刚刚离开标记的话