Parents/siblings/children:努力select相关元素
Parents / siblings / children: struggling to select relevant element
我正在创建博客并尝试使用 JQuery 切换编辑评论表单。
评论显示部分的完整代码如下:
<!--================== COMMENTS DISPLAY SECTION ====================================================================-->
<div id="comments">
<% blog.comments.forEach(function(comment){ %>
<div class="jumbotron comment">
<div class="row">
<div class="col-md-1">
<img class="comment-ico" src = "<%=comment.author.image%>">
</div>
<div class="col-md-7">
<h4><%=comment.author.username%></h4>
</div>
<div class="col-md-4 date">
<%= comment.created.toDateString()%>
</div>
</div>
</div>
<div><p><%=comment.text%></p></div>
<!--=================EDIT COMMENT FORM =========================================================================-->
<form class="edit-comment-form" action = "/blogs/<%= blog._id %>/comments" method = "POST" id="newComment">
<textarea class = "form-control" rows="4" placeholder = "Type comment here..." name = "comment[text]"></textarea>
<button class = "btn btn-lg btn-primary btn-block">Submit</button>
</form>
<!-- ==================================================================================================================-->
<!--=================COMMENT OPTIONS (visible if user = author) =====================================================-->
<% if(currentUser && currentUser.username == comment.author.username) { %>
<div class="row">
<div class="col-md-1 choice">
<a class="edit">Edit</a>
</div>
<div class="col-md-1">
<form id = "delete-form" action = "/blogs/<%= blog._id %>/comments/<%=comment._id%>?_method=DELETE" method = "POST">
<input type = "submit" class = "button-delete" value = "Delete"></form>
</div>
</div>
<% } %>
<hr class = "style-three">
<% }) %>
</div>
</div>
<!--====================================================================================================================-->
<!--======================ADD COMMENT FORM ================================================================================ -->
<% if(currentUser){ %>
<div class = "container form">
<form action = "/blogs/<%= blog._id %>/comments" method = "POST" id="newComment">
<div class="row">
<div class="col-md-2">
<img class="newComment-ico" src = "<%=currentUser.image%>">
</div>
<div class="col-md-10">
<label for="comment">Add comment</label>
</div>
</div>
<textarea class = "form-control" rows="4" placeholder = "Type comment here..." name = "comment[text]"></textarea>
<button class = "btn btn-lg btn-primary btn-block">Submit</button>
</form>
</div>
<% } %>
我的JS如下:
$('#comments').on('click', '.edit', function(){
$(this).parents().siblings('.edit-comment-form').toggle();
})
但是,这是选择所有动态显示的项目(评论),这样当我单击“.edit”元素时,所有评论都会显示它们的编辑框。我知道这与我如何根据 parent/sibling 等选择它们有关,但无法确定它应该是什么!
@Satpal 的评论很完美,归功于他,尽管如此,但在他的怜悯下,我会尝试更深入地研究逻辑:
$('#comments').on('click', '.edit', function() {
$(this).closest('.row').prev('.edit-comment-form').toggle();
});
因为 .edit
在 .row
和 .edit-comment-form
的 里面 before it (.row
),基本上你是在影响previous .edit-comment-form
最近的 .row
被点击 .edit
。
用更简单的话来说,最近的行与单击的编辑相同,并且它的前一个文本区域 (.edit-comment-form
) 将被切换。
这是 prev() & closest() jQuery 方法的通用示例:
- 还要注意为什么
find()
不起作用,因为它会切换嵌套在 #comments
. 中的所有 .edit-comment-form
var selected = $("#start");
selected.css("background", "gainsboro");
//prev() - Will select previous element disregarding tag name
$(".prev").on('click', function() {
selected = selected.prev();
$("div").css("background", "");
$("nav").css("background", "");
$("section").css("background", "");
$("span").css("background", "")
selected.css("background", "gainsboro");
});
//closest() - Will highlight red only if selected element is a div
$(".closest").on('click', function() {
selected.closest('div').css("background", "red");
});
//find() - Will only highlight when span element is child
$(".find").on('click', function() {
selected.find('span').css("background", "red");
});
//Reset
$(".reset").on('click', function() {
$("div").css("background", "");
$("nav").css("background", "");
$("section").css("background", "");
$("span").css("background", "");
selected = $("#start");
selected.css("background", "gainsboro");
});
div {
width: 40px;
height: 40px;
margin: 10px;
float: left;
border: 2px lightgray solid;
padding: 2px;
}
.inline {
float: left;
margin: 10px;
width: 48px;
text-align: center;
line-height: 48px;
}
#row {
width: 100%;
border: none;
padding: 0;
margin: 0;
height: 60px;
}
section {
width: 40px;
height: 40px;
margin: 10px;
float: left;
border: 2px lightgray solid;
padding: 2px;
}
nav {
width: 40px;
height: 40px;
margin: 10px;
float: left;
border: 2px lightgray solid;
padding: 2px;
}
span {
font-size: 14px;
word-wrap: break-word;
}
button {
margin: 10px;
padding: 10px;
background: transparent;
border: 2px solid gray;
border-radius: 3px;
color: gray;
font-size: 12px;
}
button:hover {
background: gray;
color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="row">
<div></div>
<div class="find"></div>
<span class="inline">span</span>
<div><span>find() here</span></div>
<section></section>
<nav></nav>
<div id="start"></div>
</section>
<button class="prev">test prev()</button>
<button class="closest">test closest()</button>
<button class="find">test find()</button>
<button class="reset">reset</button>
我正在创建博客并尝试使用 JQuery 切换编辑评论表单。
评论显示部分的完整代码如下:
<!--================== COMMENTS DISPLAY SECTION ====================================================================-->
<div id="comments">
<% blog.comments.forEach(function(comment){ %>
<div class="jumbotron comment">
<div class="row">
<div class="col-md-1">
<img class="comment-ico" src = "<%=comment.author.image%>">
</div>
<div class="col-md-7">
<h4><%=comment.author.username%></h4>
</div>
<div class="col-md-4 date">
<%= comment.created.toDateString()%>
</div>
</div>
</div>
<div><p><%=comment.text%></p></div>
<!--=================EDIT COMMENT FORM =========================================================================-->
<form class="edit-comment-form" action = "/blogs/<%= blog._id %>/comments" method = "POST" id="newComment">
<textarea class = "form-control" rows="4" placeholder = "Type comment here..." name = "comment[text]"></textarea>
<button class = "btn btn-lg btn-primary btn-block">Submit</button>
</form>
<!-- ==================================================================================================================-->
<!--=================COMMENT OPTIONS (visible if user = author) =====================================================-->
<% if(currentUser && currentUser.username == comment.author.username) { %>
<div class="row">
<div class="col-md-1 choice">
<a class="edit">Edit</a>
</div>
<div class="col-md-1">
<form id = "delete-form" action = "/blogs/<%= blog._id %>/comments/<%=comment._id%>?_method=DELETE" method = "POST">
<input type = "submit" class = "button-delete" value = "Delete"></form>
</div>
</div>
<% } %>
<hr class = "style-three">
<% }) %>
</div>
</div>
<!--====================================================================================================================-->
<!--======================ADD COMMENT FORM ================================================================================ -->
<% if(currentUser){ %>
<div class = "container form">
<form action = "/blogs/<%= blog._id %>/comments" method = "POST" id="newComment">
<div class="row">
<div class="col-md-2">
<img class="newComment-ico" src = "<%=currentUser.image%>">
</div>
<div class="col-md-10">
<label for="comment">Add comment</label>
</div>
</div>
<textarea class = "form-control" rows="4" placeholder = "Type comment here..." name = "comment[text]"></textarea>
<button class = "btn btn-lg btn-primary btn-block">Submit</button>
</form>
</div>
<% } %>
我的JS如下:
$('#comments').on('click', '.edit', function(){
$(this).parents().siblings('.edit-comment-form').toggle();
})
但是,这是选择所有动态显示的项目(评论),这样当我单击“.edit”元素时,所有评论都会显示它们的编辑框。我知道这与我如何根据 parent/sibling 等选择它们有关,但无法确定它应该是什么!
@Satpal 的评论很完美,归功于他,尽管如此,但在他的怜悯下,我会尝试更深入地研究逻辑:
$('#comments').on('click', '.edit', function() {
$(this).closest('.row').prev('.edit-comment-form').toggle();
});
因为 .edit
在 .row
和 .edit-comment-form
的 里面 before it (.row
),基本上你是在影响previous .edit-comment-form
最近的 .row
被点击 .edit
。
用更简单的话来说,最近的行与单击的编辑相同,并且它的前一个文本区域 (.edit-comment-form
) 将被切换。
这是 prev() & closest() jQuery 方法的通用示例:
- 还要注意为什么
find()
不起作用,因为它会切换嵌套在#comments
. 中的所有
.edit-comment-form
var selected = $("#start");
selected.css("background", "gainsboro");
//prev() - Will select previous element disregarding tag name
$(".prev").on('click', function() {
selected = selected.prev();
$("div").css("background", "");
$("nav").css("background", "");
$("section").css("background", "");
$("span").css("background", "")
selected.css("background", "gainsboro");
});
//closest() - Will highlight red only if selected element is a div
$(".closest").on('click', function() {
selected.closest('div').css("background", "red");
});
//find() - Will only highlight when span element is child
$(".find").on('click', function() {
selected.find('span').css("background", "red");
});
//Reset
$(".reset").on('click', function() {
$("div").css("background", "");
$("nav").css("background", "");
$("section").css("background", "");
$("span").css("background", "");
selected = $("#start");
selected.css("background", "gainsboro");
});
div {
width: 40px;
height: 40px;
margin: 10px;
float: left;
border: 2px lightgray solid;
padding: 2px;
}
.inline {
float: left;
margin: 10px;
width: 48px;
text-align: center;
line-height: 48px;
}
#row {
width: 100%;
border: none;
padding: 0;
margin: 0;
height: 60px;
}
section {
width: 40px;
height: 40px;
margin: 10px;
float: left;
border: 2px lightgray solid;
padding: 2px;
}
nav {
width: 40px;
height: 40px;
margin: 10px;
float: left;
border: 2px lightgray solid;
padding: 2px;
}
span {
font-size: 14px;
word-wrap: break-word;
}
button {
margin: 10px;
padding: 10px;
background: transparent;
border: 2px solid gray;
border-radius: 3px;
color: gray;
font-size: 12px;
}
button:hover {
background: gray;
color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="row">
<div></div>
<div class="find"></div>
<span class="inline">span</span>
<div><span>find() here</span></div>
<section></section>
<nav></nav>
<div id="start"></div>
</section>
<button class="prev">test prev()</button>
<button class="closest">test closest()</button>
<button class="find">test find()</button>
<button class="reset">reset</button>