代码之家  ›  专栏  ›  技术社区  ›  rism

为什么jquery中为动态创建的复选框定义属性的顺序会影响其值?

  •  0
  • rism  · 技术社区  · 14 年前

    我在JS文件中有此代码:

    function buildRolePicker() {
        var pnl = $("[id$='staffRoles']");
        $.each(roles["ContactGroupRoles"], function(iteration, item) {
            pnl.append(
                    $(document.createElement("input")).attr({
                        id: 'cgr' + item['RoleId'],
                        name: 'cgroles',
                        value: item['RoleId'],
                        title: item['RoleName'],
                        type: 'checkbox'
                    })
            );
            pnl.append(
                    $(document.createElement('label')).attr({
                        'for': 'cgr' + item['RoleId']
                    })
                    .text(item['RoleName'])
            );
        });
    
        alert(document.forms[0].cgroles[8].value);
    }
    

    我在代码的其他部分浪费了一些时间,试图找出为什么调用

    alert(document.forms[0].cgroles[8].value);
    

    正在返回值“on”,而它应该返回一个long。结果发现问题在于属性的定义顺序。如果我改变这个:

                $(document.createElement("input")).attr({
                    id: 'cgr' + item['RoleId'],
                    name: 'cgroles',
                    value: item['RoleId'],
                    title: item['RoleName'],
                    type: 'checkbox'
                })
    

    对此:

                    $(document.createElement("input")).attr({
                        type: 'checkbox',
                        id: 'cgr' + item['RoleId'],
                        name: 'cgroles',
                        value: item['RoleId'],
                        title: item['RoleName']
                    })
    

    一切正常,当我:

    警报(document.forms[0].cgroles[8].value);
    

    我的问题是为什么?

    测试数据:

    var roles = {"ContactGroupRoles":[
        {"RoleId":1,"RoleName":"Pending"},
        {"RoleId":2,"RoleName":"CEO"},
        {"RoleId":3,"RoleName":"Financial Controller"},
        {"RoleId":4,"RoleName":"General Manager"},
        {"RoleId":5,"RoleName":"Production Manager"},
        {"RoleId":6,"RoleName":"Sales Manager"},
        {"RoleId":7,"RoleName":"Marketing Manager"},
        {"RoleId":8,"RoleName":"Sales Agent"},
        {"RoleId":9,"RoleName":"Customer Service"},
        {"RoleId":10,"RoleName":"Manager"}
      ]};
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Nick Craver    14 年前

    不管出于什么原因(至少IE8)和歌剧院 value 属性(尽管chrome/firefox可以)通过更改 type . 下面是一个简化的测试:

    $(document.body).append(
        $("<input />").attr({
            value: 'Test',
            type: 'checkbox'
        })
    );
    alert($("input").val());
    alert(document.body.innerHTML);
    

    You can try it here

    IE8/Opera警报:

    • “on”
    • <input type="checkbox">

    Chrome/Firefox警报:

    • “测试”
    • <input type="checkbox" value="Test">

    我不知道为什么Opera会这样做,但无论如何……只是想更好地演示这个问题,解决方法当然是保持 类型 属性优先。也许未来的jquery版本将处理 类型 不过,如果 <input> 之前用任何属性定义的,这仍然不会有什么好处。

    然而, $("<input />", { value: 'Test', type: 'checkbox' }); 格式也有同样的问题,在我看来 应该 固定。