我正在尝试重组我的代码并使其更加不引人注目。
主要是有一个执行操作的链接。如果单击链接,则通过ajax执行操作(此处的代码不在ajax代码上),文本将替换为其他文本,从而为用户提供撤消操作的功能。如果用户单击“撤消”链接,则ajax将恢复之前的情况,并且提供用户的文本将再次执行它所显示的操作。
我在单个html文件中编写了一个更简单的问题版本(下面的代码)。有两段。如果单击使用内联onclick调用的第一个段落的链接,代码将按预期工作。但是,如果你点击第二段的链接,它使用jQuery onclick函数,撤销链接不起作用,我无法弄清楚原因。
有任何帮助吗?非常感谢!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function() {
$(".add2").click(function(){
var placeId = $(this).parents(".place").attr("id");
$("#" + placeId + " .add2").remove();
$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd2\" href=\"#\">Undo</a>");
return false;
})
$(".undoadd2").click(function(){
var placeId = $(this).parents(".place").attr("id");
$("#" + placeId + " .actions").find("span.added, a.add2").remove();
$("#" + placeId + " .actions").append("<a class='add2' onclick='copyPlace(\"" + placeId + "\"); return false;' href='#'>Add place</a>");
return false;
})
});
function addPlace(placeId){
$("#" + placeId + " .add").remove();
$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd\" href=\"#\" onclick=\"undoAddPlace('" + placeId + "'); return false;\">Undo</a>");
return false;
}
function undoAddPlace(placeId){
$("#" + placeId + " .actions").find("span.added, a.undoadd").remove();
$("#" + placeId + " .actions").append("<a class='add' onclick='addPlace(\"" + placeId + "\"); return false;' href='#'>Add place</a>");
return false;
}
</script>
</head>
<body id="home">
<div class="place" id="3435910">
<p class="actions"><a href="#" onclick="addPlace('3435910'); return false;" class="add">Add place</a></p>
</div>
<div class="place" id="3435912">
<p class="actions"><a href="#" class="add2">Add place</a></p>
</div>
</body>
</html>
答案 0 :(得分:16)
因为您正在动态添加新内容 项目到DOM,你将不得不 再次注册点击处理程序 新项目。
您可以使用.live
。
<强>更新强>
从jQuery 1.7开始,.on
方法是执行此操作的首选方法。
自jQuery 1.9以来,.live
方法已被删除。
答案 1 :(得分:4)
只是演示使用.end()来获得更流畅的解决方案:
$(function() {
$(".add2").click(function(){
return $(this).parents(".place")
.find(".add2")
.hide()
.end()
.find(".actions")
.append("<span class=\"added\">Added!</span> <a class=\"undoadd2\" href=\"#\">Undo</a>");
});
$('.undoadd2').live('click', function(){
return $(this).parents(".place")
.find(".actions")
.find("span.added, a.undoadd2")
.remove()
.end()
.end()
.find(".add2")
.show();
});
});
答案 2 :(得分:2)
由于您要向DOM动态添加新项目,因此必须在新项目上再次注册click
处理程序。当你调用$('...').click(...)
时,jQuery会设置处理程序。
答案 3 :(得分:2)
哇!!谢谢你们所有人!
我已经阅读了直播活动和最终工作代码:
$(function() {
$(".add2").click(function(){
var placeId = $(this).parents(".place").attr("id");
$("#" + placeId + " .add2").hide();
$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd2\" href=\"#\">Undo</a>");
return false;
})
$('.undoadd2').live('click', function(){
var placeId = $(this).parents(".place").attr("id");
$("#" + placeId + " .actions").find("span.added, a.undoadd2").remove();
$("#" + placeId + " .add2").show();
return false;
});
以前我使用remove()来删除提供执行操作的文本。我已将其更改为hide / show,因此我不必在第一个函数中使用live。
再次感谢!
答案 4 :(得分:1)
将元素追加到DOM时,不会拾取单击处理程序。尝试使用jQuery通过更改看起来像这样的行来注册click处理程序:
$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd\" href=\"#\" onclick=\"undoAddPlace('" + placeId + "'); return false;\">Undo</a>")
要
$("#" + placeId + " .actions").append("<span class=\"added\">Added!</span> <a class=\"undoadd\" href=\"#\" >Undo</a>");
$('#' + placeId + " .actions").find("span:last").find("a").click( function() {
undoAddPlace( placeId );
return false;
});
你可能可以更简单地做到这一点,但看起来你可能会在段落中添加多个跨度,所以我保守了。你也可能链接追加,但我认为重新选择使得这一点更加明确。