【问题标题】:Dynamically disable MDL textbox via JavaScript通过 JavaScript 动态禁用 MDL 文本框
【发布时间】:2018-10-19 12:13:04
【问题描述】:

我需要通过 JS 禁用 Material Design Lite 文本字段。我了解我需要将元素升级到 MDL 检测更改。

我希望这样做:

$element.attr('disabled', 'disabled');
componentHandler.upgradeElement($element);

但这似乎不起作用。我以这个可行的解决方案结束:

$element.attr('disabled', 'disabled');

let inputWrap = $element.parent();

inputWrap.attr('data-upgraded', '');
inputWrap.attr('class', inputWrap.attr('class').replace(/is-upgraded/g, ''));
inputWrap.attr('class', inputWrap.attr('class').replace(/is-focused/g, ''));

componentHandler.upgradeElement(inputWrap[0]);

它成功了,但我无法摆脱手动为upgradeElement 函数工作的感觉。

有没有办法用不那么激烈的方法来实现这一点?任何帮助将不胜感激。

【问题讨论】:

    标签: javascript material-design-lite


    【解决方案1】:

    仅仅改变类只会改变它的显示方式,它不会禁用按钮。同样,仅设置 disabled 属性会禁用它,但不会改变它的外观。正确的方法是在MaterialCheckbox 上使用内置的disableenable 方法。所以如果这是你的复选框

    <label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect" for="checkbox-2">
        <input type="checkbox" id="checkbox-2" class="mdl-checkbox__input">
        <span class="mdl-checkbox__label">Checkbox</span>
    </label>
    

    那么这就是你如何禁用它

    document.getElementById("checkbox-2").parentNode.MaterialCheckbox.disable();
    

    这就是你启用它的方式

    document.getElementById("checkbox-2").parentNode.MaterialCheckbox.enable();
    

    【讨论】:

    • 这应该是公认的答案。事实上,文本字段是MaterialTextfield。无论如何+1
    【解决方案2】:

    当输入元素的值以编程方式更改时,MDL 不会动态地重新评估输入元素,而且我还没有找到要求它重新评估自身的好方法。

    好消息是你不需要清理元素并再次调用 componentHandler.upgradeElement(),你只需要向元素添加或删除适当的类,这样样式就会正确更改。

    在您的情况下,您只需将 'is-disabled' 类添加到禁用的元素并将其从未禁用的元素中删除:

    if (element.disabled) {
        element.parentNode.classList.add("is-disabled");
    } else {
        element.parentNode.classList.remove("is-disabled");
    }
    

    还有其他类,例如“is-readonly”(用于只读字段)、“is-checked”(用于复选框)、“is-invalid”(用于无效输入)和少数其他类。

    对于使用此库的项目,我创建了一个small helper function,它将扫描元素下的输入字段并重新评估类。动态加载数据后,我调用辅助函数,它负责修复表单的样式。

    可能有更好的方法来做到这一点,但我还没有找到。

    【讨论】:

    • 拒绝投票,因为这不起作用:CSS 将使它看起来被禁用,但实际上并没有禁用复选框
    • 问题提到该元素已经禁用。问题是通过 DOM 进行更改后视觉样式不正确。您的答案也可以,但会重新禁用该元素。这不是一个错误的答案,您的回答比被问到的要多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2011-12-01
    相关资源
    最近更新 更多