我使用Ruby on Rails并且我试图通过使用动态生成的div
来隐藏/显示动态生成的项目集合中的个人id
插入data attribute
。这是我到目前为止所提出的,我认为我走在正确的轨道上,但无法弄清楚我错过了什么。没有if statement
它可以工作,但显示每个项目的隐藏div而不是特定的项目,并且使用if语句,没有任何反应。
链接和隐藏的div
<span class="options" data-ovly=<%= activity.targetable.id %>>
<i class="fa fa-ellipsis-h"></i>
</span>
<div class="ed_ovly none" data-ovly=<%= activity.targetable.id %>>
<span class="shu_e">
<%= link_to "Edit", edit_medium_path(activity.targetable), :title => "Edit", :alt => "Edit", class: '' %>
</span>
<span class="shu_d">
<%= render :partial => "activities/delete", :locals => {:activity => activity} %>
</span>
</div>
jquery的
$('.options').click(function(){
var $ovly = $(this).attr("data-ovly");
if ($('.ed_ovly').data("ovly") === $ovly) {
$('.ed_ovly').toggleClass("none");
}
});
答案 0 :(得分:1)
在id
代码中使用data-ovly
属性而不是div
,并避免脚本中的if
语句:
<强> HTML 强>
<span class="options" data-ovly=<%= activity.targetable.id %>>
<i class="fa fa-ellipsis-h"></i>
</span>
<div class="ed_ovly none" id="<%= activity.targetable.id %>">
<span class="shu_e">
<%= link_to "Edit", edit_medium_path(activity.targetable), :title => "Edit", :alt => "Edit", class: '' %>
</span>
<span class="shu_d">
<%= render :partial => "activities/delete", :locals => {:activity => activity} %>
</span>
</div>
<强>脚本强>
$('.options').click(function() {
var $ovly = $(this).data("ovly");
$('#' + $ovly).toggleClass("none");
});
检查此代码段:
$(document).ready(function() {
$('.options').click(function() {
var $ovly = $(this).data("ovly");
$('#' + $ovly).toggleClass("none");
});
});
.none {
display: none;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="options" data-ovly="1">
ovly#1 <i class="fa fa-ellipsis-h"></i>
</span>
<br><br>
<span class="options" data-ovly="2">
ovly#2 <i class="fa fa-ellipsis-h"></i>
</span>
<div class="ed_ovly none" id="1">
<span class="shu_e">
<a title="Edit ovly # 1" alt="Edit" href="#">Edit</a>
</span>
<span class="shu_d">
"Your rendered partial for ovly # 1"
</span>
</div>
<div class="ed_ovly none" id="2">
<span class="shu_e">
<a title="Edit ovly # 2" alt="Edit" href="#">Edit</a>
</span>
<span class="shu_d">
"Your rendered partial for ovly # 2"
</span>
</div>
第一个问题出在您的if
声明中:您正在使用===
来比较您的值,但是,因为您使用不同的方法获取这些值(attr
和{{1 }},你得到不同的数据类型。
仔细查看您的代码(我添加了几条评论):
data
因此,您的$('.options').click(function(){
var $ovly = $(this).attr("data-ovly"); // Returns a string: "1"
if ($('.ed_ovly').data("ovly") === $ovly) // Returns a number: 1
{
$('.ed_ovly').toggleClass("none");
}
});
每次都会返回if
(因为您要将false
与string
进行比较)。要解决这个问题,只需使用相同的方法 1 来获取两行中的数据,如下所示:
number
现在您获得了相同的数据类型,您的$('.options').click(function(){
var $ovly = $(this).data("ovly"); // Returns a number: 1
if ($('.ed_ovly').data("ovly") === $ovly) // Returns a number: 1
{
$('.ed_ovly').toggleClass("none");
}
});
语句将按预期工作。但是你还没有走出困境,你的代码还有另一个问题,看看你如何识别每个唯一 if
:
<div>
您正在使用if ($('.ed_ovly').data("ovly") === $ovly)
{
$('.ed_ovly').toggleClass("none");
}
,即您正在使用该类,并且所有$('.ed_ovly')
都拥有该类,因此使用
div
您将始终获取带有$('.ed_ovly').data("ovly")
类的第一个div
的值;并在
ed_ovly
您将$('.ed_ovly').toggleClass("none")
应用于{strong>所有 toggleClasss("none")
div
类(因此,您将隐藏/显示所有ed_ovly
s每次)。
因此,您希望一次只定位一个div
,最好的方法是为每个div
分配一个id
(也是动态的),就像这样:
div
在您的脚本上,请仅使用<div class="ed_ovly none" data-ovly="<%= activity.targetable.id %>" id="<%= activity.targetable.id %">
<!-- Your div code... -->
</div>
来参考您要展示/隐藏的div
,并且可以通过将id
更改为$('.ed_ovly')
来完成。现在你的脚本应该是这样的:
$('#' + $ovly)
你的脚本现在应该工作正常,但有些事情是关闭的:随着我们所做的更改,现在根本不需要if ($('#' + $ovly).data("ovly") === $ovly) {
$('#' + $ovly).toggleClass("none");
}
!由于我们现在为每个div获得一个唯一的if
,因此可以安全删除它:
id
而且,在我们处理它的同时,让我们摆脱$('.options').click(function() {
var $ovly = $(this).data("ovly");
$('#' + $ovly).toggleClass("none");
});
中不必要的data
标记(我假设您不需要其他任何标记):
div
注意
1 你仍然可以通过将它们与<div class="ed_ovly none" id="<%= activity.targetable.id %">
<!-- Your div code... -->
</div>
进行比较来使用这两种方法,但我更喜欢坚持使用==
。查看this question了解详情。