2012-11-01 218 views
0

我在表单上有三个单选按钮。当选择收音机项目时,子菜单将出现在收音机选项的正下方。当单击单选按钮时,我想要它,另一个子菜单将首先隐藏,然后会出现与当前所选单选按钮相对应的子菜单。隐藏/显示先隐藏一个元素,然后显示点击的项目

问题:如何在显示单击的收音机选项(slideDown)之前上拉当前显示的子菜单。

注意:我正在使用Coldfusion。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script> 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script> 
<form > 
<!--- Work Efforts ---> 
<input name="ArchRpt" type="radio" value="WorkEfforts" id="ArchRpt_WorkEfforts" onclick="SetArchRpts('ArchRpt_WorkEfforts');"/> 
Work Efforts (WE)<br /> 
<div id="ArchRpt_WorkEfforts_sub" class="Indent25" style="display:none;"> 
    some additional form options here 
</div> 
<!--- Previous Week Status Updates ---> 
<input style="clear:both;" name="ArchRpt" type="radio" value="StautsUpd" id="ArchRpt_StautsUpd" onclick="SetArchRpts('ArchRpt_StautsUpd');" /> 
Previous Week Status Updates<br /> 
<div id="ArchRpt_StautsUpd_sub" style="display:none;"> 
    some additional form options here 
</div> 
<!--- Monthly Accomplishments REPORT ---> 
<input name="ArchRpt" type="radio" value="MoAccompl" id="ArchRpt_MoAccompl" onclick="SetArchRpts('ArchRpt_MoAccompl')" /> 
Monthly Accomplishments (MA)<br /> 
<div id="ArchRpt_MoAccompl_sub" style="display:none;"> 
    some additional form options here 
</div> 
</form> 

和JS:

<script Language="JavaScript"> 
function SetArchRpts(RadioOption){ 
$('#'+RadioOption).attr('checked', true); 

if (RadioOption == 'ArchRpt_WorkEfforts'){ 
    $('#ArchRpt_WorkEfforts_sub').slideDown(); 
    $('#ArchRpt_StautsUpd_sub').slideUp(); 
    $('#ArchRpt_MoAccompl_sub').slideUp(); 
} 
else if (RadioOption == 'ArchRpt_StautsUpd'){ 
    $('#ArchRpt_WorkEfforts_sub').slideUp(); 
    $('#ArchRpt_StautsUpd_sub').slideDown(); 
    $('#ArchRpt_MoAccompl_sub').slideUp(); 
} 
else if (RadioOption == 'ArchRpt_MoAccompl'){ 
    $('#ArchRpt_WorkEfforts_sub').slideUp(); 
    $('#ArchRpt_StautsUpd_sub').slideUp(); 
    $('#ArchRpt_MoAccompl_sub').slideDown(); 
} 
} 
</script> 
+0

什么是你的问题? – SaravananArumugam

+0

在上面的代码中给所有的div分配一个通用的类名。假设你给了他们一个班级名称“sub-divs”。现在在SetArchRpts函数中添加一行代码$('。sub-divs')。slideUp()。我认为这就是你想要的。 – mysterious

+0

实际问题已在上述细节中重述,而不仅仅是标题中。 – HPWD

回答

0

太多的重复代码,并选择错摆在首位..

$('##'+RadioOption) 

应该是

$('#'+RadioOption); // Need to use only a single pound # 

你可以在一个函数中写出整个代码ñ..

$('input[name="ArchRpt"]').on('click', function() { 
    if ($(this).is(':checked')) { 
     $('div[id*="ArchRpt"]').slideUp(); 
     $(this).nextAll('div').first().slideDown(); 
    } 
});​ 

Check Fiddle

编辑

这只是一个黑客 ..你可以试试这个方式..

var checkedId = ''; 
$('input[name="ArchRpt"]').on('click', function() { 
    if (this.id !== checkedId) { 
     checkedId = this.id; 
     $('div[id*="ArchRpt"]').slideUp(); 
     $(this).nextAll('div').first().slideDown(); 
    } 
});​ 

UPDATED FIDDLE

+0

看起来他/她正在使用ColdFusion,所以如果#在CFOUTPUT上下文中,##将转换为一磅。 – BKK

+0

代码是CF,双#(“##”)用作转义字符。我将更新要用作HTML的代码。感谢您接受这一点。 – HPWD

+0

我不知道那个..检查小提琴 –

1

试试这个 - DEMO

$("input[type=radio]").on("click", function() { 
    if ($("#" + this.id + "_sub").is(":visible")) return; 

    $("div[id^=ArchRpt_]").slideUp(); 
    $("#" + this.id + "_sub").slideDown(); 
}); 

只是注意 - 如果你使用jQuery,你应该利用其事件侦听器,而不是使用onclick -s。

+0

是的,我只是懒惰。我正在更新旧版表格。 – HPWD

+1

删除代码更容易,然后添加新的:)你可以安全地删除所有的'onlick'-s,并让你的标记清洁..缩短你的JS是一个非常好的主意,以及;-) –

+0

现在试试你的解决方案.. – HPWD

1

这里:Demo

$('input[name="ArchRpt"]').on('click', function(){ 
    var $sub = $('#'+$(this).attr('id')+'_sub'); 
    $('#ArchRpt_WorkEfforts_sub, #ArchRpt_StautsUpd_sub, #ArchRpt_MoAccompl_sub').not($sub).slideUp(); 
    $sub.slideDown(); 
}); 
+0

在你的jsFiddle上,如果你选择一个收音机选项,然后再次点击它,效果会重复。你知道如何改正它,所以它不会再次触发事件?要重现,请选择第一个无线电选项。然后,再次点击它,你会看到行为。 – HPWD

+0

@diackey - 对不起!更新。 – ioanb7

+0

您的更新解决了重复的操作。看起来像效果完成时,IE8中的所有三种解决方案都闪烁。 – HPWD