我正在构建一个食谱保存应用程序,其中有一个类似于http://jsfiddle.net/LHPbh/的表单。
如您所见,我有一组表单元素包含在一个<li>
. 您可以单击添加成分并将更多的 li 添加到该字段中。
我的问题是:
- 第一个 li 是唯一删除的。如果您单击添加成分,然后尝试删除该成分,则没有任何效果?
- 有没有办法不让第一个 li 被它删除,但所有后续 li 的旁边都有一个删除链接?(仅仅因为应该总是至少有一种成分?)
我正在构建一个食谱保存应用程序,其中有一个类似于http://jsfiddle.net/LHPbh/的表单。
如您所见,我有一组表单元素包含在一个<li>
. 您可以单击添加成分并将更多的 li 添加到该字段中。
我的问题是:
当您调用时clone()
,它不会复制事件。如文档中所述,您需要调用clone(true)
它才能执行此操作。
您没有在克隆的元素上放置事件侦听器。此外,您不应为“删除”链接提供自己的 id,因为它们必须是唯一的。
要使第一个成分没有删除按钮,请不要在标记中包含一个,而只是动态创建它们并将它们附加到克隆的元素中:
var deleteButton = $("<a class='float-left'>Delete</a>").click(deleteThis);
$('ul#listadd > li:first')
.clone()
.attr('name', 'ingredient' + newNum)
.append(deleteButton)
.appendTo('ul#listadd');
function deleteThis() {
var li = $(this).closest('li')
li.fadeOut('slow', function() { li.remove(); });
}
$('.deleteThis').live("click", function () {
var li = $(this).closest('li')
li.fadeOut('slow', function() { li.remove(); });
});
这是对 1. 点的回答。问题是,事件处理程序绑定没有发生在新创建的元素中,因为此代码仅在页面加载时运行。这可以通过使用 .live() 来解决。另一个问题是,id-s 必须是唯一的。所以代替 id,在这里你可以使用类 .deleteThis。
这增加了对 2. 点的回答:
if ($("#listadd li").length == 1) {
return;
}
如果列表仅包含 1 个 li 元素,则回调的其余部分将不会运行。
您正在添加动态添加到 DOM 的项目,因此 jQuery 无法访问它们:) 在这种情况下,您可以使用以下代码:
$(document).on('click', '.selector', function(e) {
//code here
});
其次,您正在加载一个相当旧版本的 jQuery。
第三,您试图选择一个 ID 已经存在的元素,并且 ID 只能存在一次。我已将其更改为更新示例中的类。
最后,您定义了两次链接的类,如下所示:
<a class='float-left' id="deletethis" href='#' class="deletethis">Delete</a>
这也带来了问题,所以我将其更改为更正标记,如下所示:
<a class='float-left deletethis' href='#'>Delete</a>
祝你好运:) 我在这里更新了你的 jsFiddle: