我的表单中包含多个input type="radio"
,旁边有文字。我想要隐藏那些inputs
并仅显示文字,这会对点击和更改inputs
的值以及背景颜色做出反应。
HTML:
<div class="right">
<div>
<span onclick='$("input.rg1").attr("checked", false).change();'>Choose</span>
<div>A<input type="radio" name="radio[1]" class="rg1" value="1"></div>
<div>B<input type="radio" name="radio[1]" class="rg1" value="2"></div>
<div>C<input type="radio" name="radio[1]" class="rg1" value="3"></div>
</div>
</div>
使用Javascript:
// Bind click event on divs and send it to radio input
$("div.right div div").click(function(e){
if(!$(e.target).is("input") )
{
alert("Clicked Div/Text!")
$(e.target).children("input").click();
}
});
// Hide all radio inputs, make only texts visible
$("div.right input[type='radio']").hide();
// Bind change event on radio inputs, change
// background-color of text that is next to clicked radio input
$("div.right input[type='radio']").change( function(e){
alert("change Event "+$(e.target).is(":checked"));
if( $(e.target).is(":checked") )
{
$(e.target).parent().css("background-color", "#A00");
}
else
{
$(e.target).parent().css("background-color", "#00A");
}
});
问题是,当我点击收音机旁边的文字(例如A)时,弹出2个警报并更改背景颜色,但如果我再次点击该文字,我只得到第一个警报,但不是第二个。为什么?
在第一个警报之后,有$(e.target).children("input").click();
应该运行该更改事件,但它没有,尽管没有任何条件。
任何人都能给我一个关于错误的建议吗?谢谢
答案 0 :(得分:1)
问题是您使用单选按钮作为输入元素。选中后,再次单击它们将不会取消选中它们,因此不会“更改”它们的状态。除非您单击属于同一组的其他单选按钮。这意味着如果您单击两次相同的元素,则更改功能将不起作用。
尝试使用复选框,它将起作用 - &gt; http://jsfiddle.net/jPMF9/
答案 1 :(得分:1)
问题在于您正在使用更改事件,该事件在第二次单击无线电时不会触发,因为它不会更改。但根据您的代码,您可能需要考虑使用标签,这将允许在IE8以外的每个现代浏览器中使用纯css获得相同的效果。唯一的问题是您的标签必须遵循您的输入。
您的HTML重做标签:
<input type="radio" id="radioa" name="radio[1]" class="rg1" value="1" />
<label for="radioa">A</label>
<input type="radio" id="radiob" name="radio[1]" class="rg1" value="2" />
<label for="radiob">B</label>
<input type="radio" id="radioc" name="radio[1]" class="rg1" value="3" />
<label for="radioc">C</label>
CSS:
[type=checkbox], [type=radio] {
display: none;
}
[type=checkbox] + label, [type=radio] + label {
background-color: #00A;
}
:checked + label {
background-color: #A00;
}
就是这样。我继续为无线电和复选框制作它,因为两者都是可检查的,但就像我说的那样,只有它的<input /><label></label>
才有效,因为CSS没有(也许永远不会)允许父选择器而不是但允许前面的兄弟选择器。如果该订单不是一个选项,那么您将通过js返回。
答案 2 :(得分:0)
请你检查一下这个解决方案:
// Bind click event on divs and send it to radio input
$("div.right div div").unbind("click").bind("click", function(e){
if(!$(e.target).is("input") )
{
alert("Clicked Div/Text!")
$(e.target).children("input").attr("checked", "checked");
$(e.target).children("input").trigger("change");
}
});
// Hide all radio inputs, make only texts visible
$("div.right input[type='radio']").hide();
// Bind change event on radio inputs, change
// background-color of text that is next to clicked radio input
$("div.right input[type='radio']").unbind("change").bind("change", function(e){
alert("change Event "+$(e.target).is(":checked"));
if( $(e.target).is(":checked") )
{
$(e.target).parent().css("background-color", "#A00");
}
else
{
$(e.target).parent().css("background-color", "#00A");
}
});