2017-02-19 15 views
-1

は、私はOKだけの小さなコンテンツを操作するためのコードを持っている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> 

に含まれるドロップダウンリストを使用しています。すべての国をロードすると、&地域、&都市& countryStateCity.jsファイルに町があります。コンピュータのメモリが不足しています。

"countryStateCity.js"ファイルは膨大です。私がすべての国とすべての州をリストアップした場合、&地域と都市& "A"で始まる国の都市& "B"はすべて動作しますが、 "C"で始まる国の都市&の町を追加するとシステムが失敗します。

ソースファイルをこのような国ごとに1つに分割する必要があります。

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

ワールドファイル全体の中で名前を見つけるのではなく、Javascriptにcountry/Canada.jsのようなファイル名を検索させたいとします。

修正された「Javascript」コーディングを誰かに教えてもらえますか?

+0

私は、Ajaxを介してサーバからデータをロードします。 –

+1

StackOverlfowはフリーコード書き込みまたはデータ構造化サービスではありません – charlietfl

+1

開発者はスタックオーバーフローを信頼してコーディングの問題を解決し、スタックオーバーフロージョブを使用して雇用機会を見つけます。私たちはインターネットをより良い場所にすることを約束しています。私たちの製品は、開発者が成長し成熟するにつれて、開発者の生活を豊かにすることを目指しています。 – user225359

答えて

0

OK。これは簡単です。あなたの国のファイルにアクセスすることはできません。そのため、IEの配列やJSONのスコープや分割方法がわかりません。だから私のコードはちょうどあなたのマッシュであり、それは動作しません。しかし、これは、ユーザーエクスペリエンスのための迅速な最終結果で問題を解決する方法を示しています。

トリックは、必要なときに必要なデータを読み込むだけです。通常、これはAPIを使って行われ、あなたはajaxを介してそれを呼び出すことで、あなたが望むものを伝え、UIに表示できるように戻します。

このシナリオでは、サーバーがないため、スクリプトをDOMに動的に読み込むことで対応します。このケースでは、州および市町村で記入された国データ。要求されたときに国ごとに1つのファイル。

ステートごとに州のデータをロードする方が良いでしょう。だけでなく、データはドムから削除する必要がある場合には、潜在的に考えると、メモリが問題になる場合:

// 
 
// 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

ありがとうマーティン、私は問題を発見した。問題は国のファイルにありました。そこにいてはいけないいくつかの文字があり、システム全体を投げ捨てました。そして、彼らはそれらを見つけるのに多くの時間がかかりました。 – user225359

+0

私は答えに勝つのですか?私のソリューションは、ユーザーが選択したときにデータをすぐにロードする方法の問題に答えていますか?それは疑問でした。私の解決策は、その問題をすべて解決すると思います。私はデータを持っていないので、実際の解決策ではありません。 – MartinWebb