我正在构建“编辑个人资料”页面。
这是我想要做的:
这是我使用jQuery做的。单击“编辑雇主”按钮时,它不起作用。我不知道为什么这不起作用。
<!DOCTYPE html>
<html>
<head>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<div class="edit">
<form class="editForm">
employer: <input type="text" value="Citigroup" />
</form>
<div class="contents">Employer: Citigroup</div>
<button class="editButton">Edit Employer</button>
</div>
<script>
$('div.edit').each(function(i) {
$(this).children('.editForm').hide();
})
$('div.edit').each(function() {
$(this).children('.editButton').click(function() {
$(this).children('.editForm').show();
$(this).children('.contents').hide();
});
})
</script>
</body>
</html>
答案 0 :(得分:2)
$(this)
函数中的click
包含$(this).children('.editButton')
的本地实例。因此,您的代码未找到任何.editForm
元素。
为此,您可以执行以下操作:
<script>
$('div.edit').each(function(i) {
$(this).children('.editForm').hide();
})
$('div.edit').each(function() {
var $this = $(this);
$(this).children('.editButton').click(function() {
$this.children('.editForm').show();
$this.children('.contents').hide();
});
})
</script>
如果可以,我可以通过更多更改来改进代码:
<script>
$('.edit .editForm').hide(); // this will hide all instances of .editForm
$('.edit .editButton').click(function() { //assign 1 handler for all cases
$(this).siblings('.editForm').show(); // show the sibling edit form
$(this).siblings('.contents').hide(); // hide the sibling contents element
});
</script>
参考: 兄弟选择器:https://api.jquery.com/siblings/#siblings-selector
答案 1 :(得分:0)
问题是点击处理程序中的this
引用了按钮,而不是div.edit
。以下是解决此问题的一种方法:
$('div.edit').each(function(i) {
$(this).children('.editForm').hide();
});
$('div.edit').each(function() {
var $self = $(this);
$(this).children('.editButton').click(function() {
$self.children('.editForm').show();
$self.children('.contents').hide();
});
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="edit">
<form class="editForm">
employer:
<input type="text" value="Citigroup" />
</form>
<div class="contents">Employer: Citigroup</div>
<button class="editButton">Edit Employer</button>
</div>
&#13;
答案 2 :(得分:0)
您根本不需要使用.each()
。只需在.click()
类上执行.editButton
事件,然后使用this
查找其父级。如果你想进行切换,你将不得不利用一个新类或那种性质的东西来制作一个条件语句。
//This will hide *ANY* .editForm elements
$('.editForm').hide();
//This will fire off of *ANY* editButton clicks.
$('.editButton').click(function() {
var form = $(this).closest('.edit'); //Get the wrapper
if(form.hasClass('open')) { //Check to see if it is open or not
form.removeClass('open').addClass('close'); //Toggle Classes
form.find('.editForm').show();
form.find('.contents').hide();
} else {
form.removeClass('close').addClass('open');
form.find('.editForm').hide();
form.find('.contents').show();
}
});
我更喜欢使用closest
和find
而不是parent
和children
(分别)。他们可以向上或向下移动1层,并在层次结构中搜索您要查找的内容,而不是parent
和children
在单个图层上升或下移。
如果您在加载DOM后插入.edit
表单,则需要将Click事件绑定到文档
$(document).on('click', '.editButton', function() {
var form = $(this).closest('.edit');
form.find('.editForm').hide();
form.find('.contents').show();
});