很遗憾,这是解决此问题的错误方法。首先让我们看看您的方法会导致的问题:
-
keyElement.addEventListener("click", () => {
这将在每个按键点击事件上触发。您不希望这样,因为如果达到 maxLength,您仍然希望退格键起作用。
-
if(this.properties.value.length === element.maxLength){
仅当输入字段的值与 maxLength 属性的长度完全相同时才会触发。如果用户以某种方式绕过它,它将不再有任何效果。更好的解决方案是使用>= 而不是===。
-
this.properties.value = this.properties.value.substring(0, this.properties.value.length-1 );
这是你的实际问题。它将替换最后一个字符值。相反,您应该简单地return false;
现在让我们看看如何让它正常工作:
首先,您需要为您提供 maxLength 属性。为此,您需要更改以下内容。
properties: {
value: "",
capsLock: false, // Add a comma here
maxLength: 0 // Add this line
},
document.querySelectorAll(".use-keyboard-input").forEach(element => {
element.addEventListener("focus", () => {
this.open(element.value, element.maxLength, currentValue => { // Pass element.maxLength as a parameter
element.value = currentValue;
});
});
});
open(initialValue, maxlength, oninput, onclose) { // Add maxlength parameter
this.properties.value = initialValue || "";
this.properties.maxLength = maxlength; // Set the property value
this.eventHandlers.oninput = oninput;
this.eventHandlers.onclose = onclose;
this.elements.main.classList.remove("keyboard--hidden");
},
接下来,您需要检查每个按钮的事件处理程序并为其添加条件。我这里给你举个例子,其他的你自己做,都是一样的。
case "enter":
keyElement.classList.add("keyboard__key--wide");
keyElement.innerHTML = createIconHTML("keyboard_return");
keyElement.addEventListener("click", () => {
// Check if the length of the value is equal or bigger than maxLength
if(this.properties.value.length >= this.properties.maxLength){
// Return false so it doesn't do anything
return false;
}
this.properties.value += "\n";
this._triggerEvent("oninput");
});
break;
请确保不要将其添加到在达到 maxLength 时仍希望使用的键中。