【问题标题】:jQuery UI checkboxes misbehaving when cloned克隆时 jQuery UI 复选框行为异常
【发布时间】:2013-02-13 03:32:12
【问题描述】:

我正在尝试创建一个输入表,当您在底行的一个输入中输入文本时,该表会自动添加一个新行。在大多数情况下,它工作正常。但是,我在使用 jQuery UI 复选框按钮时遇到了一些问题。

复选框按钮应该在单击时更改其图标。这适用于原始按钮,但添加新行时出现的克隆按钮无法正常工作。

你可以看到它in jsfiddle here。要复制该问题,请在第三个输入中放一些文本。您会看到出现了第四行。如果您按下第四个复选框,您会看到第三个复选框是图标发生变化的那个。错误的按钮也获得了 ui-state-focus 但实际上并没有获得焦点,这真的让我感到困惑,尽管正确的按钮确实获得了 ui-state-active 并且据我所知,似乎评估为已检查正确。

需要明确的是,这两个复选框具有相同的 ID,并且它们的标签用于正确的复选框 - createNewRow() 函数负责处理。如果您注释掉将复选框转换为 jQuery UI 复选框的行,您会看到一切正常。如果你在 buttonSwitchCheck 函数中控制台记录 $(this).attr('id') 的值,你会看到它在那里也有正确的 ID - 如果你点击第四个按钮,它会告诉你$(this) 的 id 是“test4”,但改变图标的​​是“test3”(第三个按钮)。

看着这个我快疯了,如果有人能提供任何帮助,我将不胜感激。代码如下:

// Turns on and off an icon as the checkbox changes from checked to unchecked.
function buttonSwitchCheck() {
    if ($(this).prop('checked') === true) {
        $(this).button("option", "icons", {
            primary: "ui-icon-circle-check"
        });
    } else {
        $(this).button("option", "icons", {
            primary: "ui-icon-circle-close"
        });
    }
}

// Add a new row at the bottom once the user starts filling out the bottom blank row.
function createNewRow() {
    // Identify the row and clone it, including the bound events.
    var row = $(this).closest("tr");
    var table = row.closest("table");
    var newRow = row.clone(true);
    // Set all values (except for buttons) to blank for the new row.
    newRow.find('.ssheet').not('.button').val('');
    // Find elements that require an ID (mostly elements with labels like checkboxes) and increment the ID.
    newRow.find('.ssheetRowId').each(function () {
        var idArr = $(this).attr('id').match(/^(.*?)([0-9]*)$/);
        var idNum = idArr[2] - 0 + 1;
        var newId = idArr[1] + idNum;
        $(this).attr('id', newId);
        $(this).siblings('label.ssheetGetRowId').attr('for', newId);
    });
    // Add the row to the table.
    newRow.appendTo(table);
    // Remove the old row's ability to create a new row.
    row.removeClass('ssheetNewRow');
    row.find(".ssheet").unbind('change', createNewRow);
}

$(document).ready(function () {
    // Activate jQuery UI checkboxes.
    $(".checkButton").button().bind('change', buttonSwitchCheck).each(buttonSwitchCheck);

    // When text is entered on the bottom row, add a new row.
    $(".ssheetNewRow").find(".ssheet").not('.checkButton').bind('change', createNewRow);
});

编辑:我能够找到一个解决方案,我将与年龄分享。感谢下面的“Funky Dude”,他启发了我开始沿着正确的轨道思考。

诀窍是在克隆之前销毁原始行中的 jQuery UI 按钮,然后立即为原始行和副本重新初始化它。您不需要取消绑定和重新绑定更改事件 - 只是 jQuery UI 按钮有问题。在 createNewRow 函数中:

row.find('.checkButton').button('destroy');
var newRow = row.clone(true);
row.find('.checkButton').add(newRow.find('.checkButton')).button().each(buttonSwitchCheck);

【问题讨论】:

    标签: javascript jquery jquery-ui


    【解决方案1】:

    尝试使用新的方法.on,它允许委托,这应该有助于动态更改您的 DOM:

    $(".checkButton").button().each(buttonSwitchCheck);
    $("table").on("change", ".checkButton", buttonSwitchCheck);
    

    我不确定,但它可能有助于不必担心将事件绑定到特定元素。

    另外,您可以将它用于文本框change 事件:

    $("table").on("change", ".ssheetNewRow .ssheet:not(.checkButton)", createNewRow);
    

    这是你对我的更改的小提琴:http://jsfiddle.net/Cugb6/3/

    它的功能没有任何不同,但对我来说,它更干净一些。我认为它可以解决您的问题,但显然没有,因为 button 小部件存在问题。

    有趣的是,他们似乎并不“支持”克隆:http://bugs.jqueryui.com/ticket/7959

    【讨论】:

    • 不幸的是,这并没有解决问题。不过谢谢!我将不得不更多地研究.on 方法;看起来很有用。
    • @flyingGhoti 我真的认为它会,但在用你的小提琴进行测试后,意识到button 小部件有问题。抱歉,它没有解决它,但希望它对某些事情有所帮助。我用一些东西更新了我的答案
    • 这确实有一定的优雅。当我开始处理它时,我可能会在整个项目中实施更改。至于 jQuery UI 不支持克隆……好吧,我只想说知道这很有用。
    • @flyingGhoti 在某些方面,它很优雅。 on 应该用于所有事件绑定。如果您想像bind 一样使用它,只需提供 2 个参数 - 事件名称“更改”,然后是回调。如果您想使用委托,这对于容器中的动态内容或有许多元素要绑定事件有好处,我会建议您这样做。因此,例如,如果您的表是一个静态表并且有数百行,所有行都有一个需要click 事件的按钮,那么它可能更高效干净 i> 使用委托。动态内容更是如此:)
    • 我的项目越复杂,我就越意识到这是多么棒的建议。谢谢,伊恩!它可能没有解决第一个问题,但从那以后解决了很多。
    【解决方案2】:

    我认为您正在使用深度克隆,它也克隆事件处理程序。在您的创建新行函数中,尝试取消绑定更改事件,然后在克隆上重新绑定。

    【讨论】:

    • 啊 - 但我没有尝试过的是在克隆按钮之前销毁它,然后再重新创建它!
    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2012-02-06
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多