【问题标题】:Onchange event on a radio button doesn't work单选按钮上的 Onchange 事件不起作用
【发布时间】:2013-03-18 10:14:28
【问题描述】:

我有这组单选按钮:

{% for user in users %}

        <form name="form_user_{{ user.id }}" method="post" action="/networks/{{ net.id }}/sensors/{{ sens.id }}/rights">
          <tr>
            <td>
              <div>
                {{ escape(user.name) }}
                <input type='hidden' name="id" value='{{ user.id }}'>
              </div>
            </td>
            <td>

              <label class="radio inline" onchange="document.forms['form_user_{{ user.id }}'].submit();">
                <input type="radio" name="perms" id="perms_{{user.id}}_0" value="0">
                None
              </label>
              <label class="radio inline" onchange="document.forms['form_user_{{ user.id }}'].submit();">
                <input type="radio" name="perms" id="perms_{{user.id}}_1" value="1">
                Read
              </label>
              <label class="radio inline" onchange="document.forms['form_user_{{ user.id }}'].submit();">
                <input type="radio" name="perms" id="perms_{{user.id}}_4" value="4">
                Read + Commands
              </label>

              {{ xsrf_form_html() }}
            </td>

          </tr>
        </form>
        {% end %}

我有一个 js 函数可以更改单选按钮的检查,当单选按钮检查更改时,我会提交表单工作。如果我单击单选按钮,一切正常。但是如果我使用改变检查的js函数,这不起作用。为什么?

谢谢。

编辑

这是我的js函数:

<script>
function checkall(perm){

var permall = parseInt(perm);

switch (permall){
case 0:
    {% for user in users %}
    document.getElementById("perms_{{user.id}}_0").checked=true
    {% end %}
    break;
case 1:
    {% for user in users %}
    document.getElementById("perms_{{user.id}}_1").checked=true
    {% end %}
    break;
case 4:
    {% for user in users %}
    document.getElementById("perms_{{user.id}}_4").checked=true
    {% end %}
    break;
  }
}
</script>

【问题讨论】:

    标签: javascript html radio-button onchange


    【解决方案1】:

    可能是因为 JS 没有触发 onchange 事件。你必须自己触发它。

    此处手动触发事件的说明:StackOverflow topic

    [最佳创意]

    经过思考,我认为最好的方法是在 Ajax 方法中调用表单操作 url。

    使用 jQuery,它可能类似于:

    var changeRadio = function(callback, checkedData) {
        $.ajax({
           type : 'POST',
           url : callback,
           data : checkedData,
           success : function() {
              //if you wan't, you can do something
            }
        });
    
    };
    

    在您的switch 中:EDIT(在第二个参数中用冒号替换逗号)

        {% for user in users %}
            document.getElementById("perms_{{user.id}}_0").checked=true;
            changeRadio(document.forms['form_user_{{ user.id }}'].action, {document.getElementById("perms_{{user.id}}_0").name:document.getElementById("perms_{{user.id}}_0").value});
        {% end %}
        break;
    

    感谢 jQuery

    所有jQuery方法:

    var changeRadio = function(callback, inputElement) {
        var element = inputElement; //By creating a global var, you're able to access it into success function
        $.ajax({
           type : 'POST',
           url : callback,
           data : {$(element).attr('name'):$(element).val()},
           success : function() {
              $(element).attr('checked', true);
            }
        });
    
    };
    
    function checkall(perm){
    
        var permall = parseInt(perm);
        $('input:checkbox[value="'+permall+'"]').each(function() {
           changeRadio($(this).parent('form').attr('action'), $(this));
        });
    }
    

    上次编辑

    JS

     var changeRadio = function(callback, inputElement, form) {
        var element = inputElement; //By creating a global var, you're able to access it into success function
        console.log(form);
        $.ajax({
            type : 'POST',
            url : callback,
            data : $(form).serialize(),
            success : function() {
                 $(element).attr('checked', true);
            }
    });
    };
    
    var checkall = function (perm){
        var permall = parseInt(perm);
        $('input:radio[value="'+permall+'"]').each(function() {
            changeRadio($('#form_user_'+$(this).attr('user_id')).attr('action'), $(this),$('#form_user_'+$(this).attr('user_id')));
        });
    }
    
    $(document).ready(function() {
        $('.checkallCaller').on('click', function() {
            checkall($(this).attr('rel'));
        });
    });
    

    并且在 HTML 中,将 'checkallCaller' 类添加到检查所有收音机的每个标签中,并将user_id 属性添加到用户收音机。 (这不是 w3c,但它有效)

    【讨论】:

    • 我用我的 js 函数编辑问题。无论如何,我可以只更改标签元素,而不是单选按钮吗?我该怎么办?
    • 当单选按钮选中更改我要提交表单!
    • 如果我有一个用户列表,它只提交列表中最后一个用户的表单。像 for 循环这样的东西不起作用。无论如何,使用 jQuery 的解决方案非常有趣。我想我必须朝着这个方向去做。
    • 其实因为上一个的限制,我已经添加了jQuery方案。
    • 为什么像checkedData一样传递名称和值?我认为这与我通常传递给我的表格不同。我认为错误就在这里。
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多