根据输入字段自动选择 <option>,但有一些注意事项
-
21-08-2019 - |
题
我有一个 SELECT 元素,需要根据在文本字段中输入的邮政编码的前半部分自动选择适当的选项。英国邮政编码的形式为 AB12 3CD, ,其中第一部分由代表县的 1-2 个字母和代表县内区域的数字组成。最后 3 个字符与此问题无关。
对于大多数字段,它仅基于第一个字母,但对于某些选项,它是邮政编码范围。HTML 应该能最好地解释它:
<select id="country_field">
<option value="">Select</option>
<option value="AB">AB (Aberdeen)</option>
<option value="AL">AL (St. Albans)</option>
<option value="B">B (Birmingham)</option>
<option value="BA">BA (Bath)</option>
...
<option value="DD1">DD 1-7 (Dundee)</option>
<option value="DD8">DD 8-11 (Dundee)</option>
...
</select>
当值恰好是两个字母时,下面的代码当前将选择正确的元素。但我需要将其扩展以包含单字母代码(伯明翰)和邮政编码范围(邓迪)。笔记:如果有一个解决方案保证特殊值,例如,我可以更改选项值DD1/DD2 而不是 DD1/DD8。
简而言之:
- B2 --> 伯明翰
- BA3 --> 巴斯
- DD5 --> 第一邓迪 [DD1]
- DD11 --> 第二邓迪 [DD8]
这是我到目前为止所拥有的 Javascript...
window.onload = function()
{
// postcode INPUT field
var zipInput = document.getElementById( 'zip_field' );
// county SELECT field
var ctySelect = document.getElementById( 'county_field' );
zipInput.onchange = function()
{
var zipValue = zipInput.value;
var ctyOptions = ctySelect.options;
for ( i = 0; i < ctyOptions.length; i++ )
{
if ( zipValue.substring(0,2) == ctyOptions[i].value )
ctyOptions[i].selected = true;
}
}
}
解决方案
您可以使用正则表达式来提取值...
/^([a-z]{1,2})(\d*)\s/i
然后,对于像 DD 这样的范围的代码,也许是这样的(伪代码)......
if(match[1].value == "DD") { // needs special processing
range = match[2].value;
range = range < 8 ? 1 : 8; // if the number is less than 8, set it to 1, otherwise set it to 8
listValue = match[1].value + range
} else // just use the letters to select the list item
listValue = match[1].value;
因此对于 DD5
, ,这将返回 DD1
并为 DD11
它会返回 DD8
. 。就像是 B2
或者 BA3
只会返回 B
和 BA
, , 分别。
你可以改变 if
到一个 switch
如果您有多个具有不同范围的其他代码。然后,只需将具有该值的列表项设置为当前选择即可。
其他提示
代替:
zipInput.onchange = function()
{
var zipValue = zipInput.value;
var ctyOptions = ctySelect.options;
for ( i = 0; i < ctyOptions.length; i++ )
{
if ( zipValue.substring(0,2) == ctyOptions[i].value )
ctyOptions[i].selected = true;
}
}
和:
zipInput.onchange = function()
{
var zipValue = zipInput.value.match(/^[a-z]+/gi);
var ctyOptions = ctySelect.options;
for ( i = 0; i < ctyOptions.length; i++ )
{
if (zipValue[0] === ctyOptions[i].value )
ctyOptions[i].selected = true;
}
}
- 首先,我们从循环中删除了变量分配操作。为什么废物循环重复相同的操作?
- 第二,我们现在过滤掉除输入开头的字母之外的所有内容。
- 这又可以扩展到包括数字后缀等。
您可以将 zipValue 的开头与选项值进行比较。不需要正则表达式。只需使用indexOf。
zipInput.onchange = function()
{
var zipValue = zipInput.value.toUpperCase();
var ctyOptions = ctySelect.options;
for ( i = 0; i < ctyOptions.length; i++ )
{
if ( zipValue.indexOf(ctyOptions[i].value) == 0 )
ctyOptions[i].selected = true;
}
}
我不确定这在 javascript 中如何工作,但我会做类似以下的事情:
- 将您的值设置为正则表达式以匹配您要查找的内容
那么,“B”就变成了“^B[0-9]”(我假设它后面必须跟一个数字)
BA 变为“^BA[0-9]”
DD1 变为“^DD([1-7] )”
DD8 变为“^DD([8-9] |[1][01] )”以匹配 DD8、DD9、DD10、DD11
然后只需针对您的字符串运行正则表达式(无需对其进行子字符串化,因为 ^ 确保此匹配发生在字符串的开头)并检查是否存在成功的匹配。