Selector.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. //#region 选择器区域
  2. //var win = window;// doc = document;
  3. //window.U.Json_ = window.$; //记录命名控件 //全局使用 解决jquery覆盖我们的选择器的问题。
  4. /*下面的写法会导致程序在window.onload之前执行,为什么要在window.onload之前执行,如果非要执行,能否把所有要做window.onload之前执行的整合在一个文件?并列明必须先执行的理由?*/
  5. /*
  6. 选择器前言
  7. 好处:
  8. 1、简化项目的代码
  9. 2、当我对系统的ocument.getElementById document.getElementsByTagName document.getElementsByClassName有奇异 觉得里面需要修改添加一些新的方法处理 可以统一处理
  10. */
  11. //#region 创建元素
  12. /*
  13. *使用$$操作符简化编码长度。
  14. *例:$$("div", { "style": { "cssText": "font-size:16px;float:left;line-height:33px;width:40%;margin:0px 0px 0px 15px;" }, "innerHTML": "文件名" }, Inner_J)
  15. * @param {string} 元素的类型tagName 例如:"div"
  16. * @param {object} 集合,类似 { "style": { "cssText": "font-size:16px;float:left;line-height:33px;width:40%;margin:0px 0px 0px 15px;" }, "innerHTML": "文件名" }
  17. * @param {element} 所要追加的父亲元素,把第二个参数作为孩子节点追加到第三个参数。par代表父亲元素
  18. * @param {element} 追加的位置,如果有此参数,则把创建的元素追加到此元素的前面。此元素必须为第三个参数的孩子节点。
  19. */
  20. U.quickCreate = window.$$ = function (str, obj, parentel, child) { //创建基本元素元素
  21. var i, _element;
  22. //由于createDocumentFragment和createTextNode太长,可以通过简单的方式去创建
  23. var _obj = {
  24. "frag": "createDocumentFragment" //碎片元素
  25. // "text": "createTextNode" //文本元素
  26. };
  27. //判断是否创建上面的元素方式
  28. if (_obj[str]) {
  29. _element = document[_obj[str]]();
  30. }
  31. //创建制定标签的元素
  32. else {
  33. _element = document.createElement(str);
  34. }
  35. //给元素添加属性
  36. if (obj) {
  37. U.selectEl(_element).addAttrArray(obj);
  38. }
  39. //如果存在父亲,则追加孩子节点。
  40. if (parentel) {
  41. //如果存在第四个参数,则追加到第四个参数的前面。否则,追加在最后面。
  42. if (child) {
  43. parentel.insertBefore(_element, child);
  44. }
  45. //追加到父亲元素的最后面
  46. else {
  47. parentel.appendChild(_element);
  48. }
  49. }
  50. //返回创建的元素
  51. return _element;
  52. }
  53. //#endregion
  54. //#region 1473用的快速选择器 去除没有必要的功能 只保留简单的选择功能
  55. /**
  56. * 初始化编辑区域
  57. *
  58. * @param {string} 选择 首先我们会定义3个获取元素的方法代替系统的 document.getElementById document.getElementsByTagName document.getElementsByClassName
  59. * @param {元素} 在元素下面搜索符合参数一的所有孩子节点
  60. 例一、$("#U_MD_D_H");找名为U_MD_D_H唯一id。
  61. 例二、$("div", UDKF):在元素UDKF下面搜索所有div元素。
  62. 例三:$(".className", UDKF) 在元素UDKF下面找classname等于classname的元素。不建议用,性能太低。
  63. */
  64. $ = U.selectEl = function (name, el) {
  65. //调用选择器的方法
  66. return new U.select(name, el);
  67. }
  68. /**
  69. * 初始化编辑区域
  70. *
  71. * @param {string} 选择的元素,例如"div"
  72. * @param {document} 搜索的层次
  73. * 返回值:数组 [elment,elment,element]
  74. * var a=U.select("div.classname",body);
  75. * var b=U.select("input,a)
  76. */
  77. U.select = function (selector, el) { //定义类
  78. //设置值
  79. this.length = 0; //选择元素的总长度
  80. this.context = el || document; //选择器的域(在哪个元素下面选,默认是document)
  81. //获取元素选择
  82. this.select(selector, el); //选择元素
  83. }
  84. U.select.EVENTS = []; //元素绑定事件存储的地方
  85. /**
  86. * 这里是选择器的方法集合
  87. *
  88. */
  89. U.select.prototype = {//原型对象使用
  90. /**
  91. * 定义选择器构造器
  92. *
  93. * @param {string} 选择特殊字符串 包含# & []
  94. * @param {document} 搜索的层次
  95. */
  96. select: function (name, el) { //选择器选择
  97. var _selectel;
  98. //如果是字符串说明用户要通过选择器找到字符串
  99. if (U.UF.C.isString(name)) {
  100. var _r = name.substring(0, 1), //获取特殊字符 . # 或者 ""
  101. _n = name.substring(1, name.length), //获取标签名
  102. _doc = el || document; //去除特殊字符后
  103. //这里是判断获取
  104. try { //这里利用基础的选择器选取数据
  105. switch (_r) {
  106. case "#": //根据id获取 因为id获取只能通过全局搜索 但是由于项目中有存在克隆的情况 会出现id不唯一的情况
  107. if (_doc == document && U.UF.S.EN.test(_n)) {
  108. _selectel = document.getElementById(_n);
  109. }
  110. break;
  111. case ".": //根据className获取
  112. if (U.UF.S.EN.test(_n)) {
  113. _selectel = _doc.getElementsByClassName(_n);
  114. }
  115. break;
  116. case "*":
  117. //如果后面有输入id,那么找所有的媒体文件
  118. if (U.UF.S.EN.test(_n)) {
  119. _selectel = document[_n]; //获取媒体文件
  120. if (!_selectel) { //如果没有找到说明不兼容
  121. if (U.UF.CI.getBrowser().browser == "msie") { //ie得到媒体文件的方法
  122. _selectel = document.getElementById(_n);
  123. }
  124. //非ie系列
  125. else {
  126. _selectel = document.embeds[_n];
  127. }
  128. }
  129. }
  130. //否则就是直接找指定元素下面的所有元素
  131. else {
  132. _selectel = _doc.getElementsByTagName("*");
  133. }
  134. break;
  135. default: //标签的获取 //获取指定的元素
  136. if (U.UF.S.EN.test(name)) {
  137. _selectel = _doc.getElementsByTagName(name); //除去特殊字符的处理
  138. }
  139. break;
  140. }
  141. }
  142. catch (e) {
  143. }
  144. //判断是否获取元素成功,如果上面简单的选择去不成功,那么就通过其他的选择器方案去获取
  145. if (_selectel == null) {
  146. _selectel = U.UF.CP.selectorElement(name, _doc); //其他选择的方式获取
  147. }
  148. }
  149. //如果用户第一个参数传的是元素,那么就直接设置
  150. else if (name) {
  151. _selectel = name;
  152. }
  153. //添加元素到this里面
  154. if (_selectel) {
  155. this.addElement(_selectel);
  156. }
  157. return this;
  158. },
  159. /**
  160. * 添加查找到的元素到this里
  161. *
  162. * @param {elements} 选择的元素数组
  163. */
  164. addElement: function (els) {
  165. //把所有获取出来的元素转化成数组,以便下面循环添加 U.UF.C.isElement(els) || els.length == null
  166. if ((U.UF.C.isElement(els) || els.length == null) || els.toString() == "[object Window]") {
  167. els = [els];
  168. }
  169. //循环所有的元素,把元素设置到this里面,这样用户获取到的元素集就能通过this[0]或者this[id]去获取了
  170. for (var i = 0; i < els.length; i++) {
  171. //如果元素存在的处理
  172. this[i] = els[i];
  173. //如果元素有id,那么给返回值添加一个id的处理,以便返回值中有以id作为key的返回值
  174. if (els[i].id) {
  175. this[els[i].id] = els[i];
  176. }
  177. this.length++; //没添加一个那么选择的元素的长度多一个
  178. }
  179. },
  180. /**
  181. * 在选择好的元素下面继续搜索子元素
  182. *
  183. * @param {string} 选择特殊字符串 包含# & []
  184. * @param {number} 搜索的层次
  185. */
  186. find: function (name, item) { //获取元素的后代
  187. var i = item || 0, //由于选择选择出来的元素是数组,所以需要筛选出第几个需要获取子节点
  188. _length = item + 1 || this.length, //选择元素的长度
  189. _elements = new U.select(); //由于新选择了元素,那么实例化选择器
  190. for (; i < _length; i++) {
  191. _elements.select(name, this[i]); //重新选择添加处理
  192. }
  193. return _elements; //返回最后选择的结果
  194. },
  195. /**
  196. * 当前元素前一个兄弟节点
  197. *
  198. * @param {string} 选择特殊字符串 包含# & []
  199. * @param {number} 搜索的层次
  200. */
  201. prev: function (item) {
  202. var _selectel, //获取选择的元素
  203. _selects = [], //所有选择的元素
  204. i = item || 0, //由于选择选择出来的元素是数组,所以需要筛选出第几个需要获取子节点
  205. _length = item + 1 || this.length, //选择元素的长度
  206. _elements = new U.select(); //由于新选择了元素,那么实例化选择器
  207. //循环的去获取每个元素的上级元素
  208. for (; i < _length; i++) {
  209. _selectel = this[i];
  210. if (_selectel) {
  211. //用do while去过滤文本节点,只找元素节点
  212. do {
  213. _selectel = _selectel.previousSibling;
  214. }
  215. while (_selectel && _selectel.nodeType !== 1)
  216. }
  217. //找到节点追加到数组里
  218. if (_selectel) {
  219. _selects.push(_selectel);
  220. }
  221. }
  222. //把元素添加到_elements里,并返回到前台
  223. _elements.addElement(_selects);
  224. return _elements;
  225. },
  226. /**
  227. * 当前元素之后第一个兄弟节点
  228. *
  229. * @param {string} 选择特殊字符串 包含# & []
  230. * @param {number} 搜索的层次
  231. */
  232. next: function (item) {
  233. var _selectel, //获取选择的元素
  234. _selects = [], //所有选择的元素
  235. i = item || 0, //由于选择选择出来的元素是数组,所以需要筛选出第几个需要获取子节点
  236. _length = item + 1 || this.length, //选择元素的长度
  237. _elements = new U.select(); //由于新选择了元素,那么实例化选择器
  238. //循环的去获取每个元素的上级元素
  239. for (; i < _length; i++) {
  240. _selectel = this[i];
  241. if (_selectel) {
  242. //用do while去过滤文本节点,只找元素节点
  243. do {
  244. _selectel = _selectel.nextSibling;
  245. }
  246. while (_selectel && _selectel.nodeType !== 1)
  247. }
  248. //找到节点追加到数组里
  249. if (_selectel) {
  250. _selects.push(_selectel);
  251. }
  252. }
  253. //把元素添加到_elements里,并返回到前台
  254. _elements.addElement(_selects);
  255. return _elements;
  256. },
  257. /**
  258. * 获取所有的子元素
  259. *
  260. * @param {number} 选择器结果里面的第几个
  261. */
  262. Nodes: function (item) {
  263. item = item || 0; //由于选择选择出来的元素是数组,所以需要筛选出第几个需要获取子节点
  264. //直接返回所有的子节点
  265. if (this[item]) {
  266. this[item].childNodes;
  267. }
  268. ;
  269. },
  270. /**
  271. * 获取所有的子元素
  272. *
  273. * @param {number} 选择器结果里面的第几个
  274. */
  275. Child: function (item) {//获取有效元素孩子节点
  276. item = item || 0; //由于选择选择出来的元素是数组,所以需要筛选出第几个需要获取子节点
  277. //如果选择的元素存在则获取子节点 通过U.UF.EL.getChildrenNoText 可以把 #text节点过滤
  278. if (this[item]) {
  279. return U.UF.EL.getChildrenNoText(this[item].childNodes)
  280. }
  281. },
  282. /**
  283. * 如果没有参数,则是查找自己的父亲,如果有参数,则查找符合条件的祖先元素。
  284. * 如果UTF是数字n,则向上查找n层祖先。
  285. * 如果UTF是属性,则查找符合条件的属性。
  286. *
  287. * @param {number} 选择器结果里面的第几个
  288. */
  289. Parent: function (obj) {//获取上级父亲层
  290. var _while,
  291. _istrue,
  292. _el = this[0];
  293. obj = obj || 1; //如果没有条件,那么就是默认选取上一层的父亲
  294. if (U.UF.C.isNumber(obj)) {
  295. for (i = 0; i < obj; i++) {
  296. if (_el) { //判断是否有选取
  297. _el = _el.parentNode;
  298. }
  299. }
  300. }
  301. else {
  302. //循环的向上寻找制定条件的元素,最大不超过document层
  303. _while: while (_el && _el != document) {
  304. _istrue = true;
  305. //循环判断条件是否匹配
  306. for (i in obj) {
  307. //如果条件匹配
  308. if (obj[i] != _el[i] && (!_el.getAttribute || _el.getAttribute(i) != obj[i])) {
  309. _istrue = false;
  310. break;
  311. }
  312. }
  313. //如果全部条件符合,那么直接跳出
  314. if (_istrue) {
  315. break _while;
  316. }
  317. //继续向上找
  318. else {
  319. _el = _el.parentNode;
  320. }
  321. }
  322. }
  323. //返回找到的祖先层
  324. return _el;
  325. },
  326. /**
  327. * 获取所有的子元素
  328. *
  329. * @param {number} 选择器结果里面的第几个
  330. */
  331. childs: function (item) {//获取孩子节点
  332. return new U.select(this.Child(item));
  333. },
  334. /**
  335. * 如果没有参数,则是查找自己的父亲,如果有参数,则查找符合条件的祖先元素。
  336. * 如果UTF是数字n,则向上查找n层祖先。
  337. * 如果UTF是属性,则查找符合条件的属性。
  338. *
  339. * @param {number} 选择器结果里面的第几个
  340. */
  341. parentElement: function (obj, item) {//获取父亲节点
  342. return new U.select(this.Parent(obj, item));
  343. },
  344. /**
  345. * 克隆元素
  346. *
  347. * @param {boolean} 设置为 true,如果您需要克隆节点及其属性,以及后代, 设置为 false,如果您只需要克隆节点及其后代
  348. * @param {number} 选择器结果里面的第几个
  349. */
  350. clone: function (deep, item) { //克隆元素 UDOD, UDID, USE
  351. var i = item || 0, //item 基本没有用
  352. _returnarr = [], //返回的数据
  353. _length = i + 1 || this.length; //克隆元素的长度
  354. //循环克隆放入_returnarr里
  355. for (; i < _length; i++) {
  356. _returnarr.push(this[i].cloneNode(deep));
  357. }
  358. //返回选择器
  359. return new U.select(_returnarr);
  360. },
  361. /**
  362. * 把元素添加到制定的父亲层
  363. *
  364. * @param {element} 添加到哪个父亲层
  365. * @param {number} 选择器结果里面的第几个
  366. * @param {element} 添加到哪个元素的上面
  367. */
  368. appendTo: function (parentel, item, childel) {//添加元素到制定的位置
  369. var i = item || 0, //选择器结果里面的第几个
  370. _length = item + 1 || this.length; //插入元素的长度
  371. //循环条件元素
  372. for (; i < _length; i++) {
  373. //如果有子元素,就添加到这个子元素的前面
  374. if (childel) {
  375. parentel.insertBefore(this[i], childel);
  376. }
  377. //添加到最后面
  378. else {
  379. parentel.appendChild(this[i]);
  380. }
  381. }
  382. return this;
  383. },
  384. /**
  385. * 添加子元素
  386. *
  387. * @param {element} 需要追加的元素
  388. * @param {number} 选择器结果里面的第几个
  389. * @param {element} 添加到哪个元素的上面
  390. */
  391. append: function (el, item, childel) {//插入元素
  392. item = item || 0; //选择器结果里面的第几个
  393. //如果有子元素,就添加到这个子元素的前面
  394. if (childel) {
  395. this[item].insertBefore(el, childel);
  396. }
  397. //添加到最后面
  398. else {
  399. this[item].appendChild(el);
  400. }
  401. return this;
  402. },
  403. /**
  404. * 移除元素
  405. *
  406. * @param {boolean} 设置为 true,如果您需要克隆节点及其属性,以及后代, 设置为 false,如果您只需要克隆节点及其后代
  407. * @param {number} 选择器结果里面的第几个
  408. */
  409. remove: function (item) {
  410. var i = item || 0, //选择器结果里面的第几个
  411. _length = item != null ? item + 1 : this.length; //移除的数量
  412. //循环移除
  413. for (; i < _length; i++) {
  414. //判断是否有上一级
  415. if (this[i] && this[i].parentNode) {
  416. this[i].parentNode.removeChild(this[i]); //移除
  417. }
  418. }
  419. return this;
  420. },
  421. /**
  422. * 元素居中
  423. *
  424. * @param {number} 选择器结果里面的第几个
  425. */
  426. Center: function (item) { //元素居中
  427. var i = item || 0, //选择器结果里面的第几个
  428. _length = item + 1 || this.length; //居中弹出的数量
  429. //循环弹出处理
  430. for (; i < _length; i++) {
  431. U.UF.F.windowTopCenter(this[i]); //居中弹出
  432. }
  433. return this;
  434. },
  435. /**
  436. * 返回元素的大小和位置
  437. *
  438. * @param {number} 选择器结果里面的第几个
  439. */
  440. getElementInfo: function (item) {
  441. return U.UF.EL.getElementInfo(this[item || 0]);
  442. },
  443. /**
  444. * 返回元素的大小和位置
  445. *
  446. * 设置单个Css属性传参说明
  447. * @obj {string} 必填 css属性名
  448. * @value {string} 必填 css属性对应的值
  449. * @item {number} 选填 选择器结果里面的第几个
  450. *
  451. * 设置多个Css属性传参说明
  452. * @obj {string} 必填 需设置的cssjson
  453. * 形如:{width : '100px', height: '100px', 'backgroud-color': 'red'}
  454. * @value {null} 占位传参 null
  455. * @item {number} 选填 选择器结果里面的第几个
  456. */
  457. css: function (obj, value, item) {//获取指定的css值
  458. var i = item || 0, //选择第几个
  459. _length = item + 1 || this.length, //长度
  460. _isobject = U.UF.C.isObject(obj);
  461. //如果是object,那么第二个参数就是item 所以这里的 value = item
  462. if (_isobject) {
  463. this.addAttrArray({ "style": obj }, value);
  464. }
  465. //如果第一个参数是strig类型那么value需要有值,如果有值那么就是设置,否则是获取css
  466. else if (value != null) {
  467. //循环的设置值
  468. for (i; i < _length; i++) {
  469. obj = U.UF.EL.styleConversion(obj); //由于用户这边会穿 text-align 这样的值 但是在css里面 该值为 textAlign改成了大写
  470. try {
  471. this[i].style[obj] = value;
  472. } catch (e) { }
  473. }
  474. }
  475. //获取css
  476. else {
  477. return U.UF.EL.getStyle(this[i], obj);
  478. }
  479. return this;
  480. },
  481. /**
  482. * 添加classname
  483. *
  484. * @param {string} 移除的classname
  485. */
  486. addClass: function (classname, item) { //添加Class
  487. var i = item || 0, //选择第几个
  488. _length = item + 1 || this.length; //长度
  489. //循环给元素添加class值
  490. for (; i < _length; i++) {
  491. U.UF.EL.addClass(this[i], classname);
  492. }
  493. return this;
  494. },
  495. /**
  496. * 移除classname
  497. *
  498. * @param {string} 移除的classname
  499. */
  500. removeClass: function (classname, item) {//移除制定的class
  501. var i = item || 0, //选择第几个
  502. _length = item + 1 || this.length; //长度
  503. //循环给元素移除classname
  504. for (; i < _length; i++) {
  505. U.UF.EL.removeClass(this[i], classname);
  506. }
  507. return this;
  508. },
  509. /**
  510. * 判断元素是否有制定的class
  511. *
  512. * @param {string} classname
  513. */
  514. hasClass: function (classname, item) {
  515. item = item || 0;
  516. return U.UF.EL.isHasClass(this[item], classname);
  517. },
  518. /**
  519. * 判断元素是否有制定的class
  520. *
  521. * @param {string} classname
  522. */
  523. attr: function (obj, value, item) { //添加属性
  524. var j,
  525. i, //选择第几个
  526. _length, //长度
  527. _isobject = U.UF.C.isObject(obj); //判断元素是否为对象
  528. //如果是object,那么第二个参数就是item 所以这里的 value = item
  529. if (_isobject) {
  530. i = value || 0; //选择第几个
  531. _length = value + 1 || this.length; //长度
  532. //循环所有的元素添加至
  533. for (; i < _length; i++) {
  534. for (j in obj) {
  535. U.UF.EL.addAttributes(this[i], j, obj[j]); //给元素添加属性
  536. }
  537. }
  538. }
  539. //如果第一个参数是strig类型那么value需要有值,如果有值那么就是设置,否则是获取css
  540. else if (value != null) {
  541. i = item || 0; //选择第几个
  542. _length = item + 1 || this.length; //长度
  543. //循环的设置值
  544. for (i; i < _length; i++) {
  545. U.UF.EL.addAttributes(this[i], obj, value); //给元素添加属性
  546. }
  547. }
  548. //获取属性,
  549. else {
  550. return this[item || 0].getAttribute(obj);
  551. }
  552. return this;
  553. },
  554. /**
  555. * 移除属性
  556. *
  557. * @param {string} classname
  558. */
  559. rmAttr: function (name, item) { //移除属性
  560. U.UF.EL.delAttributes(this[item || 0], name); //移除元素
  561. return this;
  562. },
  563. /**
  564. * 添加属性
  565. *
  566. * @param {string} classname
  567. */
  568. addAttrArray: function (obj, item) {//赋值区域
  569. var j, k,
  570. _newcsstext,
  571. _csstype,
  572. _csstext = "", //csstext
  573. i = item || 0, //选择第几个
  574. _length = item + 1 || this.length; //长度
  575. //循环的处理每个元素赋值
  576. for (; i < _length; i++) {
  577. //循环所有的属性
  578. for (j in obj) {
  579. //css的添加方式
  580. if (j == "style") {
  581. _csstext = "";
  582. _newcsstext = obj[j]["cssText"];
  583. for (k in obj[j]) {
  584. _csstype = U.UF.EL.styleConversion(k, true); //把所有的cssText转成css-text,因为css在拼接的时候是以这种形式
  585. //cssText的设置方式,添加一份新的csstext
  586. if (_csstype == "css-text") {
  587. continue;
  588. }
  589. //如果是其他普通样式的添加,那么就拼接
  590. else if (k in this[i][j]) {
  591. _csstext += _csstype + ":" + obj[j][k] + ";";
  592. }
  593. //自定义属性的设置,情况比较少,但是在做兼容方案的时候可能会用到
  594. else {
  595. this[i][j][k] = obj[j][k];
  596. }
  597. }
  598. //如果需要设置cssText的处理
  599. if (_newcsstext) {
  600. _csstext = this[i][j]["cssText"] + ";" + _newcsstext + ";" + _csstext;
  601. }
  602. //如果是undefined或者是null这样不设置值的处理
  603. else if (_newcsstext !== "") {
  604. _csstext = this[i][j]["cssText"] + ";" + _csstext;
  605. }
  606. this[i][j]["cssText"] = _csstext;
  607. }
  608. //出css以外的添加方式 如 onclick事件赋值 classname赋值
  609. else {
  610. //如果是事件类型的,又是字符串类型,那么这里把它转化成函数
  611. if (j.indexOf("on") == 0 && U.UF.C.isString(obj[j])) {
  612. this[i][j] = new Function(obj[j]); //字符串转化成function
  613. continue;
  614. }
  615. //&& "string".indexOf(U.UF.C.getType((_UVE = UDE[j]))) > -1
  616. //如果是字符串,同时又是系统属性,那么通过setAttribute的方式设置属性,该方式设置属性可以让属性在网页调试模式下看到如<div kk="kk"> kk为自定义属性
  617. else if (U.UF.C.isString(obj[j]) && U.UF.EL.isCustomAttributes(this[i], j)) {
  618. //由于低版本的浏览器会报错,这里用try catch
  619. try {
  620. this[i].setAttribute(j, obj[j]);
  621. }
  622. catch (e) {
  623. }
  624. }
  625. try {
  626. this[i][j] = obj[j];
  627. }
  628. catch (e) { }
  629. }
  630. }
  631. }
  632. return this;
  633. },
  634. /**
  635. * 隐藏元素
  636. *
  637. * @param {string} classname
  638. */
  639. hide: function (item) {
  640. this.css({ "display": "none" }, item);
  641. },
  642. /**
  643. * 显示元素
  644. *
  645. * @param {string} classname
  646. */
  647. show: function (item) { //显示元素
  648. this.css({ "display": "block" }, item);
  649. },
  650. /**
  651. * 获取长度
  652. *
  653. */
  654. width: function () {
  655. return U.UF.EL.getElementRealWidth(this[0]);
  656. },
  657. /**
  658. * 获取长度
  659. *
  660. */
  661. height: function () {
  662. return U.UF.EL.getElementRealHeight(this[0]);
  663. },
  664. /**
  665. * 鼠标移入的时候触发,由于onmouseover会出发多次 这里做兼容
  666. *
  667. * @param {string} classname
  668. */
  669. mouseenter: function (cb, item) { //enter事件
  670. //设置移入函数
  671. this.addAttrArray({
  672. "onmouseover": function () {
  673. U.UF.EV.stopBubbleMouseOutOrOver(this, cb); //判断用户移入的时候出发元素,进行判断元素是否移入
  674. }
  675. }, item);
  676. return this;
  677. },
  678. /**
  679. * 鼠标移出的时候触发,由于onmouseout会出发多次 这里做兼容
  680. *
  681. * @param {string} classname
  682. */
  683. mouseleave: function (cb, item) { //leave事件
  684. //设置移入函数
  685. this.addAttrArray({
  686. "onmouseout": function () {
  687. U.UF.EV.stopBubbleMouseOutOrOver(this, cb); //判断用户移入的时候出发元素,进行判断元素是否移入
  688. }
  689. }, item);
  690. return this;
  691. },
  692. /**
  693. * 鼠标移出的时候触发,由于onmouseout会出发多次 这里做兼容
  694. *
  695. * @param {string} classname
  696. */
  697. gt: function (item) { //索引大于的元素
  698. var i = item, //item 基本没有用
  699. _returnarr = [], //返回的数据
  700. _elements = new U.select(); //由于重新筛选数据,那么需要新建一个选择器
  701. //循环筛选元素
  702. for (; i < this.length; i++) {
  703. _returnarr.push(this[i]);
  704. }
  705. //循环添加到this里面
  706. _elements.addElement(_returnarr);
  707. return _elements;
  708. },
  709. /**
  710. * 鼠标移出的时候触发,由于onmouseout会出发多次 这里做兼容
  711. *
  712. * @param {string} classname
  713. */
  714. lt: function (item) {
  715. var i = 0, //item 基本没有用
  716. _returnarr = []; //返回的数据
  717. //循环筛选元素
  718. for (; i < item; i++) {
  719. _returnarr.push(this[i]);
  720. }
  721. //循环添加到this里面
  722. return new U.select(_returnarr); //由于重新筛选数据,那么需要新建一个选择器
  723. },
  724. /**
  725. * 元素事件绑定
  726. *
  727. * @param {string} classname
  728. */
  729. bind: function (obj, value, item) {
  730. var j,
  731. i, //选择第几个
  732. _length, //长度
  733. _isobject = U.UF.C.isObject(obj); //判断元素是否为对象
  734. //如果是object,那么第二个参数就是item 所以这里的 value = item
  735. if (_isobject) {
  736. i = value || 0; //选择第几个
  737. _length = value + 1 || this.length; //长度
  738. //循环所有的元素添加至
  739. for (; i < _length; i++) {
  740. for (j in obj) {
  741. U.UF.EV.addElementEvent(j, this[i], obj[j]); //添加事件绑定
  742. //添加事件
  743. U.select.EVENTS.push({
  744. element: this[i], //绑定事件
  745. event: j, //事件
  746. fun: obj[j] //函数
  747. });
  748. }
  749. }
  750. }
  751. //如果第一个参数是strig类型那么value需要有值,如果有值那么就是设置,否则是获取css
  752. else if (value != null) {
  753. i = item || 0; //选择第几个
  754. _length = item + 1 || this.length; //长度
  755. //循环的设置值
  756. for (i; i < _length; i++) {
  757. U.UF.EV.addElementEvent(obj, this[i], value); //添加事件绑定
  758. //添加事件
  759. U.select.EVENTS.push({
  760. element: this[i], //绑定事件
  761. event: obj, //事件
  762. fun: value //函数
  763. });
  764. }
  765. }
  766. return this;
  767. },
  768. /**
  769. * 元素解除事件绑定
  770. *
  771. * @param {string} classname
  772. */
  773. unbind: function (obj, value, item) { //事件绑定取消
  774. var j,
  775. i, //选择第几个
  776. k,
  777. _length, //长度
  778. _isobject = U.UF.C.isObject(obj); //判断元素是否为对象
  779. //如果是object,那么第二个参数就是item 所以这里的 value = item
  780. if (_isobject) {
  781. i = value || 0; //选择第几个
  782. _length = value + 1 || this.length; //长度
  783. //循环所有的元素添加至
  784. for (; i < _length; i++) {
  785. for (j in obj) {
  786. U.UF.EV.delElementEvent(j, this[i], obj[j]); //删除事件绑定
  787. for (k = 0; k < U.select.EVENTS.length; k++) {
  788. if (U.select.EVENTS[k].element == this[i] && U.select.EVENTS[k].event == j && U.select.EVENTS[k].fun == obj[j]) {
  789. U.select.EVENTS.splice(k, 1);
  790. k--;
  791. }
  792. }
  793. }
  794. }
  795. }
  796. //如果第一个参数是strig类型那么value需要有值,如果有值那么就是设置,否则是获取css
  797. else if (obj != null) {
  798. i = item || 0; //选择第几个
  799. _length = item + 1 || this.length; //长度
  800. //循环的设置值
  801. for (i; i < _length; i++) {
  802. for (k = 0; k < U.select.EVENTS.length; k++) {
  803. if (U.select.EVENTS[k].element == this[i] &&
  804. U.select.EVENTS[k].event == obj &&
  805. (value == null || U.select.EVENTS[k].fun == value)) {
  806. U.UF.EV.delElementEvent(obj, this[i], U.select.EVENTS[k].fun); //添加事件绑定
  807. U.select.EVENTS.splice(k, 1);
  808. k--;
  809. }
  810. }
  811. }
  812. }
  813. //如果没有传key和value去移除,那么就移除元素所有绑定的事件
  814. else {
  815. i = item || 0; //选择第几个
  816. _length = item + 1 || this.length; //长度
  817. for (i; i < _length; i++) {
  818. for (k = 0; k < U.select.EVENTS.length; k++) {
  819. if (U.select.EVENTS[k].element == this[i]) {
  820. U.UF.EV.delElementEvent(U.select.EVENTS[k].event, this[i], U.select.EVENTS[k].fun); //添加事件绑定
  821. U.select.EVENTS.splice(k, 1);
  822. k--;
  823. }
  824. }
  825. }
  826. }
  827. return this;
  828. }
  829. }
  830. //#endregion