通过 JavaScript 动态禁用 MDL 文本框
Dynamically disable MDL textbox via JavaScript
我需要通过 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
功能的感觉。
有没有办法用不那么激进的方法来实现这个目标?任何帮助将不胜感激。
当输入元素的值以编程方式更改时,MDL 不会动态地重新评估输入元素,而且我还没有找到要求它重新评估自身的好方法。
好消息是您不需要清除元素并再次调用 componentHandler.upgradeElement(),您只需要向元素添加或删除适当的 classes,这样样式更改正确。
在您的情况下,您只需将 'is-disabled' class 添加到已禁用的元素并将其从未禁用的元素中删除:
if (element.disabled) {
element.parentNode.classList.add("is-disabled");
} else {
element.parentNode.classList.remove("is-disabled");
}
还有其他 class,例如 'is-readonly'(用于只读字段)、'is-checked'(用于复选框)、'is-invalid'(用于无效输入)和少数其他人。
对于我使用此库的项目,我制作了一个 small helper function,它将扫描元素下的输入字段并重新评估 classes。动态加载数据后,我调用辅助函数,它负责修复表单的样式。
可能有更好的方法,但我还没有找到。
仅更改 类 只会更改其显示方式,不会禁用按钮。同样,仅设置 disabled 属性将禁用它,但不会改变它的外观。正确的方法是在 MaterialCheckbox
上使用内置的 disable
和 enable
方法。所以如果这是你的复选框
<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();
我需要通过 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
功能的感觉。
有没有办法用不那么激进的方法来实现这个目标?任何帮助将不胜感激。
当输入元素的值以编程方式更改时,MDL 不会动态地重新评估输入元素,而且我还没有找到要求它重新评估自身的好方法。
好消息是您不需要清除元素并再次调用 componentHandler.upgradeElement(),您只需要向元素添加或删除适当的 classes,这样样式更改正确。
在您的情况下,您只需将 'is-disabled' class 添加到已禁用的元素并将其从未禁用的元素中删除:
if (element.disabled) {
element.parentNode.classList.add("is-disabled");
} else {
element.parentNode.classList.remove("is-disabled");
}
还有其他 class,例如 'is-readonly'(用于只读字段)、'is-checked'(用于复选框)、'is-invalid'(用于无效输入)和少数其他人。
对于我使用此库的项目,我制作了一个 small helper function,它将扫描元素下的输入字段并重新评估 classes。动态加载数据后,我调用辅助函数,它负责修复表单的样式。
可能有更好的方法,但我还没有找到。
仅更改 类 只会更改其显示方式,不会禁用按钮。同样,仅设置 disabled 属性将禁用它,但不会改变它的外观。正确的方法是在 MaterialCheckbox
上使用内置的 disable
和 enable
方法。所以如果这是你的复选框
<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();