单选按钮的onchange事件无法工作

12

我有几个单选按钮,应在其更改时调用hider(something); 这意味着当它们被选中或取消选中时。这有效,即当被选中时,它们调用JS函数,然而,如果由于选择该组中的另一个单选按钮而取消选中它们,则不会再次调用js脚本。

我需要使用除onchange之外的其他内容吗?

目前单选按钮的外观如下:

<input name="ostype" type="radio" value="0" onchange="hider(solaris);">solaris
<input name="ostype" type="radio" value="1" onchange="hider(linux);">linux

我的隐藏函数目前是:

function hider(divid) {
 if ($(divid).is('.hidden')) {
  $(divid).removeClass('hidden');
 } else {
  $(divid).addClass('hidden');
 }
}

我正在使用Opera 11进行测试,但任何浏览器都可以 :) - Florian
7个回答

8

由于这个问题仍然没有得到正确的回答,但在谷歌搜索中排名相当高,所以这里为仍在寻找答案的人提供一个正确的解决方案。

如果您正在使用jQuery,只需使用jQuery的属性选择器,如Flavius Stef所指出的那样。

OP,你的代码并不完全清楚它的作用。假设在你的代码中,你想将“hidden”类添加到任何选中的单选按钮上。

$("your selector here").change(function() {
    $('input[name="' + this.name + '"]').removeClass("hidden");

    $(this).addClass("hidden");
});

请注意$(this)(jQuery对象)和this(DOM对象)之间的区别。我基本上是从具有相同名称的每个输入中删除“hidden”类,然后将“hidden”类添加到当前输入。
当然,我假设您在页面上不使用重复的名称来表示不同的输入。还请注意,这仅适用于单选按钮,因为单选按钮“更改”事件仅在激活时触发,而不在取消激活时触发。
在复选框和单选按钮上监听onchange事件
在我的情况下,我想要将“checked”类添加到活动单选按钮和复选框中。由于复选框在选中和取消选中时都会触发“onchange”事件,因此我需要一些额外的代码。
$('input[type="radio"]').change(function() {
    $('input[name="' + this.name + '"]').removeClass("checked");
    $(this).addClass("checked");
});

$('input[type="checkbox"]').change(function() {
    $(this).toggleClass("checked", ($(this).is(":checked")));
});

后一个函数使用toggleClass来设置“checked”类,如果.is(":checked")true

或者你可能想将这两个函数结合成类似以下的形式:

$('input[type="radio"], input[type="checkbox"]').change(function() {
    if(this.type == "radio")
        $('input[name="' + this.name + '"]').removeClass("checked");

    $(this).toggleClass("checked", ($(this).is(":checked")));
});

无论哪种方式,当监听onclick事件时一定要小心,因为当通过键盘导航激活输入时,该事件不会触发。

4

使用 onclick

作为函数调用的参数,你需要使用一个字符串,并将其作为jQuery选择器的id('#solaris') - 更好的方法是使用this:

<input name="ostype" type="radio" value="0" onclick="hider(this);">solaris

onclick 有同样的问题。它只在我点击 /那个/ 单选按钮时调用它,而不是在我选择其他单选按钮时调用。 - Florian
他试图隐藏 div 而不是 input。this 不是解决方案。 - Andrew Jackman
1
不仅 onclick 存在相同的问题;而且,单选按钮不仅可以通过点击来选择,还可以通过其他方式选择,例如点击与其关联的标签。 - matteo

1
在文档准备就绪时,将更改事件绑定到所有单选按钮:
$(function(){

   $('input[name=list_type]:radio').on("change", function(){   
       showHideBlock();
   });
   showHideBlock();    
});

根据一个单选按钮的状态显示 / 隐藏块:

function showHideBlock(){
   if ($("#Option").is(':checked')){
       $('#Block').show();
   } else {
       $('#Block').hide();
   }

}


0

这里有一个版本,你可以从中获得灵感(在Chrome和FF上测试过):

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js">
</script>
</head>
<body>
<input type="radio" name="ostype" checked="checked" onclick="hider('linux')">linux
<input type="radio" name="ostype" onclick="hider('solaris');">solaris

<div id="content">
        <div id="linux">linux</div>
        <div id="solaris" style="display:none;">solaris</div>
</div>
<script>
function hider(divname) {
        $('#content div').each(function(){
                $(this).hide(); 
        });

        $('#'+divname).show();
}
</script>
</body>
</html>

onclick 有同样的问题。它只在我点击 /那个/ 单选按钮时调用它,而不是在我选择其他单选按钮时调用。 - Florian
使用onclick事件,隐藏所有元素并仅显示与所选单选按钮匹配的元素。 - Shadow The Spring Wizard
我的错,我没有理解实际问题。你需要采取不同的方法:在 hider() 中迭代所有的单选按钮并将它们隐藏,然后调用 $(divid).removeClass('hidden') - Flavius Stef
好的,我如何迭代遍历所有name="ostype"的单选框? - Florian
$('input[name=ostype]:radio').each() - Flavius Stef
这个好像不起作用:function hider(divid) { $('input[name=ostype]:radio').each(addClass('hidden')); $(divid).removeClass('hidden'); } - Florian

0
<input name="ostype" type="radio" value="0" onclick="hider('solaris');">solaris
<input name="ostype" type="radio" value="1" onclick="hider('linux');">linux

function hider(divid) {
 $( 'div.div_class' ).hide();
 $( '#' + divid ).show();
}

确保您添加一个类来调用div,并确保在函数调用中将solaris和linux放在引号中


0
如果我理解正确,你可以在每个按钮上使用onClick,并将其他按钮隐藏,同时显示你正在单击的按钮。就像这样:
function showInfo(info)
    {
        var info = document.getElementById("1");
        info.style.display = "block";

        var info = document.getElementById("2");
        info.style.display = "none";

        }

所以第一个正在显示,第二个正在隐藏。 然后为每个应该隐藏的div添加一个。

您也可以使用jQuery完成此操作。

function showAndHide(val1, val2)
        {
        $(val1).hide();
        $(val2).show();
        }

而且不要忘记在每个div中加入style="display:none"。


-1

你是否声明了变量solaris和linux? 否则你的浏览器应该会显示错误


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接