javascript - 如何根据条件使表单字段具有不同的验证模式?
问题描述
我正在处理用户首先在单选按钮上选择“美国”或“国际”的表单。根据选择的国家/地区,电话输入字段应要求 10 位数的美国号码或具有不同模式的国际电话号码。
我正在使用具有所需属性和正则表达式模式的本机 HTML 验证。目前我有一个美国号码的占位符、模式和标题属性。
<form>
<div>
<fieldset>
<legend>Country</legend>
<p>
<input type="radio" name="country" id="usa" value="usa" required />
<label for="usa">USA</label>
</p>
<p>
<input type="radio" name="country" id="int" value="int" required />
<label for="int">International</label>
</p>
</fieldset>
</div>
<div>
<label for="telephone">Telephone</label>
<input
type="tel"
name="tel"
id="tel"
placeholder="123 456 7890"
required
pattern="(?:\d{1}\s)?\(?(\d{3})\)?-?\s?(\d{3})-?\s?(\d{4})"
title="A valid US 10 digit phone number is required."
/>
</div>
<button id="submit" type="submit">Submit</button>
</form>
如何实现国际号码的占位符、模式和标题?
我可以在每个 HTML 中有两个 div,并根据单选按钮的选择用 JS 显示它们。或者,我可以保留 HTML 并插入 HTML 或使用 JS 进行国际选择的属性值(如果已选择)。但我想知道如果 JS 被禁用或不可用,是否有更好的方法可以工作或至少可以接受。
解决方案
既然您已经这样做了,您可以将点击处理程序附加到您的单选按钮,以便它以必要的方式修改您的输入字段属性
<form>
<div>
<fieldset>
<legend>Country</legend>
<p>
<input type="radio" name="country" id="usa" value="usa" required />
<label for="usa">USA</label>
</p>
<p>
<input type="radio" name="country" id="int" value="int" required />
<label for="int">International</label>
</p>
</fieldset>
</div>
<div>
<label for="telephone">Telephone</label>
<input type="tel" name="tel" id="tel" disabled/>
</div>
<button id="submit" type="submit" disabled>Submit</button>
<script>
const phoneInput = document.querySelector('#tel');
const submitButton = document.querySelector('#submit');
[...document.querySelectorAll('input[name="country"]')].forEach(radio => {
radio.addEventListener('click', function(){
phoneInput.disabled = false;
submitButton.disabled = false;
if(this.value == 'usa') {
phoneInput.setAttribute('placeholder', '123 456 7890');
phoneInput.setAttribute('pattern', 'xyz');
phoneInput.setAttribute('title', 'A valid US 10 digit phone number is required.');
}
else if(this.value == 'int'){
phoneInput.setAttribute('placeholder', '+1234567890');
phoneInput.setAttribute('pattern', 'abc');
phoneInput.setAttribute('title', 'International phone number format is required.');
}
});
});
</script>
</form>
推荐阅读
- git - 如何在不检查的情况下将另一个分支重置为原点?
- ios - 如何在我的自定义键盘扩展中获取当前和正确的宽度
- node.js - 异步 .mjs 直接调用时有效,从另一个 .mjs 调用时失败
- python - 如何在 google colab 中管理 gpu RAM?
- python - Python Django AttributeError 'str' 对象没有属性 'user_name'
- flask - Flask-CKEditor - 错误代码:编辑器元素冲突
- r - 将两条 rle 行应用到数据集中时发生“无效的 'rle' 结构”
- ios - 我应该如何确定 UIKit 将打开哪个场景,以便我可以在正确的窗口中设置我的 UI?(iOS 13+)
- .net - dotNetRDF 无法加载 System.EnterpriseServices
- javascript - 如何在 next.config.js 文件中组合几个插件?