【问题标题】:jquery in yii: Detecting radiobutton losing check mark (checked state)yii 中的 jquery:检测单选按钮丢失复选标记(选中状态)
【发布时间】:2014-03-24 15:26:03
【问题描述】:

给定以下代码(是的,我知道它在 yii 中可能无关紧要,但我添加了标签,所以我用实际生成的 html 更新了问题):

<script>
$(function(){
    $('#widgetId-form input[name="valueType"]').change(function(){
        if ($(this).is(":checked"))
        {
            console.log("habilitando "+$(this).data("class"));
            $("."+$(this).data("class")).prop("disabled", false);
        }
        else
        {
            console.log("deshabilitando "+$(this).data("class"));
            $("."+$(this).data("class")).prop("disabled", true);
        }
    }).change();
});
</script>
<div id="widgetId-dialog">
<form id="widgetId-form" action="/support/test" method="post">
    <div>
        <input id="valueType-single" value="single" data-class="singleValueField" checked="checked" type="radio" name="valueType" />
        <label for="single">Valor simple</label>
        <input size="6" class="singleValueField" type="text" value="" name="singleValue" id="singleValue" />
    </div>
    <div>
        <input id="valueType-range" value="range" data-class="rangeValueField" type="radio" name="valueType" />
        <label for="range">Rango (inicio:fin:intervalo)</label>
        <input size="6" class="rangeValueField" type="text" value="" name="rangeValue_start" id="rangeValue_start" />:<input size="6" class="rangeValueField" type="text" value="" name="rangeValue_end" id="rangeValue_end" />:<input size="6" class="rangeValueField" type="text" value="" name="rangeValue_interval" id="rangeValue_interval" />
    </div>
</form>
</div>

当收音机未被选中时,它不会触发 change()。这意味着:仅在初始化 (.ready()) 时禁用控件。 change() 不会由失去复选标记的控件单独触发。

问题:如何检测单选按钮何时丢失复选标记?

【问题讨论】:

  • 您是否尝试将 on 附加到 "widgetId-dialog" ? api.jquery.com/on$("#widgetId-dialog").on('change', 'input[name="valueType"]', function() ......
  • 可能是一个愚蠢的问题,但代码是写的吗?就目前而言,javascript 可以在绘制 HTML 之前执行。尝试将其包装在 $( document ).ready()
  • @stakolee $(function(){ == $(document).ready() ..同样的事情
  • 来自 jquery doc:“此方法是前两个变体中 .on( "change", handler ) 和第三个变体中 .trigger( "change" ) 的快捷方式。"
  • 您是否使用任何 jquery 插件来自定义您的单选按钮,或直接单击本机输入之外的任何间接更改单选按钮的状态。因为在这种情况下,收音机更改功能不会触发,您必须手动触发它。

标签: javascript jquery html yii


【解决方案1】:

这是一个概念问题。单选按钮看起来像是一个元素。有关详细信息,请查看Why does jQuery .change() not fire on radio buttons deselected as a result of a namesake being selected?
因此更改事件将始终仅在新选择的元素上触发,而不是在取消选择的收音机上触发。你可以像这样修复你的代码:

$(function(){
    $('#widgetId-form input[name="valueType"]').change(function(){
        //could be also hardcoded : 
        $('input[name="' + $(this).attr("name") + '"]').each(function(){
                 if ($(this).is(":checked"))
            {
                console.log("habilitando "+$(this).data("class"));
                $("."+$(this).data("class")).prop("disabled", false);
            }
            else
            {
                console.log("deshabilitando "+$(this).data("class"));
                $("."+$(this).data("class")).prop("disabled", true);
            }
        });
    });

    $('#widgetId-form input[name="valueType"]:first').change();
});

您可以通过http://jsfiddle.net/jg6CC/查看。迎接另一个 Luis M. ;)

【讨论】:

  • 如果您有很多收音机,您可以记住最后选择的收音机并在此收音机和新选择的收音机上应用更改。这样就无需遍历所有内容(并节省性能..即使您不应该在迭代时遇到性能问题)
  • 我以类似于此处描述的方式解决了(我放弃了,并得出了相同的结论)。然而,对我来说很愚蠢的是,HTML 单选按钮不会因为未选中单选按钮而触发 change()(从这个意义上说,根本不需要记住上一个单选)。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2011-04-28
  • 2014-02-14
  • 2019-05-29
  • 2013-09-20
相关资源
最近更新 更多