使用新计算器克隆div为新div
我有一些Jquery用于克隆div,div内部是一个进行计算的输入。
当我克隆div并创建一个新div时,计算对新div不起作用。 我知道计算只能按照我编写的方式进行。 我搜索过,但找不到我要找的东西。
我还有一个问题,当我在输入中添加一个数字时,计算适用于第一个div,但它也会删除我的按钮。
如何为每个新克隆的div进行新的计算? 如何停止计算以删除我的添加/删除按钮?
function clone() { $(this).parents(".clonedInput").clone() .appendTo("body") .attr("id", "clonedInput" + cloneIndex) .find("*") .each(function() { var id = this.id || ""; var match = id.match(regex) || []; if (match.length == 3) { this.id = match[1] + (cloneIndex); } }) .on('click', 'button.clone', clone) .on('click', 'button.remove', remove); cloneIndex++; } function remove() { $(this).parents(".clonedInput").remove(); } $("button.clone").on("click", clone); $("button.remove").on("click", remove); // calculator $(document).ready(function() { $(".calculate").bind("keyup change", function(e) { var cabwidth = parseFloat($("#cabwidth").val()) || 0; var ply = 1.4375; var value = cabwidth - ply; if (!isNaN(value) && value !== Infinity) { $("#sum").text(value); } }); });
body { padding: 10px; } .clonedInput { padding: 10px; border-radius: 5px; background-color: #def; margin-bottom: 10px; } .clonedInput div { margin: 5px; }
这是一个jsfiddle示例: jsfiddle
您的按钮被删除,因为它们的父
的内容被覆盖(由于您的语法无效)。 您正尝试使用
自行关闭sum
。
元素不能自动关闭,因为它不是void元素 ; 您必须使用
明确声明该元素为空。 进行此更改可以解决按钮消失的问题。
请注意,您可以使用W3Cvalidation服务validationHTML标记,以确保您的HTML有效(因此行为符合预期)。 另请注意,自jQuery 3.0起,不推荐使用.bind()
; 你应该使用.on()
代替。
至于你的克隆无法正常工作,原因有两个:
- 第一种是基于ID进行克隆,从而复制ID。 ID在整个DOM中必须是唯一的。 使用类而不是ID,并使用
$(this)
来引用特定的克隆元素。- 将
.sum
更改为.sum
,而不是$("#sum").text(value)
,使用$(this).parent().find(".sum").text(value)
只影响正确元件。 - 更改
var cabwidth = parseFloat($("#cabwidth").val()) || 0
var cabwidth = parseFloat($("#cabwidth").val()) || 0
到var cabwidth = parseFloat($(this).val()) || 0
var cabwidth = parseFloat($(this).val()) || 0
。 - 删除所有ID的使用以确保克隆后的有效标记。
- 将
- 第二个是事件处理程序没有附加到克隆元素。 您需要将范围提升到DOM加载上可用的元素,并使用事件委派 。 而不是
$(".calculate").bind("keyup change", function(e)
,使用$("body").on("keyup change", ".calculate", function(e)
。
以下示例中已修复此问题:
function clone() { $(this).parents(".clonedInput").clone() .appendTo("body") .find("*") .on('click', 'button.clone', clone) .on('click', 'button.remove', remove); } function remove() { $(this).parents(".clonedInput").remove(); } $("button.clone").on("click", clone); $("button.remove").on("click", remove); // calculator $(document).ready(function() { $("body").on("keyup change", ".calculate", function(e) { var cabwidth = parseFloat($(this).val()) || 0; var ply = 1.4375; var value = cabwidth - ply; if (!isNaN(value) && value !== Infinity) { $(this).parent().find(".sum").text(value); } }); });
body { padding: 10px; } .clonedInput { padding: 10px; border-radius: 5px; background-color: #def; margin-bottom: 10px; } .clonedInput div { margin: 5px; }
这是一个更新的jsFiddle。
关于我改变的一些注意事项:
-
.bind()
已折旧 - 将更改/
.calculate
附加到文档,然后传递.calculate
作为选择器,这将使用动态元素,而在它之前 - 确保每个clone和child元素都有唯一的ID
- 将计算函数更新为相对于当前输入的目标元素