javascript 常用方法 解析URL,补充前导字符, 省市联动, 循环替换模板
2018-11-7 20:41:20 星期三
1. 解析URL
1 function parseUrl(url) 2 { 3 url = decodeURIComponent(url); 4 var u = url.split('?'); 5 6 var args = {}; 7 args['uri'] = u[0]; 8 9 if (u.length === 2) { 10 var items = u[1].split("&"); 11 var item = null, name = null, value = null; 12 for(var i=0; i < items.length; i++){ 13 item = items[i].split("="); 14 if(item[0]){ 15 name = item[0]; 16 value = item[1] ? item[1] : ""; 17 args[name] = value; 18 } 19 } 20 } 21 22 return args; 23 }
2019-4-25 10:44:30 星期四
2. 补充前导字符
1 //给字符串str补上多个前导字符pad, 最终使str总长为length 2 function strPad(str, pad, length) 3 { 4 var padn = length - str.length; 5 var pads = ''; 6 7 for (i =0; i < padn ; i++) { 8 pads += pad; 9 } 10 11 return pads + str; 12 }
2019-5-13 14:25:53 星期一
3. 构建URL
1 function buildUrl(prefix, obj) 2 { 3 let param = parseUrl(prefix); 4 delete param.uri; 5 6 for (let i in obj) { 7 param[i] = obj[i]; //去掉重复的键, 用obj中的覆盖prefix中的 8 } 9 10 let arr = []; 11 for (let j in param) { 12 arr.push(j + '=' + param[j]); 13 } 14 15 let str = arr.join('&'); 16 17 if (prefix.indexOf('?') !== -1) { 18 let u =prefix.split('?'); 19 return u[0] + '?' + str; 20 } else { 21 return prefix + '?' + str; 22 } 23 }
2019-5-21 19:35:24 星期二
4. 国省市县联动
1 var countryLength = 3; //国家编号的长度 2 var provinceLength = 2; //省编号的长度 3 var cityLength = 2; //城市编号的长度 4 var areaLength = 2; //县区编号的长度 5 var _countryList = ''; //国家: {001000000:"中国", ...} 6 var _provinceList = ''; //省/州: {001010000:"河南省", ...} 7 var _cityList = ''; //城市: {001010100:"南阳市", ...} 8 var _areaList = ''; //县区: {001010101:"赊店", ...} 9 10 var _blankOption = '<option label="" value=""></option>'; 11 var _tplOption = '<option label="{label}" value="{value}">{text}</option>'; 12 13 $.ajax({ 14 type :"get", 15 url :'getCountryProvinceCity', 16 dataType: 'json', 17 async :false, 18 success :function(data){ 19 _countryList = data.country_list; 20 _provinceList = data.province_list; 21 _cityList = data.city_list; 22 _areaList = data.area_list; 23 } 24 }); 25 26 clearProvince('country', 'province', 'city', 'area'); //清除掉下拉列表中不关联的省市县 27 28 //cpc: country province city 29 //国家变动事件 30 function cpcChangeCountry(countryId, provinceId) { 31 var country = $("#"+countryId).val(); //新选择的国家 32 var provinceDom = $("#"+provinceId); 33 34 var provinceHtml = _blankOption; 35 var tmp=''; 36 for (code in _provinceList) { 37 var prefix1 = strPad(country, '0', countryLength); 38 var prefix2 = code.substring(0, countryLength); 39 40 if (prefix1 === prefix2) { 41 tmp = _tplOption; 42 tmp = tmp.replace('{label}', _provinceList[code]); 43 tmp = tmp.replace('{value}', code); 44 tmp = tmp.replace('{text}', _provinceList[code]); 45 provinceHtml += tmp; 46 } 47 } 48 49 provinceDom.html(provinceHtml); 50 } 51 52 //省份变动事件 53 function cpcChangeProvince(provinceId, cityId) { 54 var province = $("#"+provinceId).val(); //新选择的省份 55 var cityDom = $("#"+cityId); 56 57 var len = countryLength+provinceLength; 58 var provincePrefix = province.substring(0, len); 59 60 var cityHtml = _blankOption; 61 var tmp = ''; 62 for (code in _cityList) { 63 var cityPrefix = code.substring(0, len); 64 if (provincePrefix === cityPrefix) { 65 tmp = _tplOption; 66 tmp = tmp.replace('{label}', _cityList[code]); 67 tmp = tmp.replace('{value}', code); 68 tmp = tmp.replace('{text}', _cityList[code]); 69 cityHtml += tmp; 70 } 71 } 72 73 cityDom.html(cityHtml); 74 } 75 76 //城市变动事件 77 function cpcChangeCity(cityId, areaId) { 78 79 var city = $("#"+cityId).val(); //选择的城市 80 var areaDom = $("#"+areaId); 81 82 var len = countryLength+provinceLength+cityLength; 83 var cityPrefix = city.substring(0, len); 84 85 var areaHtml = _blankOption; //默认值 86 var tmp = ''; 87 for (code in _areaList) { 88 var areaPrefix = code.substring(0, len); 89 if (cityPrefix === areaPrefix) { 90 tmp = _tplOption; 91 tmp = tmp.replace('{label}', _areaList[code]); 92 tmp = tmp.replace('{value}', code); 93 tmp = tmp.replace('{text}', _areaList[code]); 94 areaHtml += tmp; 95 } 96 } 97 98 areaDom.html(areaHtml); 99 } 100 101 //给字符串str补上前导字符pad, 最终使str总长为length 102 function strPad(str, pad, length) 103 { 104 var padn = length - str.length; 105 var pads = ''; 106 107 for (i =0; i < padn ; i++) { 108 pads += pad; 109 } 110 111 return pads + str; 112 } 113 114 //刚进入编辑页面时, 去掉省份,城市中与当前国家无关的选项 115 function clearProvince(countryId, provinceId, cityId, areaId) { 116 var country = $("#"+countryId).val(); //当前选择的国家 117 var provinceDom = $("#"+provinceId); 118 var cityDom = $("#"+cityId); 119 var areaDom = $("#"+areaId); 120 var province = provinceDom.val(); 121 var city = cityDom.val(); 122 123 124 if (country) { 125 //删除省份中不属于国家的 126 for (code in _provinceList) { 127 let prefix1 = strPad(country, '0', countryLength); 128 let prefix2 = code.substring(0, countryLength); 129 130 if (code.length> 0 && prefix1 !== prefix2) { 131 provinceDom.find("option[value='"+code+"']").remove(); 132 } 133 } 134 135 //删除城市中不属于省份的 136 for (code in _cityList) { 137 let prefix1 = province.substring(0, countryLength+provinceLength); 138 let prefix2 = code.substring(0, countryLength+provinceLength); 139 140 if (code.length> 0 && prefix1 !== prefix2) { 141 cityDom.find("option[value='"+code+"']").remove(); 142 } 143 } 144 145 //删除区县中不属于城市的 146 for (code in _areaList) { 147 let prefix1 = city.substring(0, countryLength+provinceLength+cityLength); 148 let prefix2 = code.substring(0, countryLength+provinceLength+cityLength); 149 150 if (code.length> 0 && prefix1 !== prefix2) { 151 areaDom.find("option[value='"+code+"']").remove(); 152 } 153 } 154 } 155 }
2019-6-5 9:26:52 星期三
5. 循环生成模板
1 function repeatHTML (tplDom, arr, func=null) { 2 if (tplDom.length === 0) { 3 console.log('repeatHTML:: tplDom empty'); 4 return ''; 5 } 6 7 if (!(arr instanceof Array) || arr.length === 0) { 8 console.log('repeatHTML:: arr empty'); 9 return ''; 10 } 11 12 let tpl = tplDom; 13 let out = ''; 14 for (let i=0; i<arr.length; i++) { 15 arr[i]['_idx'] = i+1; 16 if (typeof func === 'function') { 17 arr[i] = func(arr[i]); 18 } 19 let map = arr[i]; 20 let tmp = tpl; 21 for (let j in map) { 22 let re = new RegExp('{' + j + '}', 'g'); 23 tmp = tmp.replace(re, map[j]); 24 } 25 26 out += tmp; 27 } 28 return out; 29 } 30 31 function repeatInnerHTML (selector, arr, func=null) { 32 let tplDom = document.querySelector(selector); 33 if (!tplDom) { 34 error('未找到: '+selector); 35 return; 36 } 37 38 tplDom.innerHTML = repeatHTML(tplDom.innerHTML, arr, func); 39 }
6. 选中select标签中的option
id: select标签的id, values: array, option的value属性数值
1 function changeSelectedOption(domId, value) { 2 let select = document.getElementById(domId); 3 if (value === '') { 4 for (let i=0; i<select.options.length; i++) { 5 select.options[i].selected = false; 6 } 7 } else { 8 for (let i=0; i<select.options.length; i++) { 9 select.options[i].selected = (select.options[i].value === value); 10 } 11 } 12 } 13 14 function markSelected(id, values) { 15 let arr = document.getElementById(id).getElementsByTagName('option'); 16 17 for (let i=0; i<arr.length; i++) { 18 let val = arr[i].getAttribute('value'); 19 if (values.indexOf(val) > -1) { 20 arr[i].setAttribute('selected', 'selected'); 21 } else { 22 arr[i].removeAttribute('selected'); 23 } 24 } 25 }
7. 动态生成 select 标签
1 // name:select标签的名字和id, 2 // dataList: 数组, 渲染option [{name:xx, value:yy}] 3 // defaultValue, 数组, 默认选中的值 4 // isMulity, 是否可多选 5 function buildHtmlSelect(name, dataList, defaultValue=[],isMulity=false) { 6 let tpl = '<option value="{value}" {select}>{name}</option>'; 7 let func = function(obj) { 8 obj['select'] = (defaultValue.indexOf(obj['value']) !== -1) ? 'selected' : ''; 9 return obj; 10 } 11 12 let options = repeatHTML(tpl, dataList, func); 13 14 if (isMulity) { 15 return '<select multiple="true" id="'+name+'" name="'+name+'[]"> '+options+' </select>'; 16 } else { 17 return '<select id="'+name+'" name="'+name+'"> '+options+' </select>'; 18 } 19 }