City.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. Namespace.register("U.MD.UI.city");
  2. /**
  3. * [Control description] 城市控件接口
  4. * @param {[html元素]} element [需要使用城市控件的元素(默认放置到element下面)]
  5. */
  6. U.MD.UI.city = function (element) {
  7. U.UF.EV.stopBubble(); //阻止事件冒泡 防止被body的事件覆盖
  8. if (!element || !element.tagName) { //如果element存在tagName 则一定是html元素 否则不执行城市控件
  9. return;
  10. }
  11. if (_cityBox = U.selectEl("#U_MD_UI_city_cityBox")[0]) {
  12. var _rect = element.getBoundingClientRect();
  13. _cityBox.style.top = _rect.top + _rect.height + document.documentElement.scrollTop + "px";
  14. //调整控件的top位置
  15. _cityBox.style.left = _rect.left + document.documentElement.scrollLeft + "px";
  16. //调整控件的left位置
  17. U.selectEl(_cityBox).removeClass("U_MD_UI_city_hidden");
  18. //删除掉hidden的class名(显示城市控件) 目的: 去除掉display为none的样式
  19. U.MD.UI.city.Attr.inputNode = element; //获取最终结果的表单元素 可能会不同 因此 inputNode需要重新赋值
  20. return;
  21. }
  22. var _city = U.MD.UI.city; //简写命名空间
  23. _city.create(element); //将控件html代码添加到body上 并调整控件位置
  24. _city.Attr = { //存放节点 与 变量 的json对象
  25. "inputNode": element //判断是哪个表单点击的 为赋值所用
  26. };
  27. _city.init(); //函数初始化(添加js功能)
  28. };
  29. U.MD.UI.city.Attr = {}; //存放元素与变量的json全局变量 未赋值
  30. U.MD.UI.city.usedCity = null; //存放常用市数据的变量
  31. U.MD.UI.city.province = null; //存放省数据的变量
  32. U.MD.UI.city.city = {}; //存放市数据的变量
  33. U.MD.UI.city.area = {}; //存放区数据的变量
  34. U.MD.UI.city.htmlTemplate = ' <ul class="U_MD_UI_city_menuBox"> <!--控件的头部-->\n' +
  35. '\n' +
  36. ' <!--U_MD_UI_city_menuChecked 选中菜单的按钮时所用的"className":红色-->\n' +
  37. ' <!--U_MD_UI_city_filled 表示待填写class 为增删class占位置 防出错 以下都是-->\n' +
  38. ' <!--U_MD_UI_city_menuoChecked 选择城市后所添加的class 红色小圆点-->\n' +
  39. ' <li id="U_MD_UI_city_usedCityMenu" data-city-mark="U_MD_UI_city_usedCityCont" class="U_MD_UI_city_menuChecked" data-city-res="">\n' +
  40. ' <span>常用市</span>\n' +
  41. ' </li>\n' +
  42. '\n' +
  43. ' <li id="U_MD_UI_city_provinceMenu" data-city-mark="U_MD_UI_city_provinceCont" class="U_MD_UI_city_filled" data-city-res="">\n' +
  44. ' <span>省/直辖市</span>\n' +
  45. ' </li>\n' +
  46. '\n' +
  47. ' <li id="U_MD_UI_city_cityMenu" data-city-mark="U_MD_UI_city_cityCont" class="U_MD_UI_city_filled U_MD_UI_city_hidden" data-city-res="">\n' +
  48. ' <span>请选择</span>\n' +
  49. ' </li>\n' +
  50. '\n' +
  51. ' <li id="U_MD_UI_city_areaMenu" data-city-mark="U_MD_UI_city_areaCont" class="U_MD_UI_city_filled U_MD_UI_city_hidden" data-city-res="">\n' +
  52. ' <span>请选择</span>\n' +
  53. ' </li>\n' +
  54. ' </ul>\n' +
  55. '\n' +
  56. '\n' +
  57. ' <!--以下为主要内容区域-->\n' +
  58. ' <!-- ----------------------------------------------------------------------------- -->\n' +
  59. ' <ul id="U_MD_UI_city_usedCityCont" class="U_MD_UI_city_filled U_MD_UI_city_Cont"> <!-- &lt;!&ndash;常用城市盒子节点&ndash;&gt; -->\n' +
  60. ' <li id="U_MD_UI_city_liTemplate"><span>光明新区</span></li>\n' +
  61. ' <!-- U_MD_UI_city_liTemplate 为内容区域的li的模板 可无视 已display为none -->\n' +
  62. ' <!--U_MD_UI_city_Cont_ochecked 选中城市的按钮时所用的"className":红色-->\n' +
  63. ' </ul>\n' +
  64. '\n' +
  65. '\n' +
  66. ' <ul class="U_MD_UI_city_filled U_MD_UI_city_Cont U_MD_UI_city_hidden" id="U_MD_UI_city_provinceCont"> <!-- &lt;!&ndash;存放省的盒子节点&ndash;&gt; -->\n' +
  67. ' </ul>\n' +
  68. '\n' +
  69. '\n' +
  70. ' <ul class="U_MD_UI_city_filled U_MD_UI_city_Cont U_MD_UI_city_hidden" id="U_MD_UI_city_cityCont"> <!-- &lt;!&ndash;存放市的盒子节点&ndash;&gt; -->\n' +
  71. ' </ul>\n' +
  72. '\n' +
  73. '\n' +
  74. ' <ul class="U_MD_UI_city_filled U_MD_UI_city_Cont U_MD_UI_city_hidden" id="U_MD_UI_city_areaCont"> <!-- &lt;!&ndash;存放地区的盒子节点&ndash;&gt; -->\n' +
  75. ' </ul>';
  76. //html代码
  77. /**
  78. * 添加html代码,并且判断html代码是否存在 若存在 则不添加
  79. * @param {[html元素]} element [需要使用城市控件的元素(默认放置到element下面)]
  80. */
  81. U.MD.UI.city.create = function (element) {
  82. var _cityBox = $$("div", { id: 'U_MD_UI_city_cityBox', className: 'U_MD_UI_city_cityBox U_MD_UI_city_hidden' }, document.body);
  83. _cityBox.innerHTML += U.MD.UI.city.htmlTemplate;
  84. var _rect = element.getBoundingClientRect();
  85. _cityBox.style.top = _rect.top + _rect.height + document.documentElement.scrollTop + "px";
  86. //调整控件的top位置
  87. _cityBox.style.left = _rect.left + document.documentElement.scrollLeft + "px";
  88. //调整控件的left位置
  89. U.MD.UI.city.Attr.inputNode = element;
  90. //获取最终结果的表单元素 可能会不同 因此 inputNode需要重新赋值
  91. U.selectEl(_cityBox).removeClass("U_MD_UI_city_hidden");
  92. //删除掉hidden的class名(显示城市控件) 目的: 去除掉display为none的样式
  93. };
  94. /**
  95. * 函数初始化
  96. */
  97. U.MD.UI.city.init = function () {
  98. var _city = U.MD.UI.city; //简写命名空间
  99. _city.getUsedCity(); //获取常用市所有数据
  100. _city.inputEvent(); //添加监听事件: 点击表单显示城市控件并发送后台请求数据 与 点击body区域隐藏城市控件
  101. _city.menuEvent(); //添加监听事件: 点击菜单显示对应的内容
  102. };
  103. /**
  104. * 为表单添加点击事件
  105. */
  106. U.MD.UI.city.inputEvent = function () {
  107. var _city = U.MD.UI.city; //简写命名空间
  108. var _attr = _city.Attr; //简写全局属性json名
  109. var _hidden = "U_MD_UI_city_hidden"; //class样式名 由于太长赋值给变量 _hidden 控制元素display的样式
  110. var _cityBox = U.selectEl("#U_MD_UI_city_cityBox")[0]; //城市控件总盒子节点
  111. U.selectEl(document).bind('click', function () { //点击body时 隐藏城市控件
  112. U.selectEl(_cityBox).addClass(_hidden);
  113. //添加掉hidden的class名 目的: 添加display为none的样式
  114. }, false);
  115. U.selectEl(_cityBox).bind('click', function (e) { //防止点击城市控件时 被body的事件覆盖而隐藏 因此加上防止冒泡处理
  116. U.UF.EV.stopBubble(e);
  117. //阻止事件冒泡
  118. });
  119. U.selectEl("#U_MD_UI_city_areaCont")[0].onclick = function () {
  120. if ($("#U_MD_UI_city_areaCont")[0]) {
  121. U.selectEl("#U_MD_UI_city_cityBox")[0].style.display = "none";
  122. }
  123. }
  124. };
  125. /**
  126. * 为每个菜单添加点击事件
  127. */
  128. U.MD.UI.city.menuEvent = function () {
  129. var _city = U.MD.UI.city; //简写命名空间
  130. var _attr = _city.Attr; //简写全局属性json名
  131. var _menuAllNode = U.selectEl("[data-city-mark]"); //所有菜单节点;
  132. var _hidden = "U_MD_UI_city_hidden"; //class样式名 由于太长赋值给变量 _hidden 控制元素display的样式
  133. for (var i = 0, len = _menuAllNode.length; i < len; i++) { //循环所有菜单元素
  134. var _el = _menuAllNode[i]; //获取每个菜单 赋值给变量el
  135. U.selectEl(_el).bind('click', function () { //添加点击事件
  136. _city.menuClassControl(this, "U_MD_UI_city_menuChecked", "data-city-mark", _hidden); //为每个菜单添加对应每个区域的事件
  137. });
  138. if (_el.id === "U_MD_UI_city_provinceMenu") { //如果点击的是 省/直辖市 菜单 则获取对应的数据
  139. U.selectEl(_el).bind('click', function () {
  140. _city.getProvince(); //省/直辖市菜单的点击事件 获取数据
  141. })
  142. }
  143. }
  144. };
  145. /**
  146. * 获取数据常用市的所有数据
  147. */
  148. U.MD.UI.city.getUsedCity = function () {
  149. var _city = U.MD.UI.city; //简写命名空间
  150. var _attr = _city.Attr; //简写全局属性json名
  151. var _usedCityMenu = U.selectEl("#U_MD_UI_city_usedCityMenu")[0]; //常用市菜单按钮
  152. var _liTemplate = U.selectEl("#U_MD_UI_city_liTemplate")[0]; //要clone的li的模板
  153. var _usedCityCont = U.selectEl("#U_MD_UI_city_usedCityCont")[0]; //常用市内容区域
  154. if (!_city.usedCity) { //如果 常用市(_city.usedCity) 无数据 则发送请求到后台获取数据 并打印出来
  155. U.A.Request("http://cd.1473.cn/php", ["db.1473.cn", "UseStudio_Controls", "City_UsedCity"], function (r) {
  156. _city.usedCity = r.value;
  157. _city.allDataPrint(_usedCityMenu, _city.usedCity, _liTemplate, "usedCity", _usedCityCont); //打印数据
  158. });
  159. }
  160. };
  161. /**
  162. * 获取省/直辖市的所有数据
  163. */
  164. U.MD.UI.city.getProvince = function () {
  165. var _city = U.MD.UI.city; //简写命名空间
  166. var _attr = _city.Attr; //简写全局属性json名
  167. var _provinceMenu = U.selectEl("#U_MD_UI_city_provinceMenu")[0]; //省菜单按钮
  168. var _liTemplate = U.selectEl("#U_MD_UI_city_liTemplate")[0]; //要clone的li的模板
  169. var _provinceCont = U.selectEl("#U_MD_UI_city_provinceCont")[0]; //省内容区域
  170. if (!_city.province) { //如果 省/直辖市(_city.province) 无数据 则发送请求到后台获取数据 并打印出来
  171. U.A.Request("http://cd.1473.cn/php", ["db.1473.cn", "UseStudio_Controls", "City_Province"], function (r) {
  172. _city.province = r.value;
  173. _city.allDataPrint(_provinceMenu, _city.province, _liTemplate, "province", _provinceCont); //打印数据
  174. });
  175. }
  176. };
  177. /**
  178. * 通过code 获取市的所有数据
  179. * @param code 省级的id
  180. */
  181. U.MD.UI.city.getCity = function (code) {
  182. var _city = U.MD.UI.city; //简写命名空间
  183. var _attr = _city.Attr; //简写全局属性json名
  184. var _cityMenu = U.selectEl("#U_MD_UI_city_cityMenu")[0]; //市菜单按钮
  185. var _liTemplate = U.selectEl("#U_MD_UI_city_liTemplate")[0]; //要clone的li的模板
  186. var _cityCont = U.selectEl("#U_MD_UI_city_cityCont")[0]; //市内容区域
  187. var _hidden = "U_MD_UI_city_hidden"; //class样式名 由于太长赋值给变量 _hidden 控制元素display的样式
  188. if (!_city.city[code]) { //_city.city = json 而_city.city[code]则是对应的数组值 例如:我点击广东后 获取到了广东的id 则我要通过 广东的id 获取下级的市数据 因此如果json中没有该值 则向后台发送请求获取
  189. _city.menuClassControl(_cityMenu, "U_MD_UI_city_menuChecked", "data-city-mark", _hidden); //相当于点击菜单 将城市的菜单于内容 "先"显示出来 再加载数据 防止多次点击
  190. U.A.Request("http://cd.1473.cn/php", ["db.1473.cn", "UseStudio_Controls", "City_PidFind", code, 1], function (r) {
  191. _city.city[code] = r.value;
  192. //_city.city = {}
  193. //r.value = [{},{},{}]
  194. //为了能判断该code下是否有数据 因此需要在_city.city下添加一个 以code为键名 r.value为值的数组
  195. //例如:_city.city = {} code = 123 r.value = [{a:1},{a:1},{a:1}] 最后会变成 _city.city = {123:[{a:1},{a:1},{a:1}]}
  196. _city.allDataPrint(_cityMenu, _city.city[code], _liTemplate, "city", _cityCont); //打印数据
  197. });
  198. } else { //如果json下有数据 则直接打印该数据
  199. _city.menuClassControl(_cityMenu, "U_MD_UI_city_menuChecked", "data-city-mark", _hidden); //相当于点击菜单 将城市的菜单与内容区域 显示出来
  200. _city.allDataPrint(_cityMenu, _city.city[code], _liTemplate, "city", _cityCont); //打印数据
  201. }
  202. };
  203. /**
  204. * 通过code 获取区级的所有数据 函数的意思可参看上面getCity的注释
  205. * @param code 参数为市级的id
  206. */
  207. U.MD.UI.city.getarea = function (code) {
  208. var _city = U.MD.UI.city; //简写命名空间
  209. var _attr = _city.Attr; //简写全局属性json名
  210. var _areaMenu = U.selectEl("#U_MD_UI_city_areaMenu")[0]; //区菜单按钮
  211. var _hidden = "U_MD_UI_city_hidden"; //class样式名 由于太长赋值给变量 _hidden 控制元素display的样式
  212. var _liTemplate = U.selectEl("#U_MD_UI_city_liTemplate")[0]; //要clone的li的模板
  213. var _areaCont = U.selectEl("#U_MD_UI_city_areaCont")[0]; //区内容区域
  214. if (!_city.area[code]) {
  215. _city.menuClassControl(_areaMenu, "U_MD_UI_city_menuChecked", "data-city-mark", _hidden); //相当于点击菜单 将城市的菜单于内容 "先"显示出来 再加载数据 防止多次点击
  216. U.A.Request("http://cd.1473.cn/php", ["db.1473.cn", "UseStudio_Controls", "City_PidFind", code, 2], function (r) {
  217. _city.area[code] = r.value;
  218. _city.allDataPrint(_areaMenu, _city.area[code], _liTemplate, "area", _areaCont);
  219. });
  220. } else {
  221. _city.menuClassControl(_areaMenu, "U_MD_UI_city_menuChecked", "data-city-mark", _hidden); //相当于点击菜单 将城市的菜单于内容 "先"显示出来 再加载数据 防止多次点击
  222. _city.allDataPrint(_areaMenu, _city.area[code], _liTemplate, "area", _areaCont);
  223. }
  224. };
  225. /**
  226. * 打印传过来的数组json数据
  227. * @param {[type]} menu [与之对应的菜单元素]
  228. * @param {[type]} data [是一个数组json]
  229. * @param {[type]} template [是一个li模板 clone用的]
  230. * @param {[type]} type [数据类型("province"、"usedCity"....) 为判断所用]
  231. * @param {[type]} parent [父节点("cityCont,areaCont...") 也叫做内容区域 ]
  232. */
  233. U.MD.UI.city.allDataPrint = function (menu, data, template, type, parent) {
  234. var _city = U.MD.UI.city; //简写命名空间
  235. var _attr = _city.Attr; //简写全局属性json名
  236. var _usedCityMenu = U.selectEl("#U_MD_UI_city_usedCityMenu")[0]; //常用市菜单按钮
  237. var _provinceMenu = U.selectEl("#U_MD_UI_city_provinceMenu")[0]; //省菜单按钮
  238. var _len = data.length; //数组json的长度
  239. var _menu = menu; //菜单元素 赋值给 _menu变量
  240. for (var i = 0; i < _len; i++) {
  241. // 遍历 data数据(数组json)
  242. var _span = _city.dataPrint(data[i], template, type, parent);
  243. //单个数据打印 PS:由于data是一个 数组json([{a:1},{a:2},{a:3}]) 因此 需要将获取对应的数据 并添加在 对应的 parent(内容区域) 上
  244. _span.onclick = function () {
  245. var _type = U.selectEl(this).attr("data-city-type");
  246. //获取点击的span标签的属于哪一类型 (比如: 点击省的数据 是 province 市的数据 则时 city)
  247. var _code = U.selectEl(this).attr("data-city-code");
  248. //获取数据编码 为寻找下一层所用
  249. U.selectEl(_menu.children[0]).addClass("U_MD_UI_city_menuoChecked");
  250. //点击后为 对应的相对应的菜单添加红色小圆点样式 例如:点击省/直辖市菜单下的 广东后 省/直辖市就会多一个红色小圆点的样式
  251. _menu.children[0].innerText = this.innerText;
  252. //改变对应菜单的名字为:点击数据的值 例如:点击"省/直辖市"菜单 下的广东 则 菜单的名字则变为 广东 PS: children[0] 为 li下的span标签
  253. U.selectEl(_menu).attr("data-city-res", this.innerText);
  254. //给自定义属性 data-city-res 添加为: 点击数据的值 PS: 为获取最终值给表单所用
  255. _city.contClassControl(this, "U_MD_UI_city_Cont_ochecked");
  256. //给所选的内容数据添加红色背景 并且删除同一内容区域拥有红色背景的其他元素
  257. switch (_type) {
  258. //此处为 判断 点击 各类型数据需要做的动作 type为判断哪种类型 比如: type值为 "province" 则是 省/直辖市菜单下的 数据 点击这些数据后 就是要做的事情
  259. case "province":
  260. _city.getCity(_code);
  261. //将数据的 code 值传入给 城市函数 来获取城市数据 PS: 获取市的数据需要获取他们的parentid 而code则是他们的parentid
  262. _city.initAllClass(_usedCityMenu);
  263. //点击省/直辖市下的数据的话 则初始化 常用市菜单 与 相对应的内容区域样式
  264. break;
  265. case "usedCity":
  266. if (this.innerText === "重庆") { //由于重庆这个城市比较特殊 因此需要在常用市那将重庆转为省数据
  267. _city.getCity(_code);
  268. } else {
  269. _city.getarea(_code);
  270. }
  271. //在将数据的 code 值传入给 城市函数 来获取城市数据 PS: 获取市的数据需要获取他们的parentid 而code则是他们的parentid
  272. _city.initAllClass(_provinceMenu);
  273. //点击常用市下的数据的话 则初始化 省/直辖市菜单 与 相对应的内容区域样式
  274. break;
  275. case "city":
  276. _city.getarea(_code);
  277. //在将数据的 code 值传入给 区函数 来获取区数据 PS: 获取区的数据需要获取他们的parentid 而code则是他们的parentid
  278. break;
  279. case "area":
  280. _city.getRes("data-city-res");
  281. //由于该控件是 省-市-区 因此 当点击区里的数据时 则调用获取最终值的函数
  282. break;
  283. }
  284. }
  285. }
  286. };
  287. /**
  288. * 打印单个数据api(创建节点,赋id 赋innerText 等等)
  289. * @param {[json对象]} data [json对象的数据]
  290. * @param {[元素]} template [需要clone的li模板]
  291. * @param {[字符串]} type [属于哪种城市类型]
  292. * @param {[元素]} parent [父节点]
  293. * @return {[元素]} [克隆完后的一条li下的span节点]
  294. */
  295. U.MD.UI.city.dataPrint = function (data, template, type, parent) {
  296. var _city = U.MD.UI.city; //简写命名空间
  297. var _liNode = _city.clone(template), //克隆已建好的li模板
  298. _spanNode = _liNode.children[0]; //获取li的span节点
  299. var _shortName = data.short_name; //获取城市名字缩写
  300. var _name = data.name; //获取名字全称
  301. _liNode.id = type + data.id; //添加id
  302. _spanNode.innerText = _shortName; //添加文字内容
  303. if (_shortName === "北京" || _shortName === "上海" || _shortName === "天津" || _shortName === "重庆") {//由于这4个城市的 缩写 和省的名字相同 因此 需要将数据名 改成name 详见数据库
  304. if (parent.id === "U_MD_UI_city_cityCont") {
  305. _spanNode.innerText = _name; //添加文字内容
  306. }
  307. }
  308. if (parent.id === "U_MD_UI_city_areaCont") { //由于区级数据库 的缩写少了一个区 例如:显示出来的 龙岗区 被缩成 龙岗 因此需要将值等于他们的全称
  309. _spanNode.innerText = _name; //添加文字内容
  310. }
  311. _spanNode.id = "span_" + type + data.id;
  312. U.selectEl(_spanNode).attr("data-city-code", data.id); //添加自定义属性 编号
  313. U.selectEl(_spanNode).attr("data-city-type", type); //添加自定义属性 类型
  314. parent.appendChild(_liNode); //添加到parent节点上
  315. return _spanNode; //返回该元素
  316. };
  317. /**
  318. * 添加选中时的class 并删除已有该class的元素
  319. * @param {[元素]} el [点击菜单的元素]
  320. * @param {[字符串]} cs [选中菜单时的class]
  321. * @param {[字符串]} dataattr [菜单的自定义属性 与 对应内容区域的id相同]
  322. * @param {[字符串]} hiddenCs [对应内容区域的class]
  323. */
  324. U.MD.UI.city.menuClassControl = function (el, cs, dataattr, hiddenCs) {
  325. var _city = U.MD.UI.city; //简写命名空间
  326. var _attr = _city.Attr; //简写全局属性json名
  327. var _cityMenu = U.selectEl("#U_MD_UI_city_cityMenu")[0]; //市菜单按钮
  328. var _areaMenu = U.selectEl("#U_MD_UI_city_areaMenu")[0]; //区菜单按钮
  329. var _cityCont = U.selectEl("#U_MD_UI_city_cityCont")[0]; //市内容区域
  330. var _areaCont = U.selectEl("#U_MD_UI_city_areaCont")[0]; //区内容区域
  331. var _oEl = U.selectEl("." + cs)[0];
  332. //找到拥有该class的元素
  333. if (_oEl) { U.selectEl(_oEl).removeClass(cs) };
  334. //如果找的到该元素 则删除此元素的class
  335. U.selectEl(el).addClass(cs);
  336. //为el元素添加该class
  337. var _oElCont = U.selectEl("#" + U.selectEl(_oEl).attr(dataattr))[0];
  338. //找到拥有该class的菜单元素的自定义属性的值 并找到对应区域块的元素(区域块元素的id 与 自定义属性的值相等)
  339. var _elCont = U.selectEl("#" + U.selectEl(el).attr(dataattr))[0];
  340. //同上 找到点击菜单元素的自定义属性的值
  341. U.selectEl(_oElCont).addClass(hiddenCs);
  342. //添加名为hiddenCs 的className (添加与删除 display为none)
  343. U.selectEl(_elCont).removeClass(hiddenCs);
  344. //elCont元素的display为block
  345. var _id = el.id;
  346. switch (_id) { //以下为点击菜单时所作出的不同执行命令
  347. case "U_MD_UI_city_usedCityMenu":
  348. case "U_MD_UI_city_provinceMenu": //当为菜单常用市 或者 省直辖市时 将区 与 市菜单 与对应内容区域 清空初始化
  349. U.selectEl(_cityMenu).addClass(hiddenCs);
  350. U.selectEl(_areaMenu).addClass(hiddenCs);
  351. U.selectEl(_cityCont).addClass(hiddenCs);
  352. U.selectEl(_areaCont).addClass(hiddenCs);
  353. _cityMenu.children[0].innerText = "请选择";
  354. _areaMenu.children[0].innerText = "请选择";
  355. _cityCont.innerHTML = "";
  356. _areaCont.innerHTML = "";
  357. U.selectEl(_cityMenu).attr("data-city-res", "");
  358. U.selectEl(_areaMenu).attr("data-city-res", "");
  359. break;
  360. case "U_MD_UI_city_cityMenu": //当为市菜单时 将 区菜单 与对应内容区域 清空初始化
  361. U.selectEl(el).removeClass(hiddenCs);
  362. U.selectEl(_areaMenu).addClass(hiddenCs);
  363. U.selectEl(_areaCont).addClass(hiddenCs);
  364. _areaMenu.children[0].innerText = "请选择";
  365. _areaCont.innerHTML = "";
  366. break;
  367. case "U_MD_UI_city_areaMenu":
  368. U.selectEl(el).removeClass(hiddenCs);
  369. break;
  370. }
  371. };
  372. /**
  373. * 内容区域的class 的控制函数 PS:添加红色背景的样式
  374. * @param {[type]} el [所选中的数据元素]
  375. * @param {[type]} ocheckcs [所需要对el添加的样式]
  376. */
  377. U.MD.UI.city.contClassControl = function (el, ocheckcs) {
  378. var _city = U.MD.UI.city; //简写命名空间
  379. var _oEls = U.selectEl("." + ocheckcs);
  380. //找到拥有该class的所有元素
  381. var _type = U.selectEl(el).attr("data-city-type");
  382. //获取他们的该元素的类型
  383. for (var i = 0, len = _oEls.length; i < len; i++) { //遍历oEls
  384. var _otype = U.selectEl(_oEls[i]).attr("data-city-type");
  385. if (_oEls[i] && _otype === _type) {
  386. //如果找的到该元素 并且还是同一内容区域的元素 则删除他的class 例如:(市内容区域下)点击深圳后 在点广州 则 广州的背景颜色为红色 深圳的背景颜色为初始颜色
  387. U.selectEl(_oEls[i]).removeClass(ocheckcs)
  388. }
  389. }
  390. U.selectEl(el).addClass(ocheckcs);
  391. //为el元素添加该class
  392. };
  393. /**
  394. * 此函数专门为 初始化 常用市 或者 省/直辖市的样式而写的 例如:点击常用市下的数据后 省/直辖市的菜单与对应的内容 样式初始化为不选中
  395. * @param el 只能放 常用市菜单(元素) 和 省/直辖市菜单(元素)
  396. */
  397. U.MD.UI.city.initAllClass = function (el) {
  398. var _city = U.MD.UI.city; //简写命名空间
  399. el.className = "U_MD_UI_city_filled"; //将菜单li的样式初始化 U_MD_UI_city_filled无样式属性 摆设占位置用
  400. el.children[0].className = ""; //将li里的span样式也初始化
  401. U.selectEl(el).attr("data-city-res", ""); //将span的自定义属性也初始化
  402. var oEl = U.selectEl(".U_MD_UI_city_Cont_ochecked"); //获取内容区域中被选中的span元素
  403. for (var i = 0; i < oEl.length; i++) {
  404. U.selectEl(oEl[i]).removeClass("U_MD_UI_city_Cont_ochecked"); //判断是否存在此元素 如果存在 则删除被选中的样式
  405. }
  406. if (el.id === "U_MD_UI_city_provinceMenu") { //比如: 点完省/直辖市内容区域的数据时 传过来的el则会是常用市菜单元素 然后常用市菜单的innerText则会初始化回常用市
  407. el.children[0].innerText = "省/直辖市";
  408. }
  409. if (el.id === "U_MD_UI_city_usedCityMenu") { //同上
  410. el.children[0].innerText = "常用市";
  411. }
  412. };
  413. /**
  414. * 通过获取自定义属性的值 查出最终值
  415. * @param dataattr 自定义属性的名字
  416. */
  417. U.MD.UI.city.getRes = function (dataattr) {
  418. var _city = U.MD.UI.city; //简写命名空间
  419. var _attr = _city.Attr; //简写全局属性json名
  420. var _inputNode = _attr.inputNode;
  421. var _cityBox = U.selectEl("#U_MD_UI_city_cityBox")[0]; //城市控件总盒子节点
  422. var _hidden = "U_MD_UI_city_hidden"; //class样式名 由于太长赋值给变量 _hidden 控制元素display的样式
  423. var resAll = U.selectEl("[" + dataattr + "]"); //获取所有拥有该自定义属性的元素 得到一个数组
  424. var _arr = []; //声明一个空数组 存放最终值
  425. for (var i = 0, len = resAll.length; i < len; i++) { //遍历所有自定义元素
  426. var _val = U.selectEl(resAll[i]).attr(dataattr); //获取他们的自定义值
  427. if (_val) { //判断值是否存在
  428. _arr.push(_val); //若存在 则将最终值依次添加到arr数组里
  429. }
  430. }
  431. _inputNode.value = (_arr.join("-")); //最后分割数组用“-” 隔开 添加到表单上
  432. U.selectEl(_cityBox).addClass(_hidden); //最后隐藏控件
  433. };
  434. U.MD.UI.city.clone = function (ele) { //克隆节点
  435. var node = ele.cloneNode();
  436. var child = ele.children;
  437. for (var i = 0; i < child.length; i++) {
  438. var childNode = child[i].cloneNode();
  439. node.appendChild(childNode);
  440. }
  441. return node;
  442. };