jquery - 多次附加jQuery元素
问题描述
对于 html:
<body>
<p>Para 1</p>
<p>Para 2</p>
<p>Para 3</p>
<p>Para 4</p>
<p>Para 5</p>
</body>
如果我们在脚本中使用以下代码
$(function() {
let a = $('<span> span 1 </span>');
$('p').append(a);
let temp = $('span');
for(i = 0; i < temp.length; i++) {
console.log(temp.eq(i) === a);
}
});
$(function() {
let a = $('<span> span 1 </span>');
$('p').append(a);
let temp = $('span');
for(i = 0; i < temp.length; i++) {
console.log(temp.eq(i) === a);
}
});
p { border: 1px solid green; }
span { border: 1px solid blue; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<p>Para 1</p>
<p>Para 2</p>
<p>Para 3</p>
<p>Para 4</p>
<p>Para 5</p>
</body>
我希望结果为真,因为相同的元素附加到所有<p>
元素。有人可以解释为什么结果是错误的吗?
解决方案
首先,它总是错误的,因为
var a = $("<span>span 1</span>")
在内存中创建一个jquery 对象,没有相应的 DOM 节点。
当您附加此内容时,$('p').append(a)
您会附加多个新副本,原始 (in var a
) 仍在内存中。
因此,当您获取新实例时,temp = $('span')
您是从 DOM 中获取它们的。
还要注意,===
在对象上检查它们是否是同一个实例,并且还要注意$(selector)
查询不是实时查询——它们只得到当时存在的内容。所以它们永远不会是同一个a.length == 1
对象$("span").length == 5
其次,你不能比较两个 jquery 对象,===
因为它们不是一个对象的同一个实例,这是你的测试的一个更简洁的版本:
console.log($("div") === $("div"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>div 1</div>
您可以更新您的 js 以仅查看 DOM 节点
console.log(temp[i] === a[i]);
这仍然是错误的,就像a
在记忆中一样
$(function() {
let a = $('<span> span 1 </span>');
$('p').append(a);
let temp = $('span');
for (i = 0; i < temp.length; i++) {
console.log(temp[i] === a[i]);
}
});
p { border: 1px solid green; }
span { border: 1px solid blue; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<p>Para 1</p>
<p>Para 2</p>
<p>Para 3</p>
<p>Para 4</p>
<p>Para 5</p>
</body>
将其转换为与之前相同以仅查看 DOM 节点(不包括内存问题),您现在可以看到比较节点确实返回true
.
// derived example
console.log($("div")[0] === $("div")[0])
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>div 1</div>
但是与现有项目进行比较将是错误的,因为您已将 1 个项目变为 5 个。所以($("span")[0] === $("span")[1]) === false
一份文件附录。如果您比较 HTML(字符串)而不是对象,那么是的,它们都是相同的
$(function() {
let a = $('<span> span 1 </span>');
$('p').append(a);
let temp = $('span');
for (i = 0; i < temp.length; i++) {
console.log(temp.eq(i).html() === a.html());
}
});
p { border: 1px solid green; }
span { border: 1px solid blue; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<p>Para 1</p>
<p>Para 2</p>
<p>Para 3</p>
<p>Para 4</p>
<p>Para 5</p>
</body>
推荐阅读
- php - 如果键相同而不使用嵌套循环,则多维数组合并为一个数组
- c++ - 仅使用 CMake 函数的自定义 CMake 目标
- ios - 为什么要构建离子错误?- 错误 65
- sql - 如何在没有级联的情况下从多个表中删除?(SQLSERVER T-SQL)
- scala - 火花批量插入数百万条记录到 400 列 GC 限制的 sql 表中
- python - 部署 Tkinter:加载 Python dll/LoadLibrary 时出错
- ios - 可以检测ssid变化的ios后台应用
- sql - 仅计算每个月的活动记录
- c++ - Valgrind 报告 QThread::start() 上的内存泄漏
- javascript - 检查 grapqhl 查询返回的对象的形状