如何在 Material Design Lite 中将事件附加到 Table 复选框

How to Attach Events to Table Checkboxes in Material Design Lite

创建 MDL table 时,其中一个选项是应用 class 'mdl-data-table--selectable'。当 MDL 呈现 table 时,会在指定列的左侧插入一个额外的列,其中包含允许您 select 特定行进行操作的复选框。对于我的应用程序,当有人选中或取消选中一个框时,我需要能够处理一些 JavaScript。到目前为止,我一直无法做到这一点。

问题是你没有直接指定复选框控件,它们是在 MDL 升级整个 table 时插入的。对于其他 MDL 组件,例如按钮,我可以在按钮本身上放置一个 onclick 事件,因为我使用 HTML 按钮标记指定它。

尝试将 onclick 置于为呈现复选框而创建的各种容器对象和跨度上未成功。我附加的事件似乎没有触发。我最接近的是将事件附加到 TR,然后遍历复选框以评估它们的状态。

这是 MDL 为单个复选框单元格生成的标记:

<td>
    <label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect mdl-data-table__select mdl-js-ripple-effect--ignore-events is-upgraded" data-upgraded=",MaterialCheckbox">
        <input type="checkbox" class="mdl-checkbox__input">
            <span class="mdl-checkbox__focus-helper"></span>
            <span class="mdl-checkbox__box-outline">
                <span class="mdl-checkbox__tick-outline"></span>
            </span>
            <span class="mdl-checkbox__ripple-container mdl-js-ripple-effect mdl-ripple--center">
                <span class="mdl-ripple"></span>
            </span>
    </label>
</td>

None 这个标记是我指定的,因此我不能简单地向标签添加一个 onclick 属性。

是否有我可以挂钩的事件链?我想按照编码员的意图去做。

我们目前没有办法直接解决这个问题。我们正在考虑使用 V1.1 添加事件,可以在 Issue 1210 订阅这些事件。请记住,只需使用右侧栏中的按钮订阅该问题。我们不需要一堆 +1 和其他无用的评论。

破解它的一种方法是将事件绑定到 table 本身,监听任何 "change" 事件。然后,您可以从事件的目标沿链向上移动以获取 table 行,然后从那里获取您需要的数据。

这不是最好的代码片段,但话又说回来,MDL 也不是最好的库。其实还挺丑的。

除此之外,现在关于我的代码:代码将绑定到文档根上的单击事件,该单击事件源自具有 class mdl-checkbox.

的元素

第一个问题:事件触发了两次。为此,我使用了 a piece of code from Underscore.js / David Walsh 来消除点击时函数调用的抖动(如果该函数在 250 毫秒的间隔内执行多次,它只会被调用一次)。

第二个问题:点击事件发生在 MDL 更新 select 框的 is-checked class 之前,但是我们可以假设点击改变了复选框的状态,因为上一次,所以在大多数情况下,在点击时取消 hasClass 是确定选中状态的一个非常安全的选择。

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
}

$(document).on("click", ".mdl-checkbox", debounce(function (e) {
    var isChecked = !$(this).hasClass("is-checked");
    console.log(isChecked);
}, 250, true));

希望对您有所帮助 ;)

您可以从包含表单委托更改事件。

例如

var form = document.querySelector('form');
form.addEventListener('change', function(e) { 
    if (!e.target.tagName === 'input' || 
         e.target.getAttribute('type') !== 'checkbox') { 
       return;
    }
    console.log("checked?" + e.target.checked);
});