アイデア: 各ドロップダウン メニューは、コンポーネントとして一連のデータを受け取り、さまざまなデータ コンテンツに基づいてさまざまなメニュー オプションを生成できます。 3 つのレベル間の相関関係は、イベントのスローによって実現されます。データはバックグラウンドから取得されます。
省メニューをクリックして陝西省を選択すると、メニュー コンポーネントはイベントスローを通じて現在の省をスローします。州を知ると、その州内の都市データをバックグラウンドから取得できます。等々。
実現効果:
## URL: http://10.9.72.245:4010
## メソッド: "GET"
## データ形式:
リクエスト: QueryString
応答: JSON
1. http://10.9.72.245:4010/getProvince
2. http://10.9.72.245:4010/getCity 3. http://10.9.72.245:4010/getCounty
インターフェース名を取得します: /getProvince
Request
: パラメータなし
応答: { "province":["Beijing","Tianjin","Hebei",...]}
インターフェイス名:/getCity
request:?province="Hebei"
応答: {"city ":["石家荘" , "唐山", "秦皇島",...]}
インターフェイス名: /getCounty
要求: ?city="石家荘"
応答: {"county":["長安区", "Qiaodong District", "Qiaoxi District",...]}
<!DOCTYPE html> <html> <頭> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width、initial-scale=1.0"> <title>ドキュメント</title> </head> <本文> <script type="モジュール"> './js/QueryString.js' から QueryString をインポートします。 './js/DropDownMemu.js' から DropDownMemu をインポートします。 cityInfo = {}; にします。 init(); 関数 init(){ ajax("http://10.9.72.245:4010","getProvince").then(successFunction).catch(failFunction); } // ajax通信が成功したら実行: 関数成功関数(_data){ let data = JSON.parse(_data); let key = Object.keys(data)[0]; データ = オブジェクト.値(データ)[0]; if(DropDownMemu.Obj[キー]){ DropDownMemu.Obj[キー].list = データ; DropDownMemu.Obj[key].name = データ[0]; }それ以外{ let memu = new DropDownMemu(key); memu.addEventListener("変更",changeHandler); memu.list = データ; memu.name =データ[0]; memu.appendTo("本体"); cityInfo[キー] = データ[0]; } } // メニューの表示内容が変更された場合、メニューによってスローされたイベントを受信し、イベントに含まれる情報 ({"province":"Shaanxi"} や {"city":"Xi'an"} など) を取得します。 関数changeHandler(e){ let key = e.currentTarget.label; cityInfo[キー] = e.data[キー]; let インターフェース名; if(e.data.province){ インターフェース名 = "getCity"; }else if(e.data.city){ インターフェース名 = "getCounty"; }それ以外{ 戻る } ajax( "http://10.9.72.245:4010"、interfaceName、cityinfo)。 } /* ajax通信: パラメータリスト: URL:バックグラウンドサービスアドレスインターフェイスタイプ:「GetProvince」などのインターフェイスタイプ データ:送信されたデータ、例:{"province": "shaanxi"} 通信タイプ type:デフォルト 「GET」 json形式でデータを送信するかリクエスト:デフォルトはfalse */ 関数ajax(url、interfaceType、data、type = "get"、json = false){ type = type.toUpperCase(); let o = type==="GET"? null : データ; if(data)data = json.stringify(data):querystring.stringify(data); それ以外の場合はデータ = ""; return new Promise(function(resolve,reject){ let xhr = 新しい XMLHttpRequest(); xhr.open(type、url + "/" + interfaceType +(type === "get"? "?" + data: "")); xhr.send(o); xhr.onreadystatechange = function(){ if(xhr.readyState===4 && xhr.status===200){ 解決(xhr.response); }else if(xhr.readyState===4){ 解決(xhr.status); } } xhr.onerror= 関数(){ 拒否(xhr.response); } }) } // ajax通信が失敗した場合、関数failfunction(_err){実行機能障害(_err)を実行します console.log(_err); } </script> </body> </html>
"./component.js"からのドロップダウンメムクラスインポートコンポーネント "; デフォルトのクラスDropDownMemuをエクスポートするコンポーネント{ _list; //現在のドロップダウンオプション。 _Name; //表示される名前:「Beijing」 ラベル。//現在のドロップダウンメニューのラベル scanLabel; // ラベルコンテナspanCaret; // ドロップダウンオプションコンテナ bool=false; // マウスイベント、フォーカス状態または選択を制御し、マウスのスライドインおよびスライドアウト効果をトリガーしません。 //さまざまな状態に従って、ドロップダウンメニューのスタイルを設定します。 静的ドロップダウン= symbol(); static default = symbol(); // 静的グローバル変数は、ドロップダウン メニューが作成されるたびにこのオブジェクトに保存され、作成された各ドロップダウン メニューはグローバルに管理されます。 静的obj = {}; コンストラクター(_label){ super( "p"); this.label = _label; // html構造を作成しますthis.render(); //スタイルを設定this.setStyle(); // マウスがスライドしてクリックし、フォーカスが外れ、クリック イベント this.elem.addEventListener("focusin", e =>this.mouseHandler(e)); this.elem.addEventListener("focusout", e =>this.mouseHandler(e)); this.elem.addeventlistener( "mouseenter"、e => this.mousehandler(e)); this.elem.addeventlistener( "mouseleave"、e => this.mousehandler(e)); this.elem.addeventlistener( "click"、e => this.mousehandler(e)); } マウスハンドラー(e){ switch(e.type){ ケース「Mouseenter」: if(this.bool)return this.elem.style.backgroundcolor = "#e6e6e6"; 壊す; ケース「マウスリーブ」: if(this.bool) 戻り値 this.elem.style.backgroundColor = "#fff"; 壊す; ケース「フォーカスイン」: this.setState(DropDownMemu.DROPDOWN); this.bool = true; 壊す; 「フォーカスアウト」の場合: this.setState(dropdownmemu.default); this.bool = false; ケース「クリック」: if(e.target.constructor !== HTMLLIElement) 戻り値 this._name = e.target.textcontent; //クリック時に現在表示されているコンテンツを変更し、スタイルをリセットし、イベントをスローして、現在のコンテンツを外部の世界に通知します。 this.setContent(); let evt = new FocusEvent("focusout"); this.elem.dispatchEvent(evt); } } set name(_name){ this._name = _name; this.setContent(); } get name(){ this._name; } set list(_list){ this._list = _list; this.ul.innerhtml = ""; this.ul.appendChild(this.createLi()); } //メニューの現在表示されているコンテンツを変更し、データsetcontent(_name)をスローする{ this._name = _name || this._name; this.spanlabel.textcontent = this._name; let evt = new MouseEvent( "Change"); if(!evt.data)evt.data = {} evt.data[this.label] = this._name; this.dispatchevent(evt); } //指定されたリストに基づいて、ドロップダウンメニューオプションを作成します。 createli(_list){ this._list = _list this._list; let elem = document.createDocumentFragment(); this._list.forEach((項目, インデックス) => { let li = document.createElement("li"); li.textcontent = item; Object.assign(li.style, { LineHeight: "26px"、 パディング:「0 15px」、 }) Elem.AppendChild(li); }) 要素を返します。 } setState(タイプ){ switch(type){ ケース DropDownMemu.DROPDOWN: this.elem.style.backgroundColor = "#e6e6e6"; this.ul.style.display = "block"; 壊す; ケースドロップダウンメムdefault: this.elem.style.backgroundcolor = "#fff"; this.ul.style.display = "none"; 壊す; } } appendto(親){ super.appendto(parent); dropdownmemu.obj [this.label] = this; } 与える() { this.elem.setattribute( "tabindex"、1); this.spanlabel = document.createelement( "span"); this.spancaret = document.createelement( "span"); this.ul = document.createelement( "ul"); this.elem.appendChild(this.ul); this.spanlabel.textcontent = this._name; this.elem.appendChild(this.spanLabel); this.elem.appendChild(this.spancaret); } setStyle(){ Object.Assign(this.elem.style、{ フロート: "左"、 minHeight: "20px", minWidth: "80px", 色:「#333」、 フォント級:「通常」、 TextAlign:「Center」、 Whitespace: "Nowrap"、 verticalAlign:「ミドル」、 カーソル: "ポインタ"、 国境:「1px solid #ccc」、 borderradius: "4px"、 BackgroundColor: "#fff"、 パディング:「6px 12px」、 fontsize: "14px"、 userselect:「none」、 マージンライト:「100px」、 ポジション:「相対」、 }); Object.Assign(this.spanlabel.style、{ フロート:「左」、 パディング:「0 5px」 }) Object.Assign(this.spancaret.style、{ ディスプレイ:「インラインブロック」、 verticalAlign:「ミドル」、 BorderTop:「4px Dashed」、 Borderright:「4px Solid透明」、 BorderLeft:「4px Solid透明」、 }) Object.Assign(this.ul.style、{ ListStyle:「なし」、 位置: "絶対"、 トップ:「100%」、 左: "0"、 Zindex:「1000」、 ミニ幅:「100px」、 パディング:「5px 0px」、 マージン: "2px 0 0"、 fontsize: "14px"、 TextAlign:「左」、 BackgroundColor: "#fff"、 境界線:「1pxソリッドRGBA(0、0、0、0.15)」、 borderradius: "4px"、 Boxshadow: "0 6px 12px rgba(0、0、0、0.175)"、 ディスプレイ:「なし」、 }) } }
デフォルトのクラスコンポーネントをエクスポートしますextenttarget { エレム; コンストラクター(_type){ 素晴らしい(); this.elem = this.createelem(_type); } createElem(_type){ lem = document.createelement(_type); 要素を返します。 } appendto(親){ if(typeof parent === "string")parent = document.queryselector(parent); parent.appendChild(this.Elem); } }
let http = require( "http"); querystring = require( "querystring"); データをしましょう、 要求、 res; //すべての都市データを読み取り、それらをオブジェクトに解析し、それらを同期して読み取ります。 fs = require( "fs"); let allcityinfo = json.parse(fs.readfilesync( './ city.json')); サーバー= http.createServer(リスナーハンドラー); server.listen(4010、 "10.9.72.245"、ristenerdonehandler); functionリスナーハンドラー(_req、_res){ req = _req; res = _res; res.writehead(200、{ 「コンテンツタイプ」:「テキスト/html; charset = utf-8」、 「アクセスコントロール - アロウオリジン」:「*」、 「Access-Control-Allow-Headers」:「*」 }); data = ""; req.on( "data"、function(_data){ data = _data; }) req.on( "end"、receivehandler); } 関数受信handler(){ // console.log(allcityinfo); //リクエストヘッダーのURLに従ってインターフェイスタイプを解析しますtype = req.url.trim()。split( "?")[0] .replace(/ // g、 ""); console.log(type); //リクエストヘッダーのURLに従って着信パラメーターを解析するif(req.method.touppercase()=== "get"){ if(req.url.includes( "favicon.ico"))return res.end(); else data = req.url.includes( "?")? } 試す{ data = json.parse(data); }キャッチ{ data = querystring.parse(data); } console.log(data); //インターフェイスタイプに基づいてデータを見つけます。 let list = {}; switch(type){ ケース「GetProvince」: list.province = object.keys(allcityinfo); 壊す; ケース「GetCity」: list.city = object.keys(allcityinfo [data.province]); 壊す; ケース「GetCounty」: list.county = allcityinfo [data.province] [data.city]; 壊す; } console.log(list); res.write(JSON.stringify(list)); res.end() } function ristenerdonehandler(){ console.log( "サービスが正常に開始された"); }
{{
「北京」:{
「北京」:[「Dongcheng地区」、「Xicheng地区」、「チョンウェン地区」、「Xuanwu地区」、「Chaoyang地区」、「Fengtai地区」、「Shijingshan地区」、「Haidian District」、「Mentougou District」 「Fangshan地区」、「Tonghou地区」、「Shunyi地区」、「チャンピング地区」、「ダックス地区」、「ピンググ地区」、「Huairou地区」、「Miyun郡」、「Yanqing郡」、「その他」}
} 、
「Tianjin」:{
「Tianjin」:[「Heping District」、「Hedong District」、「Hexi District」、「Nankai District」、「Hebei District」、「Hongjiao District」、「Binhai New District」、「Dongli District」、「Xiqing District」地区」、「ジナン地区」、「ベイチェン地区」、「ニンゲ地区」、「ウーチン地区」、「ジンハイ郡」、「バオディ地区」、「ジクシアン」、「タンググ地区」、「ハン地区」、「ダガン地区」 "、" baodi地区 "、"その他 "]
}、
}
上記は、JSを使用した3レベルのリンクメニューの詳細な説明です(アイデアの説明付き)。詳細については、PHPの他の関連記事に注意してください中国のウェブサイト!