JavaScript表单验证:自定义错误消息

时间:2018-07-29 00:52:51

标签: javascript html

https://codepen.io/durja/pen/BPmmyR

我正在尝试使用html中的约束API为表单实现自定义错误消息。下面是我的代码,我面临一个问题,在输入错误的输入并再次对其进行更正后,验证消息仍会显示。我不确定我缺少什么。我什至尝试使用checkValidity()方法检查有效性,即使输入的格式正确,该方法也会返回false。

const fp = document.getElementById('quantity');
const ide = document.getElementById('ide_pref');

fp.addEventListener('input',e => {
    console.log(e.target.value);
   if(fp.validity.rangeOverflow) {
       fp.setCustomValidity('Custom message: greater than 100 not allowed.');
   }
});

ide.addEventListener('input',e => {
  console.log(e.target.value);
  console.log(ide.checkValidity());
  if(ide.validity.patternMismatch) {
    ide.setCustomValidity('enter exactly webstorm OR vscode');
  }
})

1 个答案:

答案 0 :(得分:2)

请参见HTMLSelectElement.setCustomValidity()

  

HTMLSelectElement.setCustomValidity()方法将选择元素的自定义有效性消息设置为指定的消息。使用空字符串表示该元素没有自定义有效性错误。

您目前永远不会重置自定义有效性消息,因此只要输入无效,它就会永远保留'Custom message: greater than 100 not allowed.'(或其他元素的其他消息)。插入else语句(如果没有rangeOverflow或没有patternMismatch),并使用空字符串来调用setCustomValidity以清除错误消息,以防错误消息出现。点击了:

const fp = document.getElementById('quantity');
const ide = document.getElementById('ide_pref');

fp.addEventListener('input', e => {
  if (fp.validity.rangeOverflow) {
    fp.setCustomValidity('Custom message: greater than 100 not allowed.');
  } else {
    fp.setCustomValidity('');
  }
});

ide.addEventListener('input', e => {
  if (ide.validity.patternMismatch) {
    ide.setCustomValidity('enter exactly webstorm OR vscode');
  } else {
    ide.setCustomValidity('');
  }
})
.u {
  margin-bottom: 15px;
}

.u:invalid {
  border: 2px solid orangered;
}

.u:valid {
  border: 2px solid greenyellow;
}

.btn {
  border: none;
  padding: 10px;
  border-radius: 8px;
  margin-top: 10px;
}

:focus {
  outline-color: gray;
}
<form action="#" method="get">
  <div>
    <label for="ide_pref">Would you prefer webstorm or vscode?</label>
    <input required class="u" type="text" pattern="webstorm|vscode" id="ide_pref" name="ide_pref"><br>
    <label for="quantity">How many licences would you like?</label>
    <input required class="u" type="number" min="1" max="100" id="quantity" name="lic_quantity"><br>
    <button class="btn" type="submit">Submit</button>
  </div>
</form>