Javascript 如何根据类别添加正确的详细信息?
如果用户单击Javascript 如何根据类别添加正确的详细信息?,javascript,jquery,ruby-on-rails,ruby,Javascript,Jquery,Ruby On Rails,Ruby,如果用户单击#挑战#类别(目标上的,则会显示目标的详细信息;如果用户单击#挑战#类别(习惯,则会显示习惯的详细信息 <%= f.radio_button :category, 'goal', class: 'date-format-switcher' %> <label for="challenge_category_goal">Goal</label> <%= f.radio_button :category, 'habit'
#挑战#类别(目标
上的,则会显示目标的详细信息;如果用户单击#挑战#类别(习惯
,则会显示习惯的详细信息
<%= f.radio_button :category, 'goal', class: 'date-format-switcher' %>
<label for="challenge_category_goal">Goal</label>
<%= f.radio_button :category, 'habit', class: 'date-format-switcher' %>
<label for="challenge_category_habit">Habit</label>
<div id='details'>
<div id='for-goal'>
goal attributes
</div>
<div id='for-habit'>
habit attributes
</div>
</div>
<script>
var removed = $('#for-b').detach();
$('#challenge_category_goal').click(function() {
$('#details').append(removed);
removed = $('#for-goal').detach();
})
$('#challenge_category_habit').click(function() {
$('#details').append(removed);
removed = $('#for-habit').detach();
})
</script>
目标
习性
目标属性
习惯属性
var removed=$(“#for-b”).detach();
$(“#挑战(类别)目标”)。单击(函数(){
$(“#详细信息”)。追加(删除);
删除=$(“#用于目标”).detach();
})
$(“#挑战_类别_习惯”)。单击(函数(){
$(“#详细信息”)。追加(删除);
已删除=$(“#用于习惯”).detach();
})
当表单首次加载时会选择适当的类别(基于从选择特色挑战的用户在后端传递的代码),但
详细信息
不会根据页面加载而更改。它们仅根据进行更改。单击。如何使javascript基于页面加载显示正确的详细信息
。单击
?您的javascript应该是:
<script>
$(function() {
$('#challenge_category_goal').click(function() {
$('#for-goal').show();
$('#for-detail').hide();
});
$('#challenge_category_habit').click(function() {
$('#for-goal').hide();
$('#for-detail').show();
});
// Update: To select challenge_category_goal in default
$('#challenge_category_goal').click();
});
</script>
然后我们只需将渲染单选按钮的部分移动到view helper,它将非常漂亮,并且易于以后添加/修改!顺便说一句,在details
元素中,我想您会显示更多的信息,我不知道它们有多复杂,所以我无法将其通用化。jsiddle示例:
正如@Hieu提到的,只需使用show
和hide
方法即可。我将添加一些额外的助手
<script>
$(document).ready(function(){
$('#challenge_category_goal').click(function() {
$('#for-goal').show();
$('#for-habit').hide();
})
$('#challenge_category_habit').click(function() {
$('#for-goal').hide();
$('#for-habit').show();
})
})
</script>
$(文档).ready(函数(){
$(“#挑战(类别)目标”)。单击(函数(){
$(“#表示目标”).show();
$(“#表示习惯”).hide();
})
$(“#挑战_类别_习惯”)。单击(函数(){
$(“#表示目标”).hide();
$(“#表示习惯”).show();
})
})
您可以尝试使用选中状态来确定显示/隐藏状态:
<script>
function updateInfo(){
if($('#challenge_category_goal').prop('checked')){
$('#for-goal').show();
$('#for-detail').hide();
}else{
$('#for-goal').hide();
$('#for-detail').show();
}
}
$(function() {
$('#challenge_category_goal').click(updateInfo);
$('#challenge_category_habit').click(updateInfo);
updateInfo();
});
</script>
函数updateInfo(){
如果($('#挑战#类别(目标)).prop('checked')){
$(“#表示目标”).show();
$(“#详细信息”).hide();
}否则{
$(“#表示目标”).hide();
$(“#详细信息”).show();
}
}
$(函数(){
$(“#挑战(类别)目标”)。单击(更新信息);
$(“#挑战(类别)习惯”)。单击(更新信息);
updateInfo();
});
我还建议你检查一下这个纯方法是否适合你的情况 我试过了。我没法让它工作。例如,当我现在加载页面时,它会同时显示目标的和习惯的中的所有内容,而不是一个或另一个。如果我点击另一个类别,尽管它正确地显示了一个或另一个。我也像这样尝试过,$('challenge#u category_goal')。点击(函数(){$('for goal')。显示();$('for habity')。隐藏()}$('challenge#u category_habity')。点击(函数(){$('for goal')。隐藏();$('for habity')。显示())
@AnthonyGalli.com只是一个小的更新,请查看:)好的,先生,把它全部插上。在加载类别为habity
的页面时,我看到出于某种原因,它默认为goal
,并且它显示了goal
的和habity
属性的。如果我尝试手动更改类别,则不会更改。您是否尝试了可选改进
?我刚刚更新了它,抱歉,我在jquery选择器中丢失了一个点,太蹩脚了:(不使用turbolinks。当页面加载时,您的代码会隐藏这两个。要显示其中一个,用户必须手动单击类别,即使该类别已被选中。是否有的替代方法。单击,因为我认为这是罪魁祸首。@AnthonyGalli.com OMG,然后让它像这样显示->$(“#为目标”).show()
,默认情况下html将选择第一个单选按钮。我还附加了JSFIDLE中的简单示例。它不是默认的。我不希望用户必须单击。它应该在页面加载后自动默认为目标或习惯的相应类别。有时页面将加载类别de>目标
预选,有时加载的类别将是习惯
这取决于用户选择了哪个特色挑战。@AnthonyGalli.com更新了我的帖子,只需为你的目标单选按钮添加选中:真
。我不想选中真
。这与目的背道而驰。Ruby通过了catego因此,有时类别
将作为习惯
传递,有时目标
传递。请检查此项:https://jsfiddle.net/j7qg8op1/2/
没有。感谢您再试一次。当一个特色挑战传递给习惯时。习惯类别已被选中,但它显示了目标@7urkm3的属性。非常感谢!小心这是拼图的最后一块。FML实际上隐藏的数据属性仍在传递中。你知道如何修复吗?
<script>
function updateInfo(){
if($('#challenge_category_goal').prop('checked')){
$('#for-goal').show();
$('#for-detail').hide();
}else{
$('#for-goal').hide();
$('#for-detail').show();
}
}
$(function() {
$('#challenge_category_goal').click(updateInfo);
$('#challenge_category_habit').click(updateInfo);
updateInfo();
});
</script>