2017-02-19 254 views
-1

我使用包含在下拉列表中http://www.javascriptsource.com/forms/country-state-city-drop-down-list.html國家,州,市的Javascript下拉列表

// State lists 
var states = new Array(); 
states['Canada'] = new Array('Alberta', 'British Columbia', 'Ontario'); 
states['Mexico'] = new Array('Baja California', 'Chihuahua', 'Jalisco'); 
states['United States'] = new Array('California', 'Florida', 'New York'); 
// City lists 
var cities = new Array(); 
cities['Canada'] = new Array(); 
cities['Canada']['Alberta'] = new Array('Edmonton', 'Calgary'); 
cities['Canada']['British Columbia'] = new Array('Victoria', 'Vancouver'); 
cities['Canada']['Ontario'] = new Array('Toronto', 'Hamilton'); 
cities['Mexico'] = new Array(); 
cities['Mexico']['Baja California'] = new Array('Tijauna', 'Mexicali'); 
cities['Mexico']['Chihuahua'] = new Array('Ciudad Juárez', 'Chihuahua'); 
cities['Mexico']['Jalisco'] = new Array('Guadalajara', 'Chapala'); 
cities['United States'] = new Array(); 
cities['United States']['California'] = new Array('Los Angeles', 'San Francisco'); 
cities['United States']['Florida'] = new Array('Miami', 'Orlando'); 
cities['United States']['New York'] = new Array('Buffalo', 'new York'); 

function setStates() { 
    cntrySel = document.getElementById('country'); 
    stateList = states[cntrySel.value]; 
    changeSelect('state', stateList, stateList); 
    setCities(); 
} 

function setCities() { 
    cntrySel = document.getElementById('country'); 
    stateSel = document.getElementById('state'); 
    cityList = cities[cntrySel.value][stateSel.value]; 
    changeSelect('city', cityList, cityList); 
} 

function changeSelect(fieldID, newOptions, newValues) { 
    selectField = document.getElementById(fieldID); 
    selectField.options.length = 0; 
    for (i = 0; i < newOptions.length; i++) { 
     selectField.options[selectField.length] = newOption(newOptions[i], newValues[i]); 
    } 
} 

function addLoadEvent(func) { 
    var oldonload = window.onload; 
    if (typeof window.onload != 'function') { 
     window.onload = func; 
    } else { 
     window.onload = function() { 
      if (oldonload) { 
       oldonload(); 
      } 
      func(); 
     } 
    } 
} 
addLoadEvent(function() { 
    setStates(); 
}); 
Head < script type = "text/javascript" 
src = "countryStateCity.js" > <</script > Body < fieldset style = "width: 230px;" > <legend><strong>Make your selection</strong></legend> <p> <form name="test" method="POST" action="processingpage.php"> 
<table> 
<tr> 
<td style="text-align: left;">Country:</td> 
<td style="text-align: left;"> 
<select name="country" id="country" onchange="setStates();"> 
<option value="Canada">Canada</option> 
<option value="Mexico">Mexico</option> 
<option value="United States">United States</option> 
</select> 
</td> 
</tr><tr> 
<td style="text-align: left;">State:</td> 
<td style="text-align: left;"> 
<select name="state" id="state" onchange="setCities();"> 
<option value="">Please select a Country</option> 
</select> 
</td> 
</tr><tr> 
<td style="text-align: left;">City:</td> 
<td style="text-align: left;"> 
<select name="city" id="city"> 
<option value="">Please select a Country</option> 
</select> 
</td> 
</tr> 
</table> 
</form> < /fieldset> 

我已經得到了代碼工作正常,但只有小的內容。當我加載所有國家時,州&地區,&城市&城鎮into countryStateCity.js文件我的電腦用完內存。

「countryStateCity.js」文件很大。如果我列出所有國家和所有州&地區和城市&以「A」&「B」開頭的國家的城鎮一切正常,但如果我添加城市&以「C」開頭的城鎮系統失敗。

我需要將源文件分解爲每個與此相似的國家/地區1;

src="country/Canada.js" 
src="country/Mexico.js" 
src="country/United States.js" 

我想Javascript功能來查找文件名稱,如國家/ Canada.js,而不是發現整個世界文件中的名稱。

有人可以爲我提供修正的「Javascript」編碼嗎?

+0

我就從服務器通過AJAX加載數據。 –

+1

StackOverlfow不是免費的編寫代碼或數據結構服務 – charlietfl

+1

