为什么不设置.attr('checked','checked')?

时间:2010-04-08 00:43:40

标签: jquery checkbox click

我有以下代码片段(我正在使用jQuery 1.4.2):

$.post('/Ads/GetAdStatsRow/', { 'ad_id': id }, function(result) {
    $('#edit_ads_form tbody').prepend(result);
    $(result).find('td.select-ad input').attr('checked','checked').click();
});

假设帖子正常运行并返回正确的预构建<tr>,其中包含<td>$(result).find()。这是奇怪的:click()行找到正确的输入(这是一个复选框,因为它是单元格中唯一的输入)并正确运行链式$(result).find()函数,但是它拒绝将框设置为检查,我需要发生。

这也是一个疯狂的转折......当我获得超级特定并将$('#ad_' + id).click(); 行更改为此(复选框的ID)时:

click()

它会检查该框,但不会运行$('#ad_' + id).attr('checked','checked').click(); 功能!如果我将其设置为

$('#ad_' + id).click().attr('checked','checked');

它会运行点击功能,就像检查了该框一样,但是框仍未选中,如果我这样做

$(function())

它什么都不做。

世界上有什么问题呢?我的头发已经用完了......

谢谢!

修改

以下是我在$('td.select-ad input').live('click',AdPreview.selectAd); 电话中设置点击事件的方式:

$('#ad_' + id).click();

它适用于所有其他复选框,如果手动点击,新添加的复选框确实有效。

编辑2

经过一番挖掘,我发现了这个:

input
除了勾选方框外,

实际上 调用我的点击功能。但是,当调用click函数时(我已经检查过以确保var input = $(this); console.log(input.is(':checked')); 是正确的复选框,而且是),

{{1}}

即使实际检查了该框,日志也会返回false! GAH WTF

5 个答案:

答案 0 :(得分:4)

我认为这是因为你正在查找一些不在DOM中的HTML。

$.post('/Ads/GetAdStatsRow/', { 'ad_id': id }, function(result) {
    // the "result" html is copied into the DOM
    $('#edit_ads_form tbody').prepend(result);

    // now you're doing a find on some HTML which isn't in the DOM.
    $(result).find('td.select-ad input').attr('checked','checked').click();
});

这解释了为什么在某种程度上做特定的东西是有效的。以下是个别问题:

$('#ad_' + id).click();

这将点击该框(使其得到检查),但没有附加任何事件。

$('#ad_' + id).attr('checked','checked').click();

这会将属性设置为选中,然后单击它,直接取消选中它。

答案 1 :(得分:2)

http://www.electrictoolbox.com/check-uncheck-checkbox-jquery/

jQuery(或浏览器的DOM?我忘了)期望“checked”属性的真值或假值,尽管在HTML-source-land中它是“checked ='checked'”。

HTH。

答案 2 :(得分:1)

我怀疑这里发生的事情是Click实际上是取消了复选框。这是因为正如您所说,Find方法会返回复选框。

尝试删除点击通话。

以下是一些示例代码

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    </head>

    <body>

        <script type="text/javascript">
            function clicked() {
                console.log('clicked');
            }

            $(document).ready(function() {

                var result = '<tr><td><input type="checkbox" id="chkbx" onclick="clicked()" /></td></tr>';

                $('#edit_ads_form tbody').prepend(result);

                $('#edit_ads_form tbody').find("input").click();
            });
        </script>

        <table id="edit_ads_form">
        <tbody>

        </tbody>
        </table>
    </body>
</html>

答案 3 :(得分:1)

我想通了,谢谢所有让我走上正轨的人。这就是我必须做的事情:

首先,我更新它们以在click()上运行,而不是将我的复选框连接到change()上。在我这样做之后,我使用以下代替另一行:

$('#ad_' + id).click().change();

现在一切正常!复选框保持选中状态,并调用正确的函数。

再次感谢大家!

答案 4 :(得分:0)

没有$(result).find('td.select-ad input').attr('checked','checked').click();要检查它(.attr('checked','checked'))然后点击(.click())取消选中它?

请原谅我,如果有什么我想念,但我很确定就是这样。这就是为什么$('#ad_' + id).click();有效,但你的其他例子没有。