[英]Auto-selection of <option> based on input field, with some caveats
我有一個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,我可以更改選項值。
簡而言之:
這是我到目前為止擁有的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
然后只需對您的字符串運行正則表達式(無需對它進行子字符串化,因為^可確保此匹配項發生在字符串的開頭)並檢查是否存在成功的匹配項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.