U.UI.Controls.js 26 KB

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