開發人員信任堆棧溢出來幫助解決編碼問題並使用堆棧溢出作業找到工作機會。我們致力於讓互聯網變得更加美好,我們的產品旨在豐富開發人員的職業生涯並使其成​​長。 – user225359

回答

0

好的。這很容易做到。我無法訪問您的國家/地區文件,因此我不知道它是如何被限制或打破的,IE數組或JSON。所以我的代碼只是你的一個混搭,它不會工作。但它顯示瞭如何以用戶體驗的快速最終結果解決您的問題。

訣竅就是加載需要的時候需要的數據。通常這是通過一個API來完成的,你可以通過ajax來調用它,告訴它你想要什麼,然後將它發送回來,這樣你的UI就可以顯示出來。

在這種情況下,我們沒有服務器,所以我們將通過動態地將腳本加載到dom中來實現。在這種情況下,國家數據充滿了州和城市的數據。每個國家需要時提供一個文件。

最好是加載狀態數據,然後加載每個州的城市等等。除了潛在的考慮,如果數據應從DOM中刪除,如果記憶是一個問題:

// 
 
// Some globals to store what the user selects. 
 
// 
 
VAR _COUNTY, _STATE, _CITY; 
 

 
// 
 
// This will append scripts to the body so that you dont need to load all the 
 
// scripts in one go, this is the trick. 
 
// 
 
function addScript(src,callback) { 
 
    var s = document.createElement('script'); 
 
    s.setAttribute('src', src); 
 
    s.onload=callback; 
 
    document.body.appendChild(s); 
 
} 
 
// 
 
// Get all the states based on country 
 
// add the correct file to the dom 
 
// ie: country/Canada.js 
 
// these files would be better scoped geodata.country geodata.state. 
 
// 
 
// IMPORTANT CHANGE YOUR HTML SELECT HANDLER TO FIRE HERE. 
 
// <select name="country" id="country" onchange="getStates();"> 
 
// 
 
function getStates(){ 
 
\t _COUNRTY = document.getElementById('country'), 
 
\t file = ["country/",_COUNTRY,".js"].join; 
 
\t addScript(file, setStates); \t 
 
}; 
 
// 
 
// 
 
// Called when the script loads 
 
// 
 
function setStates() { 
 
// 
 
// Here is where we would do 
 
// geodata.states for now I'm using your declaration of state. 
 
// 
 
var stateList = states; 
 
changeSelect('state', stateList, stateList); 
 
// Not sure why you are doing this they need to select a state first? 
 
setCities(); 
 
} 
 
// 
 
// Called when they select a state, 
 
// I would replicate the state code and load all the cities per state. 
 
// I would disable the city drop down until the states are loaded. 
 
// 
 
function setCities() { 
 
_STATE = document.getElementById('state'); 
 
cityList = cities[_COUNTRY][_STATE]; 
 
changeSelect('city', cityList, cityList); 
 
} 
 

 
function changeSelect(fieldID, newOptions, newValues) { 
 
selectField = document.getElementById(fieldID); 
 
selectField.options.length = 0; 
 
for (i=0; i<newOptions.length; i++) { 
 
selectField.options[selectField.length]=newOption(newOptions[i],newValues[i]); 
 
} 
 
} 
 

 
function addLoadEvent(func) { 
 
var oldonload = window.onload; 
 
if (typeof window.onload != 'function') { 
 
window.onload = func; 
 
} else { 
 
window.onload = function() { 
 
if (oldonload) { 
 
oldonload(); 
 
} 
 
func(); 
 
} 
 
} 
 
} 
 

 
addLoadEvent(function() { 
 
setStates(); 
 
}); 
 

 

+0

在這個問題中提供的代碼沒有詳細解決問題。我的回答是代碼的破解,以顯示如何使用動態腳本加載可以解決問題。但是我的答案留下了很多問題,因爲我們無法訪問數據文件,也無法訪問數據文件,也無法查看其範圍和組成。需要編寫大量代碼才能使其成爲可靠的解決方案。正如其他人所說,這不是一個免費的代碼寫作服務。 – MartinWebb

+0

謝謝Martin,我發現了這個問題。問題出在國家檔案中。那裏有一些角色不應該在那裏,它會拋出整個系統。他們花了很多時間找到它們。 – user225359

+0

我贏了答案嗎?我的解決方案回答瞭如何在用戶選擇時即時加載數據的問題?這是個問題,我認爲我的解決方案解決了這個問題,因爲我沒有這些數據,所以這不是一個可行的解決方案。 – MartinWebb