我想根据所选的单选按钮显示/隐藏列表项。我有3个按钮,每个按钮应显示一组不同的字段(内部列表项)。出于某种原因,只有最后一个有效。我究竟做错了什么? i followed the suggestions here和我所能说的我的比赛。
jsfiddle在这里发布:http://jsfiddle.net/Vm2aA/
这是我的jQuery:
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$( "#datepicker" ).datepicker({ minDate: -1, maxDate: "+24D" });
$('#pancettaForm').change(function() {
if ($('#ship-address').prop('checked')) {
$('#address').show();
} else {
$('#address').hide();
}
if ($('#ship-date').prop('checked')) {
$('#new-ship-date').show();
} else {
$('#new-ship-date').hide();
}
if ($('#ship-both').prop('checked')) {
$('#address, #new-ship-date').show();
} else {
$('#address, #new-ship-date').hide();
}
});
});
</script>
HTML
<form name="pancettaForm" method="post" action="http://lizlantz.com/lcform.php" id="pancettaForm">
<input type="hidden" value="Pancetta Order Update" name="subject">
<input type="hidden" value="cookware/partners_10151_-1_20002" name="redirect">
<ul>
<li>
<label for="update-ship">I'd like to:</label>
<input id="ship-address" name="update-ship" type="radio" value="update-ship-address"/> Have pancetta shipped to a different address than my skillet<br />
<input id="ship-date" name="update-ship" type="radio" value="update-ship-date" /> Have pancetta shipped sooner than June 14, 2013 <br />
<input id="ship-both" name="update-ship" type="radio" value="update-both" /> Make changes to both the shipping address and shipping date
</li>
<li>
<label for="order-number"><em>*</em>Order Number (available in order confirmation email):</label>
<input type="text" name="order-number">
</li>
<li>
<label for="full-name"><em>*</em>Recipient Full Name:</label>
<input type="text" name="full-name">
</li>
<li id="address" style="display: none;">
<label for="address">
<em>*</em>Address
</label>
<input type="text" name="address">
<label for="address2">
Address Line 2
</label>
<input type="text" name="address2">
</li>
<li id="address2" style="display: none;">
<label for="city">
<em>*</em>City
</label>
<input type="text" name="city">
<label for="state">
<em>*</em>State
</label>
<select name="state">
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AZ">Arizona</option>
</select>
<label for="zip">
<em>*</em>Zip Code
</label>
<input type="text" name="zip">
</li>
<li id="new-ship-date" style="display: none;">
<em>*</em><label for="update-ship">New Ship Date:</label>
<input type="text" id="datepicker" />
</li>
<li>
<label for="phone">
<em>*</em>Phone (for delivery quetsions)
</label>
<input type="text" name="phone">
</li>
</ul>
<input type="submit" id="button" name="submit" class="green">
</form>
答案 0 :(得分:1)
如果您只想定位单选按钮而不是有选择地隐藏和显示项目,我建议您按照“隐藏所有然后显示特定列表”的方法。它可以让你摆脱所有else{hide...}
条款,并使你的代码更易于维护。
请尝试以下代码
$('#pancettaForm').change(function () {
//hide all optional li's
$('#address,#address2,#new-ship-date').hide();
//and then show which one is necessary
if ($('#ship-address').prop('checked')) {
$('#address').show();
}
else if ($('#ship-date').prop('checked')) {
$('#new-ship-date').show();
}
else if ($('#ship-both').prop('checked')) {
$('#address, #new-ship-date').show();
}
});
另请注意else if
而不是if
。该代码也适用于else if
,因为在给定实例中只能检查一个单选按钮 。请注意,我已将选择器更改为仅使用单选按钮
上面的代码现在可以完成它的工作,但你必须注意$('pancettaForm').change(...)
表示如果以任何方式更改表单,它将会运行,例如,如果更新了文本框值。它仅现在会导致一些额外的处理。要消除此潜在问题,您可以使用以下代码替换上述代码
$('#pancettaForm').change(function (ev) {
//execute this block only if one of the radio button from "update-ship" group has changed
if (ev.target.name == 'update-ship') {
//hide all optional li's
$('#address,#address2,#new-ship-date').hide();
//and then show which one is necessary
if ($('#ship-address').prop('checked')) {
$('#address').show();
}
else if ($('#ship-date').prop('checked')) {
$('#new-ship-date').show();
}
else if ($('#ship-both').prop('checked')) {
$('#address, #new-ship-date').show();
}
}
});
答案 1 :(得分:0)
这是因为你将元素隐藏在最后一个if语句中。
$('#address, #new-ship-date').hide();
这是返回false(所以在显示其中一个元素后再次隐藏):
if ($('#ship-both').prop('checked'))