U.MC.js 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136
  1. /*
  2. 此函数区域用于常用的通用函数 如位置 大小 计时器等
  3. */
  4. Namespace.register("U.M");
  5. //#region 通用函数区域
  6. /**
  7. * 属性添加处理 这里处理例如chrome取消innerText等
  8. *
  9. * @param {object} 需要添加属性的对象
  10. * @param {string} 类型名字
  11. * @param {function} get函数处理
  12. * @param {function} set函数处理
  13. */
  14. U.M.HEPropert = function (UDE, UDN, UGCB, USCB) {
  15. if (UDE.__defineGetter__) {//W3C兼容
  16. UDE.__defineGetter__(UDN, UGCB);
  17. UDE.__defineSetter__(UDN, USCB);
  18. }
  19. else if (Object.defineProperty) {//ie8+
  20. Object.defineProperty(UDE, UDN, { get: UGCB, set: USCB, configurable: true });
  21. }
  22. else { //ie6 7
  23. UDE[UDN] = UGCB; //[^\w]([A-Za-z_][\w]*)\s*\(\s*[\w]+\s*(,\s*[\w]+\s*)*\)
  24. UDE[UDN].toString = UGCB; //获取的时候自动执行用户调用
  25. UDE.attachEvent("onpropertychange", U.M.apply(UDE, [[U.M.HEPropert.OPJL, [UDE, UDN, UGCB, USCB]]]));
  26. }
  27. }
  28. /**
  29. * 上述函数的子函数 用于ie兼容
  30. *
  31. * @param {object} 需要添加属性的对象
  32. * @param {string} 类型名字
  33. * @param {function} get函数处理k
  34. * @param {function} set函数处理
  35. */
  36. U.M.HEPropert.OPJL = function (UDE, UDN, UGCB, USCB) {
  37. if (event.propertyName == UDN) { //判断变化的属性
  38. var _UCB = arguments.caller.caller;
  39. UDE.detachEvent("onpropertychange", _UCB);
  40. USCB(UDE[UDN]);
  41. UDE[UDN] = UGCB;
  42. UDE[UDN].toString = USCB;
  43. UDE.attachEvent("onpropertychange", _UCB); //重新设置
  44. }
  45. }
  46. /**
  47. * 对象添加原型方法,添加新的数据类型,或者在已有数据类型上扩充功能,例如:String,Number,Array,Object,Guid等
  48. *
  49. * @param {object} 数据类型,例如String,Number等。
  50. * @param {string、 object} 当这个参数为string的时候下述函数有效
  51. * @param {function} string => function 原型对应的函数
  52. */
  53. U.M.Setprototype = function (UDE, UAE, UCB) {
  54. if (typeof UAE == "string") { //大量的添加原型方法
  55. UDE.prototype[UAE] = UCB;
  56. }
  57. else { //单个添加
  58. for (var i in UAE) {
  59. UDE.prototype[i] = UAE[i];
  60. }
  61. }
  62. }
  63. /**
  64. * 获取元素的定位位置
  65. *
  66. * @param {element} 元素
  67. * @return {array} 返回元素的位置
  68. ----------[0] 元素的top
  69. ----------[1] 元素的left
  70. */
  71. U.M.pageXY = function (UDOD) {
  72. var _UTP,
  73. _UDE = [0, 0]; //需要返回的元素的位置
  74. while (UDOD) {
  75. _UTP = U.M.GetStyle(UDOD, "position"); //元素的position
  76. if (_UTP != "static") {
  77. _UDE[0] += UDOD.offsetTop; //元素的上距
  78. _UDE[1] += UDOD.offsetLeft; //元素的左距
  79. }
  80. UDOD = UDOD.offsetParent;
  81. }
  82. return _UDE; //返回
  83. }
  84. /**
  85. * 获取元素真实大小
  86. *
  87. * @param {element} 元素
  88. * @param {string} 获取长或者宽的属性
  89. ---------[width] 长
  90. ---------[height] 宽
  91. * @return {} 返回元素的位置
  92. ----------[0] 元素的top
  93. ----------[1] 元素的left
  94. */
  95. U.M.GETHW = function (UDOD, UTF) {
  96. var i, //用于循环
  97. _UWH, //用于记录元素的offset属性
  98. _UCS, //用于记录元素的style属性
  99. _UCE = [0, 2], //用于设置循环的范围
  100. _UDE = ["Top", "Bottom", "Right", "Left"], //用于连接字符串 获得offset属性
  101. _UFN = U.M.GetStyle, //获取元素所使用的样式
  102. _UD = _UFN(UDOD, "display"), //获取元素的display属性
  103. _UH = _UFN(UDOD, UTF); //获取元素的UTF(width,height...)属性
  104. (_UD == "none" && _UH.indexOf("px") == -1) && (_UCS = UDOD.style.cssText, UDOD.style.cssText += ";display:block;visibility:hidden;", _UH = null);
  105. if (_UH == null || _UH.indexOf("%") > -1 || isNaN((_UH = Number(_UH.toInt())))) { //百分比和number使用
  106. _UWH = UDOD["offset" + (UTF.charAt(0).toUpperCase() + UTF.substr(1))]; //获取长获取宽
  107. if (UTF == "width") { //
  108. for (i = 0; i < _UCE.length; i++) {
  109. _UCE[i] += i;
  110. }
  111. }
  112. for (i = _UCE[0]; i < _UCE[1]; i++) {
  113. _UWH -= (((_UH = _UFN(UDOD, "padding" + _UDE[i]).toInt()).length ? 0 : _UH) + ((_UH = _UFN(UDOD, "border" + _UDE[i] + "Width").toInt()).length ? 0 : _UH));
  114. };
  115. (_UCS != null) && (UDOD.style.cssText = _UCS);
  116. }
  117. else { //非百分比处理
  118. _UWH = _UH;
  119. }
  120. return _UWH;
  121. }
  122. /**
  123. * 获取元素的位置大小
  124. *
  125. * @param {element} 元素
  126. * @return {object} 返回元素的位置 函数内有详细的注释
  127. */
  128. U.M.GetElementAllInfo = function (UDOD) {
  129. // UDOD要获取位置的元素
  130. if (UDOD) {
  131. var i, //用于循环
  132. _USE, //存放所有数据的集合
  133. _UVE, //用于获取元素的border属性
  134. _UPE = [], //用于获取元素的padding属性
  135. _UBE = [], //储存变量
  136. _UAE = ["Top", "Right", "Bottom", "Left"], //用于连接字符串 获得offset属性
  137. _UCE = UDOD.getBoundingClientRect(), //返回一个矩形对象
  138. _UDE = U.M.pageXY(UDOD), //获取UDOD的位置
  139. _UDPD = U.M.TOSP(UDOD); //获取元素offsetParent
  140. for (i = 0; i < _UAE.length; i++) { //筛选 padding 和 border
  141. _UPE[i] = U.M.GetStyle(UDOD, "padding" + _UAE[i]).toInt();
  142. _UBE[i] = (_UVE = U.M.GetStyle(UDOD, "border" + _UAE[i] + "Width").toInt()).length ? 0 : _UVE;
  143. }
  144. _USE = {
  145. PD: _UPE, //元素的padding
  146. BD: _UBE, //元素的border
  147. PXT: (document.documentElement.scrollTop) + _UDPD.scrollTop, //滚动条top位置
  148. PXL: (document.documentElement.scrollLeft) + _UDPD.scrollLeft, //滚动条left位置
  149. SH: UDOD.scrollHeight, //包含滚动掉的高度
  150. SW: UDOD.scrollWidth, //包含滚动条的长度
  151. SL: UDOD.scrollLeft, //滚动条向左的位置
  152. ST: UDOD.scrollTop, //滚动条向右的位置
  153. CH: UDOD.clientHeight, //页面不包含 border padding宽度
  154. CW: UDOD.clientWidth, //页面不包含 border padding长度
  155. CT: UDOD.clientTop, //页面margin + top的高度
  156. CL: UDOD.clientLeft, //页面margin + left的长度
  157. OH: UDOD.offsetHeight, ///页面包含 border padding宽度
  158. OW: UDOD.offsetWidth, //页面包含 border padding长度
  159. OL: UDOD.offsetLeft, //页面left的长度
  160. OT: UDOD.offsetTop, //页面top的高度
  161. BCRH: _UCE.bottom - _UCE.top, //元素的显示高度
  162. BCRW: _UCE.right - _UCE.left, //元素的显示长度
  163. BCRT: _UCE.top, //元素的显示top
  164. BCRL: _UCE.left, //元素的显示left
  165. BCRB: _UCE.bottom, //元素的显示bottom
  166. BCRR: _UCE.right, //元素的显示right
  167. TX: _UDE[1], //元素的显示高度
  168. TY: _UDE[0]//元素的显示高度
  169. };
  170. _USE.H = _USE["OH"] - _USE["PD"][1] - _USE["PD"][3] - _USE["BD"][1] - _USE["BD"][3]; //原宽度 不包含所有的border padding margin
  171. _USE.W = _USE["OW"] - _USE["PD"][0] - _USE["PD"][2] - _USE["BD"][0] - _USE["BD"][2] //原长度 不包含所有的border padding margin
  172. // U.Ut.AddObj(_USE, {
  173. // H: _USE["OH"] - _USE["PD"][1] - _USE["PD"][3] - _USE["BD"][1] - _USE["BD"][3], //原宽度 不包含所有的border padding margin
  174. // W: _USE["OW"] - _USE["PD"][0] - _USE["PD"][2] - _USE["BD"][0] - _USE["BD"][2] //原长度 不包含所有的border padding margin
  175. // });
  176. return _USE;
  177. }
  178. return {};
  179. }
  180. /**
  181. * 获取元素的位置大小
  182. *
  183. * @param {element} 元素
  184. * @return {object} 返回元素的位置 函数内有详细的注释
  185. */
  186. U.M.GetElementInfo = function (UDOD) {
  187. var _UCE = UDOD.getBoundingClientRect(); //返回一个矩形对象
  188. return {
  189. SH: UDOD.scrollHeight, //包含滚动掉的高度
  190. SW: UDOD.scrollWidth, //包含滚动条的长度
  191. SL: UDOD.scrollLeft, //滚动条向左的位置
  192. ST: UDOD.scrollTop, //滚动条向右的位置
  193. CH: UDOD.clientHeight, //页面不包含 border padding宽度
  194. CW: UDOD.clientWidth, //页面不包含 border padding长度
  195. CT: UDOD.clientTop, //页面margin + top的高度
  196. CL: UDOD.clientLeft, //页面margin + left的长度
  197. OH: UDOD.offsetHeight, ///页面包含 border padding宽度
  198. OW: UDOD.offsetWidth, //页面包含 border padding长度
  199. OL: UDOD.offsetLeft, //页面left的长度
  200. OT: UDOD.offsetTop, //页面top的高度
  201. BCRH: _UCE.bottom - _UCE.top, //元素的显示高度
  202. BCRW: _UCE.right - _UCE.left, //元素的显示长度
  203. BCRT: _UCE.top, //元素的显示top
  204. BCRL: _UCE.left, //元素的显示left
  205. BCRB: _UCE.bottom, //元素的显示bottom
  206. BCRR: _UCE.right //元素的显示right
  207. }
  208. }
  209. /**
  210. * 获取大小位置
  211. *
  212. * @param {element} 元素
  213. * @return {object} 获取元素的大小
  214. */
  215. U.M.GetPDWH = function (UDOD) {
  216. var i, _UST,
  217. _UDTD = $(UDOD),
  218. _UPE = [],
  219. _UBE = [],
  220. _UAE = ["Top", "Right", "Bottom", "Left"];
  221. //获取padding border
  222. for (i = 0; i < _UAE.length; i++) {
  223. _UPE[i] = _UDTD.css("padding" + _UAE[i]).toInt();
  224. _UBE[i] = _UDTD.css("border" + _UAE[i] + "Width").toInt();
  225. (_UBE[i].length) && (_UBE[i] = 0);
  226. }
  227. //获取长宽
  228. _UAE = ["width", "height"];
  229. for (i = 0; i < _UAE.length; i++) {
  230. _UST = _UAE[i]; _UAE[i] = _UDTD[_UST]();
  231. }
  232. //返回大小处理
  233. return {
  234. "PD": _UPE, //padding
  235. "BD": _UBE, //border
  236. "OW": _UAE[0] + _UPE[1] + _UPE[3] + _UBE[1] + _UBE[3], //包含padding border 的长
  237. "OH": _UAE[1] + _UPE[0] + _UPE[2] + _UBE[0] + _UBE[2], //包含padding border 宽
  238. "CW": _UAE[0], //不包含padding border 宽
  239. "CH": _UAE[1]//不包含padding border 宽
  240. };
  241. }
  242. /**
  243. * 获取元素offsetParent 兼容ie8-
  244. *
  245. * @param {element} 元素
  246. * @param {boolean} 是否从上级开始找起
  247. * @param {string} 规定的position值
  248. * @return {elememt} offsetParent
  249. */
  250. U.M.TOSP = function (UDOD, UTF, UPT) {
  251. var _UTP, _UDBD = document.body;
  252. (!UTF) && (UDOD = UDOD.offsetParent);
  253. while (UDOD && UDOD != _UDBD) {
  254. _UTP = U.M.GetStyle(UDOD, "position");
  255. if ((!UPT && _UTP != "static") || (_UTP == UPT)) {
  256. break;
  257. }
  258. UDOD = UDOD.offsetParent;
  259. }
  260. return UDOD || _UDBD;
  261. }
  262. /**
  263. * 根据ID获取指定的子元素
  264. *
  265. * @param {element} 父级元素
  266. * @param {string} 传进来的ID
  267. * @return {element} 获取子元素id相等的
  268. */
  269. U.M.GetCById = function (UDOD, UDID) {
  270. var i, //用于循环
  271. _UDAD = $(UDOD).Child(); //该UDOD元素的子元素
  272. for (i = 0; i < _UDAD.length; i++) {
  273. if (_UDAD[i].id == UDID) { return _UDAD[i]; }
  274. }
  275. }
  276. /**
  277. * 根据ID获取自定的父亲元素
  278. *
  279. * @param {element} 当前元素
  280. * @param {string} 父亲的id
  281. * @return {object} 获取元素的大小
  282. */
  283. U.M.GTPN = function (UDOD, UTID) {
  284. while (UDOD && !(UDOD == UTID || UDOD.id == UTID)) { //递归寻找父级
  285. UDOD = UDOD.parentNode;
  286. }
  287. return UDOD;
  288. }
  289. /**
  290. * 获取children不为文本
  291. *
  292. * @param {element} 当前元素
  293. * @param {string} 父亲的id
  294. * @return {array} 获取所有的子节点
  295. */
  296. U.M.GTCN = function (UAE, UTP) {
  297. var i, //用于循环
  298. _UDE = []; //用于存放数据且返回
  299. for (i = 0; i < UAE.length; i++) {
  300. if (UAE[i].nodeType == 1 && (!UTP || UTP.indexOf(UAE[i].tagName.toLowerCase()) == -1)) {
  301. _UDE.push(UAE[i])
  302. };
  303. }
  304. return _UDE;
  305. }
  306. /**
  307. * 获取可编辑元素
  308. *
  309. * @param {element} 当前元素
  310. * @param {string} 父亲的id
  311. * @return {element} 可编辑的元素
  312. */
  313. U.M.GetDE = function (UDOD) {
  314. var _UDBD = document.body;
  315. while (UDOD && _UDBD != UDOD) {
  316. if (UDOD.tagName) {
  317. if ("textarea,input".indexOf(UDOD.tagName.toLocaleLowerCase()) > -1 || UDOD.contentEditable == "true") { //可编辑元素
  318. break;
  319. }
  320. }
  321. UDOD = $(UDOD).Parent();
  322. }
  323. return UDOD;
  324. }
  325. /**
  326. * 判断元素是否是制定的子元素
  327. *
  328. * @param {element} 该元素为父元素
  329. * @param {element} 需要判断的元素
  330. * @return {boolean} 获取元素的大小
  331. */
  332. U.M.EISE = function (UDOD, UDTD) {
  333. if (UDOD && UDTD) {
  334. if (UDOD.contains) { //ie chrome 兼容
  335. if (UDOD.contains(UDTD)) {
  336. return true;
  337. }
  338. }
  339. else if (UDOD.compareDocumentPosition) { //firefox
  340. if (!(!!(UDOD.compareDocumentPosition(UDTD)))) {
  341. return true;
  342. }
  343. }
  344. }
  345. return false;
  346. }
  347. /**
  348. * 判断元素的位于第几个
  349. *
  350. * @param {element} 当前元素
  351. * @return {number} 位置
  352. */
  353. U.M.IndexOfParent = function (UDOD) {
  354. var _UDAD = $($(UDOD).Parent()).Child();
  355. return _UDAD.indexOf(UDOD); //判断元素在指定的位置第几个
  356. }
  357. /**
  358. * 判断元素的属性是否是制定属性函数固有属性 true自定义 false固有
  359. *
  360. * @param {element} 当前元素
  361. * @param {string} 为元素的各属性
  362. * @return {number} 位置
  363. */
  364. U.M.Arrt = function (UDOD, UTP) {
  365. UDOD = UDOD || $$("div");
  366. var _UAE = UDOD.attributes; //_UAE 为UDOD的属性集合
  367. if (_UAE) {
  368. if (_UAE[UTP]) { //IE6-7判断是否是自定义属性
  369. return _UAE[UTP].expando == true;
  370. }
  371. else { //是否为自定义属性
  372. return UDOD.getAttribute(UTP) !== null || UDOD[UTP] === void 0;
  373. }
  374. }
  375. }
  376. /**
  377. * 浏览器全屏
  378. *
  379. * @param {element} 需要全屏的元素,例如视频.
  380. * @param {string} 全屏或者取消全屏,true全屏,false是取消全屏
  381. * @return {number} 成功或者失败。
  382. U.M.fullScreen(document,true);
  383. U.M.cancelfullScreen(document,false);
  384. */
  385. U.M.fullScreen = function () {
  386. var _funcname = U.M.GetFullSreeenName("requestFullScreen"); //全屏函数名
  387. if (_funcname != null)
  388. document[_funcname](); //执行全屏函数
  389. }
  390. //取消浏览器全屏
  391. U.M.cancelfullScreen = function () {
  392. var _funcname = U.M.GetFullSreeenName("cancelFullScreen") || U.M.GetFullSreeenName("exitFullScreen"); //全屏函数名
  393. if (_funcname != null)
  394. document[_funcname](); //执行全屏函数
  395. }
  396. /**
  397. * 获取各个浏览器全屏函数的名称
  398. ** @return {string} 全屏功能的函数名
  399. */
  400. U.M.GetFullSreeenName = function (funcname) {
  401. var i, _functionname;
  402. //各个浏览器的全屏函数名称是不一样的,用数组把各个全屏函数包装起来。
  403. //注:各个浏览器全屏函数名如数组: _full = ["requestFullscreen", "mozRequestFullScreen", "webkitRequestFullscreen", "msRequestFullscreen", "oRequestFullscreen"];
  404. //各个浏览器还有不同的取消全屏,退出全屏功能"cancelFullScreen","exitFullScreen"
  405. var _full = ["", "webkit", "moz", "ms", "o"]; //所有浏览器的兼容字符串集
  406. for (i = 0; i < _full.length; i++) {
  407. if (_full[i])
  408. _functionname = _full[i] + funcname.capitalizeFirstLetter();
  409. else
  410. _functionname = funcname;
  411. //判断拼接的浏览器兼容函数名在文档中是否存在。存在则返回函数,不存在返回null。
  412. if (_full[i] in document.documentElement || _full[i] in document) {
  413. return _full[i];
  414. }
  415. }
  416. return null;
  417. }
  418. /**
  419. * 添加或者删除自定义属性
  420. *
  421. * @param {array} 所有的需要变化的元素集
  422. * @param {string} 全屏功能的函数名
  423. * @param {boolean} 判断是删除属性还是添加属性
  424. * @param {array} 二级属性
  425. */
  426. U.M.SRAttr = function (UDE, USN, UTV, UCE) {
  427. var i, //用于循环
  428. j, //用于循环
  429. _UAE,
  430. _UTP = UTV != null ? "setAttribute" : "removeAttribute"; //判断是设置还是删除属性
  431. for (i = 0; i < UDE.length; i++) {//
  432. _UAE = UDE[i];
  433. if (_UAE) {
  434. if (UCE && UCE.length) { //训话属性处理
  435. for (j = 0; j < UCE.length; j++) {
  436. _UAE = _UAE[UCE[j]];
  437. }
  438. }
  439. _UAE[_UTP](USN, UTV); //执行删除获取添加属性
  440. }
  441. }
  442. }
  443. /**
  444. * 修改设置制定样式后获取所有设置的元素
  445. *
  446. * @param {element} 元素
  447. * @param {string} 获取的类型
  448. * @param {string} 是添加还是移除属性
  449. -----------De 移除属性
  450. * @param {object} 设置的属性
  451. * @return {array} 通过参数2获取的元素
  452. */
  453. U.M.SetElement = function (UDE, UTP, URE, UTF) {
  454. if (UDE) {
  455. (typeof (UDE) == "string") && (UDE = $$("div", { "innerHTML": UDE }));
  456. UDE = UDE || document;
  457. var i, //用于循环
  458. _UFT,
  459. _UAE,
  460. _UDOD,
  461. _UMS = "",
  462. _UCE = [];
  463. UTP = (UTP == "*" || !UTP) ? "&*" : UTP; //需要获取的值
  464. if (UTF) {
  465. for (i in UTF) {
  466. UTP += ("[" + i + (UTF[i] ? ("=" + UTF[i]) : "") + "]"); //属性选择
  467. }
  468. }
  469. if ((_UAE = $(UTP, UDE)) && UTF !== false && URE) { //设置
  470. _UCE = _UAE[(_UFT = URE == "De") ? "remove" : "addAttrArray"](_UFT ? null : URE);
  471. }
  472. (URE == "De") && (_UCE = [_UCE.length > 0 ? _UCE : _UAE, UDE]); //如果为删除返回两个值 一个是选中的值 一个是传入的元素集
  473. return _UCE;
  474. }
  475. return [];
  476. }
  477. /**
  478. * 获取元素所使用的样式
  479. *
  480. * @param {element} 需要获取样式的元素
  481. * @param {string} 样式的key
  482. */
  483. U.M.GetStyle = function (UDOD, UVE) {
  484. if (UDOD && UDOD.style) {
  485. UVE = U.M.CssTHH(UVE);
  486. return (UDOD.style[UVE] || UVE == "cssText") ? UDOD.style[UVE] : (UDOD.currentStyle ? UDOD.currentStyle[UVE] || "" : "");
  487. }
  488. return ""; //获取js对应的style值
  489. }
  490. /**
  491. * 添加删除获取class
  492. *
  493. * @param {array} 进行操作的对象
  494. * @param {string} 确定循环范围
  495. * @param {element} 正则表达式 获取字符
  496. * @param {string} 获取或删除指令
  497. * @return {boolean} 是否存在改样式
  498. */
  499. U.M.ARClass = function (UDE, UIE, UCN, UTF) {
  500. var _UCT, //储存对象样式名
  501. _UFT, //储存索引值
  502. _UIF, //储存索引值
  503. i = UIE || 0; //循环初始化
  504. _UL = UIE + 1 || UDE.length, //确定循环范围
  505. _UL = Math.min(_UL, UDE.length);
  506. _UCE = new RegExp("(\\s|^)" + UCN + "(\\s|$)"); //需要索引的值
  507. for (; i < _UL; i++) {
  508. _UCT = UDE[i].className;
  509. _UFT = _UCT.match(_UCE);
  510. if (UTF == "Add") { (!_UFT) && (UDE[i].className += (_UCT ? " " : "") + UCN); } //添加class
  511. else if (UTF == "RE") { //删除class
  512. (_UFT) && (_UIF = _UCT.indexOf(UCN) + UCN.length, UDE[i].className = _UCT.replace(_UCE, (_UIF == _UCT.length || !_UIF) ? "" : " "));
  513. }
  514. }
  515. return _UFT;
  516. }
  517. /**
  518. * style样式转换 如 text-align => textAlign 或者相反的换
  519. *
  520. * @param {array} 进行操作的对象
  521. * @param {string} 确定循环范围
  522. */
  523. U.M.CssTHH = function (UST, UTF) {
  524. UTF = UTF ? [/[A-Z]/g, "-", 0, "toLowerCase"] : [/-[a-z ]/g, "", 1, "toUpperCase"]; //转换的样式或者属性
  525. return UST.replace(UTF[0], function (UMS) { //利用正则转换
  526. return UTF[1] + UMS.charAt(UTF[2])[UTF[3]]();
  527. });
  528. }
  529. /**
  530. * 获取 rgb颜色值
  531. *
  532. * @param {array} 进行操作的对象
  533. * @return {string} 确定循环范围
  534. */
  535. U.M.HexBack = function (UCS) {
  536. var i, //循环初始化
  537. _UAE = "#", //rgb颜色前缀
  538. _USE = UCS.match(U.MS.rgb); //索引值
  539. if (_USE) {
  540. for (i = 1; i < _USE.length; i++) {
  541. _UAE += ("0" + _USE[i].toInt().toString(16)).slice(-2); //转换的方式
  542. }
  543. return _UAE;
  544. }
  545. return UCS;
  546. }
  547. /**
  548. * 获取css3过渡属性
  549. *
  550. * @return {array} 过渡属性的值
  551. -----------[0] 过渡的css
  552. -----------[1] 过渡的回调函数
  553. -----------[2] 兼容的前缀
  554. -----------[3] 浏览器过渡的监视属性
  555. -----------[4] 浏览器结束的属性
  556. */
  557. U.M.GCssAe = function () {
  558. var i, //遍历初始化
  559. _USE = $$("div").style, //获取div的样式
  560. //css兼容的形式
  561. _UDE = {
  562. "WebkitTransition": ["-webkit-transition", "webkitTransitionEnd", "-webkit-", "webkitRequest", "webkitCancel"], //webkit浏览器的兼容
  563. "OTransition": ["-o-transition", "oTransitionEnd", "-o-", "oRequest", "oCancel"], //Op 浏览的兼容
  564. "MozTransition": ["-moz-transition", "transitionend", "-moz-", "mozRequest", "mozCancel"], //火狐浏览器的兼容
  565. "MsTransform": ["-ms-transition", "transitionend", "-ms-"], //ie低版本的兼容
  566. "transition": ["transition", "transitionend", "", "r", "cancel"] //html5的兼容
  567. }
  568. //循环判断获取
  569. for (i in _UDE) {
  570. if (_UDE.hasOwnProperty(i) && _USE[i] !== undefined) {
  571. _UDE[i].push(i);
  572. return _UDE[i];
  573. }
  574. }
  575. }
  576. /**
  577. * css动画
  578. *
  579. * @return {array} 过渡属性的值
  580. -----------[0] 动画的css
  581. -----------[1] 动画的回调函数
  582. -----------[2] 兼容的前缀
  583. -----------[3] 浏览器过渡的监视属性
  584. -----------[4] 浏览器结束的属性
  585. */
  586. U.M.CssAm = function () {
  587. var i, //遍历初始化
  588. _USE = $$("div").style; //获取div的样式
  589. //_UDE css动画属性名数组
  590. var _UDE = {
  591. "animation": ["animation", "animationEnd", "", "webkitRequest", "webkitCancel"],
  592. "OTransition": ["-o-transition", "oTransitionEnd", "-o-", "oRequest", "oCancel"],
  593. "MozTransition": ["-moz-transition", "transitionend", "-moz-", "mozRequest", "mozCancel"],
  594. "MsTransform": ["-ms-transition", "transitionend", "-ms-"],
  595. "transition": ["transition", "transitionend", "", "r", "cancel"]
  596. }
  597. for (i in _UDE) { //循环判断兼容
  598. if (_UDE.hasOwnProperty(i) && _USE[i] !== undefined) {
  599. _UDE[i].push(i);
  600. return _UDE[i];
  601. }
  602. }
  603. }
  604. /**
  605. * css动画异步
  606. *
  607. */
  608. U.M.AsynCssEM = function (UDID, UDSD, UCB, UIF, UIF) {
  609. this.removeClass(UDID, UIF);
  610. $(UDSD).remove();
  611. (UCB) && (UCB(UIF));
  612. }
  613. /**
  614. * css动画异步
  615. *
  616. * @return {array} 过渡属性的值
  617. */
  618. U.M.JsEM = function (UDOD, UDE, UHK, UTF) {
  619. var i, //遍历初始化
  620. j, //循环初始化
  621. _UCE, //储存字符串
  622. _USE = [], //初始化数组
  623. _UME = {}, //初始化对象
  624. _UM = /[^\d-|.]+/ig, //正则表达式
  625. _UNUM = /[\d-|.]+/ig; //正则表达式
  626. for (i in UDE) {
  627. if (UDE.hasOwnProperty(i)) {
  628. if (i == "style") {//style的制作
  629. _UCE = U.MS.jsonToStr(U.M.JsEM(UDOD[i], UDE[i], UHK, true));
  630. (_UCE.length > 2) && (_UME[i] = { "cssText": _UCE.replace(/["|{|}]+/ig, "").replace(/,/ig, ";") });
  631. }
  632. else {//普通动画
  633. _USE[0] = UDOD[i] || 0; _USE[1] = UDE[i]; for (j = 0; j < _USE.length; j++) {
  634. (typeof _USE[j] != "number") && (_USE[j] = Number(_USE[j].replace(_UM, "")));
  635. } //生成位置
  636. if (!isNaN(_USE[0])) { //动画获取
  637. j = UTF ? U.M.CssTHH(i, true) : i;
  638. _UME[j] = _USE[0] + ((_USE[1] - _USE[0]) * UHK); _USE[1] = UDOD[i] ? UDOD : UDE;
  639. (typeof _USE[1][i] == "string") && (_UME[j] = _USE[1][i].replace(_UNUM, _UME[j]));
  640. }
  641. }
  642. }
  643. }
  644. return _UME;
  645. }
  646. /**
  647. * 获取鼠标位置
  648. *
  649. * @param {element} 相对对象
  650. * @param {element} 进暂无使用行操作的对象
  651. * @return {array} 过渡属性的值
  652. */
  653. U.M.GetMousep = function (UDOD, UDTD) {
  654. var _UE = U.M.GetEvent(), //获取MouseEvent
  655. _UET = (_UE.touches && _UE.touches[0]) ? _UE.touches[0] : _UE, //如果是手机点击则获取touches[0]对象
  656. _UDE = { "X": _UET.clientX || _UET["pageX"] || 0, "Y": _UET.clientY || _UET["pageY"] || 0 }, //储存坐标的对象
  657. _UGE = { BCRL: 0, PXL: 0, BCRT: 0, PXT: 0 }; //用于储存数据sss
  658. (UDTD || UDOD) && (_UGE = UDTD || U.M.TOSP(UDOD, true),
  659. _UGE = U.M.GetElementAllInfo(_UGE)); //获取相对元素的位置
  660. U.Ut.AddObj(_UDE, { "TX": _UGE.BCRL - _UGE.PXL, "TY": _UGE.BCRT - _UGE.PXT }); //获取位置与上级相对位置
  661. U.Ut.AddObj(_UDE, { "X": _UDE["X"] - (_UDE["TX"] || 0), "Y": _UDE["Y"] - (_UDE["TY"] || 0), "MX": _UDE.X, "MY": _UDE.Y }); //设置值
  662. return _UDE;
  663. }
  664. //获取事件源 跨iframe搜索
  665. U.M.GetEvent = function () {
  666. var i, //循环初始化
  667. _UDOD, //用于储存数据
  668. _UDFD = window.frames; //获取window.frames
  669. var _UE = window.event; //获取window.event
  670. if (!_UE) {
  671. for (i = 0; i < _UDFD.length; i++) { //循环所有的iframe 获取事件源
  672. _UDOD = _UDFD[i];
  673. try {
  674. _UE = _UDOD.event;
  675. if (_UE) { break; }
  676. }
  677. catch (e) { continue; };
  678. }
  679. }
  680. return _UE;
  681. }
  682. /**
  683. * 阻止冒泡
  684. */
  685. U.M.StopBubble = function () {
  686. var _UE = U.M.GetEvent(); //获取Event
  687. if (_UE) {
  688. if (_UE.stopPropagation) { _UE.stopPropagation(); } // 停止DOM事件层次传播
  689. else { _UE.cancelBubble = true; } //停止向上冒泡传播
  690. return true;
  691. }
  692. }
  693. /**
  694. * 动画初始化
  695. *
  696. * @param {object} 动画设置对象
  697. */
  698. U.M.Animation = function (UDE) { //基础对象
  699. return new U.M.Animation.init(UDE, U.M.Animation.get());
  700. }
  701. U.M.Animation.get = function () {
  702. var i, j, //循环变量
  703. _UFE,
  704. _UDE = [["r", "cancel"], ["", "moz", "webkit", "o"]]; //兼容
  705. //获取兼容字符串
  706. for (i = 0; i < _UDE[0].length; i++) {
  707. for (j = 0; j < _UDE[1].length; j++) {
  708. if (_UFE = window[_UDE[1][j] + (j ? _UDE[0][i].replace(/\b(\w)|\s(\w)/g, function (e) { //通过循环和获取 每次获取的时候利用首字母大写设置
  709. return e.toUpperCase();
  710. }) : _UDE[0][i]) + "AnimationFrame"]) { _UDE[0][i] = _UFE; break; };
  711. }
  712. }
  713. _UDE = _UDE[0];
  714. (typeof _UDE[0] == "string") && (_UDE[0] = _UDE[1] = null);
  715. return _UDE;
  716. }
  717. /**
  718. * 获取鼠标位置
  719. *
  720. * @param {object} 对象
  721. */
  722. U.M.Animation.init = function (UDE, USE) {//动画初始化
  723. U.Ut.AddObj(this, UDE); //添加动画对象
  724. this.type = USE || U.M.Animation.get();
  725. this.sm = (USE && USE[0]) ? new Date() : Math.ceil(this.ti / 20); //动画开始的时间
  726. this.start(USE); //开始动画
  727. }
  728. //动画方法
  729. U.M.Animation.init.prototype = {
  730. start: function (USE) {//这里开始了动画
  731. var _UFN = (USE || this.type)[0];
  732. this.tm = (_UFN ? _UFN(U.M.apply(this, this.time)) : window.setInterval(U.M.apply(this, [[this.time, [true]]]), 20)); //动画使用开始
  733. },
  734. time: function (UTF) {//动画运行
  735. var _UTI, _UJT, _UST;
  736. if (UTF == true) { //普通计时器动画
  737. _UTI = 20 / this.ti;
  738. (this.ti <= 0) && (this.stop(), _UTI = null);
  739. this.cb(_UTI); this.ti -= 20;
  740. }
  741. else {//利用重绘动画使用
  742. _UTI = new Date(); //据偶去当前的时间
  743. _UJT = _UTI - this.sm;
  744. _UST = _UJT / this.ti;
  745. this.sm = _UTI; //时间的变化
  746. this.ti -= _UJT; //总时间的减少
  747. (this.ti <= 0) && (_UST = null, this.stop()); //调用停止函数
  748. (_UST !== 0) && (this.cb(_UST)); //结束的回调
  749. (_UST !== null) && (this.start()); //重复调用
  750. }
  751. },
  752. stop: function () {//动画结束
  753. (this.type[1] || window.clearInterval)(this.tm);
  754. }
  755. }
  756. /**
  757. * 执行mouseout mouseover不冒泡情况
  758. *
  759. * @param {element} 需要执行的元素
  760. */
  761. U.M.mouseLE = function (UCB) {
  762. if (!U.M.onmouseout(this)) { UCB(); }
  763. }
  764. /**
  765. * mouseout||mouseover 冒泡解决
  766. *
  767. * @param {element} 需要执行的元素
  768. * @return {boolean} 是否是冒泡元素
  769. */
  770. U.M.onmouseout = function (UDOD) {
  771. if (event && "mouseover,mouseout".indexOf(event.type) > -1) { //判断事件源
  772. var _UDTD = (event.type == "mouseover" ? event.fromElement : event.toElement) || event.relatedTarget; //事件对象
  773. return U.M.EISE(UDOD, _UDTD); //判断是否在该元素下
  774. }
  775. return false;
  776. }
  777. /**
  778. * resize变化处理 包含了resizestart endresize 由于resize会出发多次 所有这里可分为 start 和 end
  779. *
  780. * @param {object} resize对象
  781. */
  782. U.M.resize = function (UDE) {
  783. var _UGE = new U.M.resize.init(UDE); //初始化监视
  784. return U.M.apply(_UGE, _UGE.exec); //设置执行的方式
  785. }
  786. //resize方法函数
  787. U.M.resize.init = function (UDE) {
  788. U.Ut.AddObj(this, this.u = UDE); //添加事件监视
  789. }
  790. //resize方法
  791. U.M.resize.init.prototype = {
  792. exec: function () { //执行resize处理
  793. this.start(); //onresize回调处理
  794. (this.ti) && (clearTimeout(this.ti)); //取消end监视
  795. this.ti = setTimeout(U.M.apply(this, this.end), 0); //end处理
  796. (U.Ut.isFunction(this.u)) && (this.u()); //end事件等待
  797. },
  798. start: function () {
  799. this.iss = true; //设置已经start
  800. (!this.iss && this.s) && (this.s()); //函数回调
  801. },
  802. end: function () {
  803. this.iss = false; //end结束
  804. (this.e) && (this.e()); //resizeend处理
  805. }
  806. }
  807. /**
  808. * 阻止浏览器的默认行为,例如右键菜单,左键选择
  809. *
  810. */
  811. U.M.StopDefault = function () {
  812. var _UE = _UE || window.event; //获取window.event对象
  813. if (_UE) {
  814. if (document.all) { _UE.returnValue = false; } //IE中阻止函数器默认动作的方式
  815. else { _UE.preventDefault(); } //阻止默认浏览器动作(W3C)
  816. return false;
  817. }
  818. }
  819. /**
  820. * 当你点击enter键时触发的函数
  821. *
  822. * @param {object} resize对象
  823. */
  824. U.M.returnkeylogin = function (UEL, UFN) {
  825. var i; //循环初始化
  826. if (event.keyCode == 13 || event.keyCode == 10) {
  827. if (UFN) {//执行函数
  828. U.M.apply(UEL || this, UFN)();
  829. }
  830. else if (UEL) {//元素触发使用
  831. for (i = 0; i < UEL.length; i++) {
  832. UEL[i]["obj"][UEL[i]["event"]]();
  833. }
  834. }
  835. U.M.StopDefault(); //阻止浏览器默认事件
  836. }
  837. }
  838. /**
  839. * 自动触发HTMLElement事件 Mouse事件
  840. *
  841. * @param {element} 触发的元素
  842. * @param {string} 事件类型
  843. * @return {object} resize对象
  844. */
  845. U.M.IEVENT = function (UDOD, UTF) {
  846. if (UDOD.fireEvent) { return UDOD.fireEvent("on" + UTF, window.event); } //触发事件 //注销原事件源
  847. else if (document.createEvent) {
  848. var _UE = document.createEvent("MouseEvents"), _UEV = window.event; //创建事件事件
  849. _UEV ? _UE.initMouseEvent(UTF, true, true, window, _UEV.detail, _UEV.screenX, _UEV.screenY, _UEV.clientX, _UEV.clientY, _UEV.ctrlKey, _UEV.altKey, _UEV.shiftKey,
  850. _UEV.metaKey, _UEV.button, _UEV.relatedTarget) : _UE.initMouseEvent(UTF, true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, UDOD); //初始化事件
  851. return UDOD.dispatchEvent(_UE); //分发事件
  852. }
  853. }
  854. /**
  855. * 自动触发HTMLElement Touch事件
  856. *
  857. * @param {element} 触发的元素
  858. * @param {string} 事件类型
  859. * @return {object} resize对象
  860. */
  861. U.M.TouchE = function (UDOD, UTF, UDE) {
  862. if (UDOD.fireEvent) { UDOD.fireEvent("on" + TF); } //ie事件触发处理
  863. else if (document.createEvent) { //h5事件处理
  864. var i, _USE,
  865. _UEV = UDE || window.event,
  866. _UE = TouchEvent ? new TouchEvent(UTF, _UEV) : document.createEvent("TouchEvent"), //创建一个touch时间的处理
  867. //获取当前touch事件
  868. _UTF = _UE.initTouchEvent ? "initTouchEvent" : "initEvent";
  869. //chrome
  870. _USE = [
  871. //chrome
  872. [event.touches,
  873. event.targetTouches,
  874. event.changedTouches,
  875. UTF,
  876. event.view,
  877. event.screenX,
  878. event.screenY,
  879. event.clientX,
  880. event.clientY,
  881. event.ctrlKey,
  882. event.alrKey,
  883. event.shiftKey,
  884. event.metaKey],
  885. //safari
  886. [UTF,
  887. true,
  888. event.cancelable,
  889. event.view,
  890. event.detail,
  891. event.screenX,
  892. event.screenY,
  893. event.clientX,
  894. event.clientY,
  895. event.ctrlKey,
  896. event.altKey,
  897. event.shiftKey,
  898. event.metaKey,
  899. event.touches,
  900. event.targetTouches,
  901. event.changedTouches,
  902. event.scale,
  903. event.rotation
  904. ],
  905. //firefox
  906. [UTF,
  907. true,
  908. event.cancelable,
  909. event.view,
  910. event.detail,
  911. event.ctrlKey,
  912. event.altKey,
  913. event.shiftKey,
  914. event.metaKey,
  915. event.touches,
  916. event.targetTouches,
  917. event.changedTouches],
  918. ];
  919. for (i = 0; i < _USE.length; i++) {
  920. try { _UE[_UTF].apply(_UE, _USE[i]); }
  921. catch (e) { }
  922. if (_UE.type == UTF) { break; }
  923. }
  924. }
  925. return UDOD.dispatchEvent(_UE); //分发事件
  926. }
  927. /**
  928. * 注册函数事件 Internet Explorer 8 及更早IE版本不支持 addEventListener() 方法,,Opera 7.0 及 Opera 更早版本也不支持。 但是,对于这些不支持该函数的浏览器,你可以使用 attachEvent() 方法来添加事件句柄
  929. *
  930. * @param {string} 事件名称
  931. * @param {element} 添加事件的元素
  932. * @param {function} 事件触发后调用的函数
  933. * @param {string} 指定事件是否在捕获或冒泡阶段执行
  934. */
  935. U.M.AddEvent = function (UTP, UDOD, UCB, UTF) {
  936. if (UDOD.addEventListener) { //非IE使用
  937. UDOD.addEventListener(UTP, UCB, UTF || false);
  938. }
  939. else if (UDOD.attachEvent) { //IE
  940. UDOD.attachEvent("on" + UTP, UCB);
  941. }
  942. else {//html5处理
  943. UDOD["on" + UTP] = U.M.apply(UDOD, [[UDOD["on" + UTP]], [UCB]]);
  944. }
  945. }
  946. /**
  947. * 取消函数事件
  948. *
  949. * @param {string} 事件名称
  950. * @param {element} 添加事件的元素
  951. * @param {function} 事件触发后调用的函数
  952. * @param {string} 指定事件是否在捕获或冒泡阶段执行
  953. */
  954. U.M.ReEvent = function (UTP, UDOD, UCB, UTF) {
  955. if (UCB) {
  956. UCB = UCB[0] || UCB; //绑定函数默认
  957. if (UDOD.removeEventListener) { //非IE使用
  958. UDOD.removeEventListener(UTP, UCB, UTF || false);
  959. }
  960. else if (UDOD.detachEvent) {//IE使用
  961. UDOD.detachEvent("on" + UTP, UCB);
  962. }
  963. else { UDOD["on" + UTP] = null; } //非元素
  964. }
  965. }
  966. /**
  967. * 对象转化成数组
  968. *
  969. * @param {object} 需要转换成数组的对象
  970. * @return {string} 指定事件是否在捕获或冒泡阶段执行
  971. */
  972. U.M.toArray = function (UDE) {
  973. try {
  974. return Array.prototype.slice.call(UDE);
  975. }
  976. catch (e) {
  977. var i = 0, _UCE = []; //循环创建
  978. for (; UDE[i]; i++) {
  979. _UCE.push(UDE[i]);
  980. }
  981. return _UCE;
  982. }
  983. }
  984. /**
  985. * 屏调ie菜单
  986. *
  987. * @param {object} 需要转换成数组的对象
  988. */
  989. U.M.ShieldedRightAndSelect = function () {
  990. if (window.print) { //判断是否有右键菜单
  991. document.oncontextmenu = U.M.StopDefault; //阻止桌面右键默认菜单
  992. document.onselectstart = function () { //禁止元素选择文字
  993. var _UDOD = U.M.GetDE(event.srcElement), //获取一个可编辑元素
  994. _UTF = !(_UDOD && ((_UDOD.nodeType == 3 || (_UDOD.contentEditable == "true"))) || ((("textarea,input".indexOf(_UDOD.tagName.toLocaleLowerCase()) > -1))));
  995. (_UTF) && (U.M.StopBubble(), U.M.StopDefault());
  996. return (!_UTF);
  997. }
  998. var _UDE = function () {
  999. if (event.keyCode == 8) { //禁止后退网页
  1000. if (U.M.GetDE((event.srcElement)) == document.body && !document.body.isContentEditable) { //不允许按下后台键
  1001. U.M.StopDefault();
  1002. }
  1003. }
  1004. (U.M[event.type]) && (U.M[event.type]()); //判断是否具有事件处理
  1005. };
  1006. U.M.AddEvent("keydown", document, _UDE); //设置键盘事件处理
  1007. U.M.AddEvent("keyup", document, _UDE); //设置键盘事件处理
  1008. }
  1009. }
  1010. /**
  1011. * 统一处理函数,解决闭包添加事件的问题
  1012. * 使用apply,把事件与属性添加到对象上,而不是添加到window顶级对象。使用apply而不是call,是因为apply第二个参数可以传递参数数组,代码更少。
  1013. * 调用方法 U.M.apply(this,'执行函数的事件') 例如 U.M.apply(this,'this.style.display="none"');
  1014. *
  1015. * @param {object} 将要绑定事件与属性的对象,如没有,可以传递null或者this,此处还需要优化,很多地方都会调用此函数,会导致速度降低。
  1016. * @param {object} 时间和属性组成的参数数组。
  1017. */
  1018. U.M.apply = function (retElement, UDE) {
  1019. //retElement 将要绑定事件与属性的对象,如没有,可以传递null或者this,此处还需要优化,很多地方都会调用此函数,会导致速度降低。
  1020. //UDE 时间和属性组成的参数数组
  1021. return function () {
  1022. if (UDE) {
  1023. var i, //循环初始化
  1024. j, //循环初始化
  1025. _URE,
  1026. _UAE,
  1027. _UTE = (retElement) || this,
  1028. _UME = Array.prototype.slice.apply(arguments); //arguments 转化成数组
  1029. if (typeof UDE == "string") { _URE = (new Function(UDE)).apply(_UTE, _UME); }
  1030. else if (typeof UDE == "function") { _URE = UDE.apply(_UTE, _UME); }
  1031. else {
  1032. for (i = 0; i < UDE.length; i++) {
  1033. if (UDE[i] && UDE[i][0]) { //函数存在
  1034. _UAE = UDE[i][1];
  1035. (!_UAE) && (_UAE = []);
  1036. (!U.Ut.isEvent(_UME[0]) || _UME.length > 1) && (_UAE = _UAE.concat(_UME)); //event == null ||
  1037. //循环添加至
  1038. for (j = 0; j < _UAE.length; j++) {
  1039. if (typeof _UAE[j] == "string") {
  1040. try {
  1041. if (_UAE[j].indexOf("this") > -1 || _UAE[j].indexOf("retElement") > -1 || _UAE[j].indexOf("event") > -1) { _UAE[j] = eval("0,(" + _UAE[j] + ")"); } //制定参数解析
  1042. else if (U.MS.Num.test(_UAE[j])) { _UAE[j] = Number(_UAE[j]); } //数字转化
  1043. } catch (e) { U.M.Console(e); }
  1044. }
  1045. }
  1046. try {
  1047. if (U.Ut.isString(UDE[i][0])) {
  1048. _URE = eval(UDE[i][0]).apply(_UTE, _UAE); //eval效率不高 特殊情况才用
  1049. }
  1050. else if (U.Ut.isFunction(UDE[i][0])) { _URE = UDE[i][0].apply(_UTE, _UAE); }
  1051. }
  1052. catch (e) { U.M.Console(e); } //函数执行错误
  1053. }
  1054. }
  1055. }
  1056. return _URE;
  1057. }
  1058. //直接掉U.M.apply(),不传递UDE参数时,返回false。
  1059. else { return false; }
  1060. }
  1061. }
  1062. /**
  1063. * 图片错误处理
  1064. *
  1065. * @param {element} 图片元素
  1066. * @param {number} 判断的类型
  1067. */
  1068. U.M.ImgError = function (UDOD, UTF) {
  1069. var _UIE, //存放参数
  1070. _UURL, //存放图片的src
  1071. UDOD = UDOD && !UDOD.srcElement ? UDOD : (event ? event.srcElement || this : this); //获取出错的对象
  1072. if (UDOD.src != "/img/error.png") { //如果是错误图片就不执行
  1073. if (UTF == 2) { //重复请求图片 用于初始上传的图片
  1074. _UURL = UDOD.src; //图片的路径
  1075. _UIE = _UURL.indexOf("?&n="); //判断是否添加获取
  1076. if (_UIE < 0 || _UURL.length - _UIE < 10) {
  1077. UDOD.src += (_UIE == -1 ? "?&n=" : "") + 1; //添加缓存过滤
  1078. return
  1079. }
  1080. else {
  1081. UTF = 1;
  1082. }
  1083. }
  1084. if (UTF == 1) { //错误图像处理
  1085. $(UDOD).addAttrArray({ "src": "/img/error.png", "width": "111px", "height": "111px" });
  1086. }
  1087. else { //错误头像处理
  1088. UDOD.src = UTF || "/img/UserHead/UseHead.jpg";
  1089. }
  1090. }
  1091. }
  1092. /**
  1093. * 获取头像图片的正确地址
  1094. *
  1095. * @param {string} 需要生成正常地址的 由于1473的地址 需要带上 http://fs.1473.cn 无需 这里同时处理了 1473和外链地址
  1096. * @return {string} 过滤过的
  1097. */
  1098. U.M.GetImgU = function (url) {
  1099. return (!url ? "/img/UserHead/UseHead.jpg" : !url.indexOf("http") ? url : ((url.indexOf("www.1473.cn") > -1 ? url : US.fs + url.replace(new RegExp(US.fs, "gm"), ""))));
  1100. }
  1101. /**
  1102. * 判断是否支持播放
  1103. *
  1104. * @param {string} 指定的格式
  1105. * @return {number} 是否支持改格式播放
  1106. -----------[0] 不支持
  1107. -----------[1] 支持
  1108. */
  1109. U.M.isPlay = function (UTP) {
  1110. var _UDE = U.PL.vi(); //获取h5视频播放对象
  1111. if (_UDE) {
  1112. if (_UDE.isPlay(UTP, $$("video"))) {
  1113. return 1;
  1114. };
  1115. return 0;
  1116. }
  1117. return _UDE;
  1118. }
  1119. /**
  1120. * 图片预加载方法
  1121. *
  1122. * @param {string} 需要加载的图片地址
  1123. * @param {function} 预加载回调函数
  1124. * @param {function} 加载成功回调
  1125. * @param {function} 错误处理回调
  1126. * @return {element} 图片元素
  1127. */
  1128. U.M.imgReady = function (url, URD, ULD, UE) {
  1129. var _UW,
  1130. _UH,
  1131. _UNW, //image对象的width属性
  1132. _UNH, //image对象的height属性
  1133. _UIMG = new Image(); //image对象
  1134. _UOR = function () { //预加载
  1135. _UIMG = _UIMG || this;
  1136. _UNW = _UIMG.width;
  1137. _UNH = _UIMG.height; //获取加载图片的长宽
  1138. if ((_UNW !== _UW || _UNH !== _UH) || _UNH !== 0) {
  1139. (URD) && (URD.call(_UIMG));
  1140. _UOR.end = true;
  1141. }
  1142. };
  1143. $(_UIMG).addAttrArray({ "src": url,
  1144. "onload": function () { //成功加载回调
  1145. setTimeout(function () {
  1146. !_UOR.end && _UOR(); (_UIMG) && (_UIMG.onload = _UIMG.onerror = null);
  1147. (_UIMG && ULD) && (ULD.call(_UIMG));
  1148. _UIMG = null;
  1149. }, 0);
  1150. },
  1151. "onerror": function () { //错误图片处理
  1152. if (U.M.IsNetwork()) {
  1153. UE && UE.call(_UIMG);
  1154. }
  1155. }
  1156. });
  1157. if (_UIMG) { //说明图片还在加载中
  1158. _UOR(); //执行预加载处理
  1159. if (_UIMG.complete == true) { //判断是否已经成功加载过了 缓存图片处理
  1160. _UIMG.onload(); return;
  1161. }
  1162. }
  1163. if (!_UOR.end) { //添加进入图片大小加载事件
  1164. U.M.imgReady._UL.push(_UOR);
  1165. if (U.M.imgReady._UIT == null) {
  1166. U.M.imgReady._UIT = setInterval(U.M.imgReady._URT, 40); //每40毫秒进入
  1167. }
  1168. }
  1169. return _UIMG;
  1170. }
  1171. U.M.imgReady._UIT; //计时器初始化
  1172. U.M.imgReady._UL = []; //需要预加载的图片集
  1173. //去除预加载计时
  1174. U.M.imgReady._US = function () {
  1175. clearInterval(U.M.imgReady._UIT);
  1176. U.M.imgReady._UIT = null;
  1177. };
  1178. //计时加载逐个加载处理
  1179. U.M.imgReady._URT = function () {
  1180. for (var i = 0; i < U.M.imgReady._UL.length; i++) {
  1181. U.M.imgReady._UL[i].end ? U.M.imgReady._UL.splice(i--, 1) : U.M.imgReady._UL[i]();
  1182. }
  1183. !U.M.imgReady._UL.length && U.M.imgReady._US();
  1184. }
  1185. /**
  1186. * 滚动条滚动到制定的位置
  1187. *
  1188. * @param {string} 指定scrollTop的数值
  1189. * @param {function} 需要调整滚动条位置的对象
  1190. * @param {function} 加载成功回调
  1191. * @return {element} 图片元素
  1192. */
  1193. U.M.SCT = function (UT, UDOD, UTF) {
  1194. var _UTP = U.Ut.isNumber(UT); //判断UT是否是数字true 或者 false
  1195. if (_UTP && UTF) {
  1196. $(UDOD).animate({ "scrollTop": UT }, UTF);
  1197. } //动画移动具体的位置
  1198. else {
  1199. if (typeof UT == "number") {
  1200. UDOD.scrollTop = UT;
  1201. }
  1202. else { UT.scrollIntoView(); }
  1203. } //直接移动过
  1204. }
  1205. /**
  1206. * 获取url参数
  1207. *
  1208. * @param {string} QueryString key
  1209. * @param {string} QueryString 默认为window.document.location.search ,可以自己选择字符串进行拆分
  1210. * @return {string} 获取key对应的值
  1211. */
  1212. U.M.QueryString = function (UK, USE) {
  1213. //UK 获取url的key
  1214. var i, //循环初始化
  1215. j, //循环初始化
  1216. _UV, //储存值的数组
  1217. _USV = "", //作为返回值
  1218. _USE = (USE || window.document.location.search).substr(1), //获取传参
  1219. _UTV = _USE.split("&"); //生成传参数组
  1220. if (!UK) { //判断是否传入key
  1221. return _UTV;
  1222. }
  1223. for (i = 0; i < _UTV.length; i++) { //循环传参数组获取值
  1224. _UV = _UTV[i].split("=");
  1225. if (_UV[0].toUpperCase() == UK.toUpperCase()) { //判断key是否相等
  1226. for (j = 1; j < _UV.length; j++) { //返回值
  1227. _USV += _UV[j] + (j == _UV.length - 1 ? "" : "=");
  1228. }
  1229. break;
  1230. }
  1231. }
  1232. return _USV;
  1233. }
  1234. /**
  1235. * 获取用户获取的地址
  1236. *
  1237. */
  1238. U.M.GetUF = function () {
  1239. var _UURL = document.location.hash; //地址传参
  1240. return _UURL.split("/");
  1241. }
  1242. /**
  1243. * 页面活动监视,当用户离开页面休息时,停止页面活动(计时器)
  1244. *
  1245. * @param {function} 页面聚焦回调函数
  1246. * @param {function} 页面非聚焦回调函数
  1247. * @return {string} 获取key对应的值
  1248. */
  1249. U.M.IsActivity = function (UOE, UTE) {
  1250. if (UOE) {
  1251. //鼠标在当前body上 说明现在是活动 \(\[(\s*[a-z]+\s*(,\s*[a-z]+\s*)*)\]\) \({\[+[\w]+\]}\)
  1252. $(document.body).mouseenter(U.M.apply(null, [[U.M.IsActivity.UFC, [UOE]]]));
  1253. U.M.AddEvent("focusin", document, U.M.apply(null, [[U.M.IsActivity.UFC, [UOE]]])); //页面聚焦同时为活动页面
  1254. }
  1255. if (UTE) {
  1256. U.M.AddEvent("focusout", document, U.M.apply(null, [[U.M.IsActivity.UBC, [UTE]]])); //页面休眠中
  1257. }
  1258. }
  1259. U.M.IsActivity.UTF; //页面变化变量
  1260. /**
  1261. * 页面活动监视
  1262. *
  1263. * @param {function} 页面聚焦回调函数
  1264. */
  1265. U.M.IsActivity.UFC = function (UCB) {
  1266. (!U.M.IsActivity.UTF) && (U.M.IsActivity.UTF = true, UCB());
  1267. }
  1268. /**
  1269. * 离开页面休眠
  1270. *
  1271. * @param {function} 页面非聚焦回调函数
  1272. */
  1273. U.M.IsActivity.UBC = function (UCB) {
  1274. var _UDTD,
  1275. _UX = event.clientX, //页面x坐标
  1276. _UY = event.clientY; //获取event对象的y坐标
  1277. if ((!browser.msie || ((_UX < 0 || _UX > US.Width || _UY < 0 || _UY > US.Height))) && U.M.IsActivity.UTF) { //判断鼠标不在页面中
  1278. U.M.IsActivity.UTF = false;
  1279. UCB();
  1280. }
  1281. }
  1282. /**
  1283. * cookie解决方案
  1284. *
  1285. */
  1286. U.M.Cookies = {};
  1287. /**
  1288. *在iframe中调用此函数,会把主页的cookie传递到子域, 跨域加载cookie,1473子域用,其他跨域不能用,为了兼容ie6,ie7,暂时未用。
  1289. *
  1290. * @param {string} 跨域的url
  1291. * @param {function} 成功记载后的回调函数
  1292. */
  1293. U.M.Cookies.crossdomain = function (url, cb) {
  1294. U.MD.DynamicLoad(url, "js", cb, null, true);
  1295. //U.MD.DynamicLoad("/uform.js", "js", cb, null, true);
  1296. }
  1297. /**
  1298. *1473cookie格式专用
  1299. * 把形如:"userid=72854d28-f45c-48d7-92b7-3cd933e03022&username=13928417148&Loginid=fd02976d-993b-4437-bbd9-5efa99802c8f&UserStamp=1364812396"的cookie转换为json对象。函数名有问题。
  1300. 得到的形式为:_UAE.Loginid可得到用户id。
  1301. *
  1302. * @param {string} 获取cookie的key对应的值 如usestudio=aa=ff&ss=aa 的usestudio里的 aa=ff&ss=aa
  1303. * @return {object} {key:[value1,value2]}
  1304. */
  1305. U.M.Cookies.getarray = function (key) { //获取cookie
  1306. var i, //循环初始化
  1307. _UAE = {}, //初始化对象 作为返回值
  1308. _UCE = U.M.GetCookie("usestudiosso"); //获取用户指定的Cookie值
  1309. if (_UCE) { //是否存在
  1310. _UCE = _UCE.split("&");
  1311. for (i = 0; i < _UCE.length; i++) { //循环对应的值
  1312. _UCE[i] = _UCE[i].split("="); //切分key和value
  1313. //如果定义了cookie值的接受数组,则不再重复定义。_UCE[i][0]相当于key,例如userid
  1314. if (!_UAE[_UCE[i][0]]) {
  1315. _UAE[_UCE[i][0]] = [];
  1316. }
  1317. _UAE[_UCE[i][0]].push(decodeURIComponent(_UCE[i][1])); //生成{key:[value1,value2]}
  1318. }
  1319. }
  1320. return _UAE;
  1321. }
  1322. /**
  1323. * 设置cookie
  1324. *
  1325. * @param {string || object} cookie 字符串或者cookie集合。参见例一,例三。
  1326. *
  1327. * @param {object} cookie 的key
  1328. ----------path: null, //cookie地址
  1329. ----------domain: null, //cookie域
  1330. ----------expires: 365, //cookie过期时间
  1331. ----------secure: null //cookie来源
  1332. * @return {string}
  1333. *例一:U.M.Cookies.set("usestudiossso=UserId=aa&UserName=zhangsan");net java模式
  1334. *例二:U.M.Cookies.set("15hulianwang=userid=123456&username=zhangsan");net java模式
  1335. *例三:U.M.Cookies.set({15hulianwang:{userid:123456,username:'zhangsan'}});nodejs模式
  1336. */
  1337. U.M.Cookies.set = function (UKE, UDE) {
  1338. var i, //循环初始化
  1339. j, //循环初始化
  1340. k = 0, //用于计数
  1341. _UST = ""; //最终的cookie字符串
  1342. //如果UKE是字符串,则直接设置cookie,如果为集合,则转换为字符串进行处理。
  1343. if (U.Ut.isString(UKE)) {//判断设置的是否是字符串
  1344. _UST = UKE; document.cookie = this.setpn(UDE, _UST); //直接设置
  1345. }
  1346. //以下没有检验,用于nodejs的集合类cookie
  1347. else {
  1348. for (i in UKE) {
  1349. _UST = i + "=";
  1350. for (j in UKE[i]) {
  1351. //把集合拆分成字符串。
  1352. //如果k>0,则添加&号分割符
  1353. if (k > 0) {
  1354. _UST += "&";
  1355. }
  1356. _UST += j + "=" + encodeURIComponent(UKE[i][j]);
  1357. k++;
  1358. }
  1359. //
  1360. document.cookie = this.setpn(UDE, _UST);
  1361. }
  1362. }
  1363. return (document.cookie);
  1364. }
  1365. /**
  1366. * 设置指定参数(添加)
  1367. *
  1368. * @param {object} cookie 的key
  1369. ----------path: null, //cookie地址
  1370. ----------domain: null, //cookie域
  1371. ----------expires: 365, //cookie过期时间
  1372. ----------secure: null //cookie来源
  1373. * @param {string} 需要写入的cookie usestudio=aa=cc
  1374. * @return {string} 返回写入的cookie值
  1375. */
  1376. U.M.Cookies.setpn = function (UDE, UST) {
  1377. var _UCE = {
  1378. path: "/", //cookie地址
  1379. domain: document.domain, //cookie域
  1380. expires: 365, //cookie过期时间
  1381. secure: null //cookie来源
  1382. };
  1383. //一般不传递第二个参数,这里为空会报错,所以转换为集合
  1384. UDE = UDE || {};
  1385. for (i in _UCE) { //循环设置
  1386. //不去找原型,直接找_UCE中定义的变量和方法
  1387. if (i == "expires" && (UDE[i] || _UCE[i])) { //时间过期处理
  1388. _UKE = new Date();
  1389. //如果用户设置了时间,则用用户的时间,否则默认过期时间为一年
  1390. var _etime = (UDE[i] || _UCE[i]) * 24 * 60 * 60 * 1000;
  1391. _UKE.setTime(_UKE.getTime() + _etime); //时间变化处理
  1392. UDE[i] = _UKE.toUTCString();
  1393. }
  1394. //判断是否设置cookie属性,如果用户不设置,系统默认为null,则不设置,例如secure: null
  1395. if (UDE[i] || _UCE[i]) {
  1396. var _pj;
  1397. //如果用户设置属性为null,则用系统的,否则用用户设置的属性
  1398. if (UDE[i] == null) {
  1399. _pj = _UCE[i];
  1400. }
  1401. else {
  1402. _pj = UDE[i];
  1403. }
  1404. //拼接cookie。
  1405. UST += "; " + i + "=" + _pj; //添加cookie
  1406. }
  1407. };
  1408. return UST; //返回cookie
  1409. }
  1410. /**
  1411. * 移除cookie(删除)
  1412. *
  1413. * @param {string} cookie 的key
  1414. * @return {string}
  1415. */
  1416. U.M.Cookies.del = function (key) {
  1417. var i, _UAE, _UST = "",
  1418. _UCE = document.cookie.split("; "); //cookie值
  1419. //过滤指定的cookie值
  1420. for (i = 0; i < _UCE.length; i++) {
  1421. _UAE = _UCE[i].split("=");
  1422. //如果符合用户传递的cookie的key值,则转换为字符串
  1423. if (!key || _UAE[0] == key) {
  1424. //多cookie情况下,用分号分割,否则不分割
  1425. var _cut = _UST.length ? "; " : "";
  1426. _UST += _cut + _UAE[0] + "=";
  1427. }
  1428. }
  1429. //删除指定的cookie
  1430. if (_UST) {
  1431. U.M.Cookies.set(_UST, { expires: -1 });
  1432. }
  1433. else {
  1434. console.log("not found cookie!");
  1435. }
  1436. }
  1437. /**
  1438. * 功能:获取用户指定的Cookie值
  1439. 描述:浏览器cookie形如:"pgv_pvid=3156364456; usestudiosso=userid=72854d28-f45c-48d7-92b7-3cd933e03022&username=13928417148&Loginid=fd02976d-993b-4437-bbd9-5efa99802c8f&UserStamp=1364812396; __qc_wId=563; amvid=319501000bca68c1adab006842344f44"
  1440. 第一步:根据分号拆分成数组.
  1441. 第二部:按照"="拆分
  1442. 第三部:找到"usestudiosso",usestudiosso=userid=72854d28-f45c-48d7-92b7-3cd933e03022&username=13928417148&Loginid=fd02976d-993b-4437-bbd9-5efa99802c8f&UserStamp=1364812396
  1443. 第四步:去掉"usestudiosso",得到userid=72854d28-f45c-48d7-92b7-3cd933e03022&username=13928417148&Loginid=fd02976d-993b-4437-bbd9-5efa99802c8f&UserStamp=1364812396
  1444. 参数一:UKY为cookie名字,云端cookie名为:"usestudiosso"
  1445. *
  1446. * @param {string} 获取cookie的key对应的值 如usestudio=aa=ff&ss=aa 的usestudio里的 aa=ff&ss=aa
  1447. * @param {string} aa=ff&ss=aa里面的aa对应的值 [ff]
  1448. * @return {string, array} 上述参数里说明返回
  1449. ---------第二个参数不存在的时候返回string
  1450. ---------第二个参数存在的时候返回array
  1451. */
  1452. U.M.GetCookie = U.M.Cookies.get = function (UKY, UKN) {
  1453. var i, //循环初始化
  1454. _UAT, //储存字符串的数组
  1455. _UTV = "",
  1456. _UCK = (document.cookie || document.wincookie || "").split("; "); //从cookie中获取指定的cookie集
  1457. for (i = 0; i < _UCK.length; i++) {
  1458. _UAT = _UCK[i].split("=");
  1459. //如果找到名为"usestudiosso"的cookie,则
  1460. if (_UAT[0] == UKY) {
  1461. _UAT.splice(0, 1);
  1462. _UTV = _UAT.join("=");
  1463. break;
  1464. } //生成指定的Cookie
  1465. }
  1466. if (UKN) {//从指定的cookie集里获取cookie值
  1467. _UCK = _UTV.split("&");
  1468. _UTV = [];
  1469. for (i = 0; i < _UCK.length; i++) {
  1470. _UAT = _UCK[i].split("=");
  1471. if (_UAT[0] == UKN) { _UTV.push(decodeURIComponent(_UAT[1])); } //获取指定的cookie值
  1472. else if (_UAT[1] == UKN) { return true; } //判断是否是指定的cookie存在
  1473. }
  1474. }
  1475. return (_UTV.length ? _UTV : false);
  1476. }
  1477. /**
  1478. * 判断Url是否合法
  1479. *
  1480. * @param {string} url值
  1481. * @return {boolean} 是否盒饭的url
  1482. */
  1483. U.M.IsUrl = function (url) {
  1484. if (U.Ut.isString(url)) {
  1485. var _UDAD, //新建a标签
  1486. _UTF = false; //boolean值
  1487. url = ((url.indexOf("://") > 0 ? "" : "http://") + url);
  1488. if (U.MS.Url.test(url)) { //正则判断是否是有效的url
  1489. _UDAD = $$("a", { "href": url });
  1490. _UTF = _UDAD.href ? url : false; //a标签判断 indexOf(url) == 0
  1491. }
  1492. return _UTF;
  1493. }
  1494. }
  1495. /**
  1496. * 获取url
  1497. *
  1498. * @param {string} url值
  1499. * @return {object} 返回url对象
  1500. ----------[host] 返回域的地址
  1501. ----------[search] 返回search
  1502. */
  1503. U.M.getUrl = function (url) {
  1504. //UURL url
  1505. var _UDAD = $$("a", { "href": url }); //新建a标签
  1506. return { "host": _UDAD.href.replace(_UDAD.search, ""), "search": _UDAD.search };
  1507. }
  1508. /**
  1509. * iframe写入数据
  1510. *
  1511. * @param {element} iframe
  1512. * @param {string} 写入iframe的值
  1513. * @param {function} 成功的回调函数
  1514. * @return {element} 返回iframe
  1515. */
  1516. U.M.IFO = function (UIF, UHT, UCB) {
  1517. U.MD.IframeLoad(UIF, [[U.M.AsynIFO, [UIF, UHT, UCB]]]); //设置回调
  1518. UIF.src = "javascript:void((function(){document.open();document.domain='" + document.domain + "';document.close()})())"; //添加链接 "about:blank";
  1519. return UIF;
  1520. }
  1521. /**
  1522. * iframe异步处理
  1523. *
  1524. * @param {element} iframe
  1525. * @param {string} 写入iframe的值
  1526. * @param {function} 成功的回调函数
  1527. */
  1528. U.M.AsynIFO = function (UIF, UHT, UCB) {
  1529. (UHT) && (UIF.contentWindow.document.body.innerHTML = UHT);
  1530. (UCB) && (U.M.apply(UIF, UCB)()); //回调
  1531. }
  1532. /**
  1533. * ajax中文加密
  1534. *
  1535. * @param {array} 需要加密的字符串数组 这个为url加密
  1536. * @return {array} 返回加密成功的url数组
  1537. */
  1538. U.M.SplitArray = function (UDE) {
  1539. var i; //循环初始化
  1540. for (i = 0; i < UDE.length; i++) {
  1541. UDE[i] = encodeURIComponent(encodeURIComponent(UDE[i]));
  1542. }
  1543. return UDE.join(",");
  1544. }
  1545. /**
  1546. * 文字复制
  1547. *
  1548. * @param {string} 需要复制的元素
  1549. */
  1550. U.M.Copy = function (UTH) {
  1551. if (window.clipboardData) { //ie
  1552. window.clipboardData.setData("text", UTH);
  1553. }
  1554. else if (event && event.clipboardData) {//html5兼容
  1555. event.clipboardData.setData("text/HTML", UTH);
  1556. }
  1557. else if (event && event.originalEvent && event.originalEvent.clipboardData) { //firfox兼容
  1558. event.originalEvent.clipboardData("Text", UTH);
  1559. }
  1560. else if (document.execCommand) { //基本全兼容除了手机端的safari
  1561. document.execCommand("copy");
  1562. }
  1563. else {
  1564. U.Alert("请手动选择复制");
  1565. }
  1566. }
  1567. /**
  1568. * 文字粘贴
  1569. *
  1570. * @param {string} 需要复制的元素
  1571. */
  1572. U.M.UrlPaste = function () {
  1573. if (window.clipboardData) { //ie
  1574. return window.clipboardData.getData("text");
  1575. }
  1576. else if (event.clipboardData) { //html5
  1577. return event.clipboardData.getData("text/HTML");
  1578. }
  1579. else if (event && event.originalEvent && event.originalEvent.clipboardData) { //firfox兼容
  1580. return event.originalEvent.clipboardData("Text")
  1581. }
  1582. else if (document.execCommand) {//基本全兼容除了手机端的safari
  1583. document.execCommand("paste");
  1584. }
  1585. else {
  1586. U.Alert("无法粘贴");
  1587. }
  1588. //http://static.zhihu.com/static/js/v2/ui/editor_plugin_code.js
  1589. /*
  1590. var _ = this.getStateTuple(), state = _.state, range = _.range, code = _.code
  1591. if (state !== Plugin.State.EDITABLE) return
  1592. var text, textType = 'text/plain'
  1593. var clipboard = e.getBrowserEvent().clipboardData
  1594. if (clipboard) { // w3c(webkit,opera...)
  1595. if (clipboard.types && goog.array.contains(clipboard.types, textType)) {
  1596. e.preventDefault()
  1597. text = clipboard.getData(textType)
  1598. this.replaceText(range, text)
  1599. }
  1600. } else if (window.clipboardData) { // IE
  1601. text = window.clipboardData.getData('Text')
  1602. if (text) {
  1603. e.preventDefault()
  1604. this.replaceTextIE(range, text)
  1605. }
  1606. } else { // FF
  1607. // TODO:rewrite
  1608. var offset = range.getStartOffset()
  1609. var selectedLength = range.getText().length
  1610. var codeLength = function () {
  1611. return code.firstChild ? goog.editor.node.getLength(code.firstChild) : 0
  1612. }
  1613. var endLength = codeLength() - offset - selectedLength
  1614. setTimeout(function () {
  1615. Plugin.cleanup(code)
  1616. var caretOffset = codeLength() - endLength
  1617. if (code.firstChild) {
  1618. goog.dom.Range.createCaret(code.firstChild, Math.max(offset, caretOffset)).select()
  1619. }
  1620. })
  1621. }
  1622. */
  1623. }
  1624. /**
  1625. * 右键菜单定位
  1626. *
  1627. * @param {string} 需要定位的右键菜单
  1628. */
  1629. U.M.RLocate = function (UDOD) {
  1630. //UDOD 需要定位的元素
  1631. var _UDPD = U.M.TOSP(UDOD), //获取元素offsetParent
  1632. _UEV = U.M.GetMousep(_UDPD), //当前鼠标位置
  1633. _UW = [UDOD.offsetWidth, _UDPD.offsetWidth], //记录UUOD的offsetWidth属性
  1634. _UH = [UDOD.offsetHeight, _UDPD.offsetHeight]; //记录UUOD的offsetHeight属性
  1635. _UEV["X"] = ((_UW[0] + _UEV["X"]) > _UW[1]) ? _UEV["X"] - _UW[0] : _UEV["X"]; //设置top最大范围
  1636. _UEV["Y"] = ((_UH[0] + _UEV["Y"]) > _UH[1]) ? _UEV["Y"] - _UH[0] : _UEV["Y"]; //设置left最大范围
  1637. $(UDOD).addAttrArray({ "style": { "cssText": "top:" + _UEV["Y"] + "px;left:" + _UEV["X"] + "px"} }); //右键菜单的位置
  1638. }
  1639. /**
  1640. * 冒泡排序法的封装
  1641. *
  1642. * @param {array} 排序数组
  1643. * @param {string} 排序类型
  1644. * @param {function} 判断执行函数
  1645. * @param {number} 是否是升序降序
  1646. ----------[-1] 升序
  1647. ----------[1] 降序
  1648. */
  1649. U.M.Sequence = function (UDE, UTP, UCB, UIE) {
  1650. (UDE) && (UDE.sort(function (UO, UT) {
  1651. return ((UCB(UO[UTP], UT[UTP]) ? -1 : 1) * (UIE || 1));
  1652. }));
  1653. }
  1654. //判断是否支持svg
  1655. U.M.isSupportSvg = function () {
  1656. return !!(document.createElementNS && document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect);
  1657. }
  1658. /**
  1659. *浮点数运算函数
  1660. JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005
  1661. * 数字计算 解决浮点的bug
  1662. *
  1663. * @param {number} 数字1
  1664. * @param {number} 数字2
  1665. * @param {string} 连系符号 + - * /
  1666. */
  1667. U.M.floatOperate = function (number1, number2, operator) {
  1668. var i, //循环初始化
  1669. _pow, ////用于存放数据的变量
  1670. _strArr = [String(number1), String(number2)]; //用于存放数据的数组
  1671. for (i = 0; i < 2; i++) {
  1672. _strArr[i + 2] = _strArr[i].length - _strArr[i].indexOf(".") - 1;
  1673. }
  1674. _pow = Math.pow(10, Math.max(_strArr[2], _strArr[3]));
  1675. return (eval("0," + _strArr[0] * _pow + operator + _strArr[1] * _pow)) / _pow;
  1676. }
  1677. /**
  1678. * 获取对象类型
  1679. *
  1680. * @param {object} 需要判断的对象
  1681. * @return {string} Number,String,Array,Object,Symbol
  1682. */
  1683. U.M.GetType = function (UDOD) {
  1684. //UDO D需要判定类型的变量
  1685. if (UDOD) {
  1686. try {
  1687. var _UCE = UDOD.constructor; //求元素的构造函数。
  1688. //把构造函数按照字符串格式输出,结果形如:"function String() { [native code] }"。对结果执行执行字符串匹配,得到结果数组,判断结果数组中是否包含"String",得出类型。
  1689. var _UDE = (_UCE || UDOD).toString().match(_UCE ? /function\s*(\w+)/ : /\[object (.*?)\]/);
  1690. if (_UDE && _UDE.length == 2) {
  1691. return _UDE[1].toLowerCase();
  1692. }
  1693. else {
  1694. return typeof UDOD;
  1695. }
  1696. } catch (e) { }
  1697. }
  1698. }
  1699. /**
  1700. * 把json字符串转化成使用对象
  1701. *
  1702. * @param {string} 需要判断的对象
  1703. * @return {object} 返回成功过生成后的对象 支持无线树
  1704. */
  1705. U.M.toList = function (UDE) {
  1706. //UDE json字符串
  1707. var i; //循环初始化
  1708. (U.Ut.isString(UDE)) && (UDE = UDE.parseJSON()); //转化成Json
  1709. if (U.Ut.isArray(UDE)) { //设置数组
  1710. for (i = 0; i < UDE.length; i++) {
  1711. (U.Ut.isString(UDE[i])) && (UDE[i] = UDE[i].parseJSON());
  1712. U.Ut.isArray(UDE[i]) && (U.M.toList(UDE[i]));
  1713. }
  1714. }
  1715. return UDE;
  1716. }
  1717. /**
  1718. * 返回制定的对象类型名
  1719. *
  1720. * @param {object} 需要判断的对象
  1721. * @return {string} 返回object转化后的的
  1722. */
  1723. U.M.objectToString = function (UDE) {
  1724. return Object.prototype.toString.call(UDE);
  1725. }
  1726. /**
  1727. * 判断浏览器是否联网
  1728. *
  1729. * @param {function} 需要判断的对象
  1730. * @return {boolean} 是否联网
  1731. */
  1732. U.M.IsNetwork = function (UCB) {
  1733. //UCB 回调函数 暂未使用
  1734. var i, //循环初始化
  1735. j, //循环初始化
  1736. _UOE = [window, document.body], //存放数据的数组
  1737. _UDE = ["offline", "online"]; //存放数据的数组
  1738. if (UCB) {
  1739. for (i = 0; i < _UOE.length; i++) {
  1740. for (j = 0; j < _UDE.length; j++) {
  1741. U.M.AddEvent(_UDE[j], _UOE[i], U.M.apply(this, [[U.M.StopBubble], [UCB, [j]]]));
  1742. }
  1743. }
  1744. }
  1745. return navigator.onLine;
  1746. }
  1747. /**
  1748. * 错误函数控制台处理,,
  1749. *
  1750. * @param {string} 输入控制台的类型 默认log
  1751. * @return {object} 输出控制台的值
  1752. */
  1753. U.M.Console = function (err) {
  1754. try {
  1755. console.log(err);
  1756. } catch (e) { }
  1757. }
  1758. /**
  1759. * 滚动到底部处理
  1760. *
  1761. * @param {object} 滚动值
  1762. ----------[AF] 回调函数
  1763. * @return {object} 滚动对象
  1764. */
  1765. U.M.SSCH = function (UDE) {
  1766. //UDE 对象
  1767. return new U.M.SSCH.init(UDE);
  1768. }
  1769. U.M.SSCH.init = function (UDE) {//滚动方法执行
  1770. this.UDOD; //滚动元素
  1771. this.CT; //处理多次处理 用来设置 srcollend函数
  1772. this.P = 0; //最底部的次数
  1773. this.UTF = true;
  1774. this.Top = UDE["Top"]; //是否为顶部
  1775. this.UCB = UDE["AF"]; //回调函数
  1776. }
  1777. U.M.SSCH.init.prototype = {
  1778. /**
  1779. * 滚动初始使用
  1780. *
  1781. * @param {object} 滚动对象 原对象的this
  1782. */
  1783. SZX: function (UTE) {
  1784. UTE.UDOD = this; //滚动对象
  1785. clearTimeout(this.CT);
  1786. this.CT = setTimeout(U.M.apply(UTE, [[UTE.ZSCH]]), 0); //滚动开始
  1787. },
  1788. //获取方法
  1789. SCH: function () {
  1790. return U.M.apply(null, [[this.SZX, [this]]]); //滚动执行
  1791. },
  1792. /**
  1793. * 滚动处理
  1794. *
  1795. * @param {object} 滚动对象 原对象的this
  1796. */
  1797. ZSCH: function () {//执行
  1798. var _UDOD = this.UDOD, //滚动掉元素
  1799. _UT = _UDOD.scrollTop || document.documentElement.scrollTop; //当前滚动高度
  1800. if (this.Top != null) {
  1801. if (this.Top == _UT) { //滚动大小是否到底部判断
  1802. (this.UCB) && (this.UCB.call(this));
  1803. this.P++;
  1804. }
  1805. }
  1806. else {
  1807. if (_UT + _UDOD.offsetHeight >= _UDOD.scrollHeight - 2) { //滚动大小是否到底部判断
  1808. (this.UCB) && (this.UCB.call(this));
  1809. this.P++;
  1810. }
  1811. }
  1812. }
  1813. }
  1814. /**
  1815. * html加载,存储一篇文章,javascritp可以放在任何地方,当把文章追加到div等元素中时,由于没有刷新,导致javascript不能执行。需要把javascript重新移动到head头部才会加载。
  1816. *
  1817. * @param {element} 任何html元素
  1818. * @param {string} 文章内容
  1819. @return 返回文章内容
  1820. */
  1821. U.M.loadHtml = function (UDOD, UTH) {
  1822. if (UTH != null) {
  1823. UDOD.innerHTML = UTH;
  1824. }
  1825. // UDOD.innerHTML += "";
  1826. var i, //循环初始化
  1827. _UDHD = $("head")[0],
  1828. _UDE = $("script", UDOD); //获取script标签
  1829. for (i = 0; i < _UDE.length; i++) {
  1830. if (_UDE[i].src == "/uform.js") {
  1831. U.MD.DynamicLoad(_UDE[i].src, "js");
  1832. }
  1833. else {
  1834. $$("script", { "type": _UDE[i].type, "src": _UDE[i].src }, UDOD, _UDE[i]).text = _UDE[i].text;
  1835. }
  1836. }
  1837. return UTH;
  1838. }
  1839. /**
  1840. * 获取文字简写
  1841. *
  1842. * @param {element、 string} 传入的对象或者文字
  1843. * @param {number} 截图的长度
  1844. * @param {string} 后缀的添加
  1845. */
  1846. U.M.Shorttext = function (UDOD, UL, UST) {
  1847. UDOD = U.Ut.isString(UDOD) ? $$("div", { "innerHTML": UDOD }) : UDOD; //截取的对象
  1848. UL = UL || 200; //截取的长度
  1849. UST = UST || ""; //省略号
  1850. return UDOD.innerText.substring(0, UL) + (UDOD.innerText.length > 200 ? UST : "") + $("img", UDOD).outerHTML;
  1851. }
  1852. /**
  1853. * 随机产生一个函数 调用后销毁 类似委托
  1854. 解决跨域问题,以及ajax多个请求,多份实例的问题。
  1855. *
  1856. * @param {array} 滚动对象 原对象的this
  1857. ----------[0] 回调函数
  1858. ----------[.....] 传送的参数
  1859. * @return {object} 委托对象
  1860. */
  1861. U.M.getFun = function () {
  1862. if (arguments.length) {
  1863. return new U.M.getFun.init(arguments);
  1864. }
  1865. else {
  1866. throw new Error("cb is null");
  1867. }
  1868. }
  1869. /**
  1870. *上述函数的初始化函数
  1871. *
  1872. * @param {object} 滚动对象 原对象的this
  1873. */
  1874. U.M.getFun.init = function (UDE) { //初始化对象保存
  1875. UDE = Array.prototype.slice.call(UDE); //转化成数组
  1876. U.Ut.AddObj(this, { //参数
  1877. cb: UDE[0], //回调函数
  1878. id: "a" + Guid.guidNoDash(), //唯一识别id
  1879. isremove: true, //是否移除
  1880. parame: UDE.slice(1) //传参
  1881. });
  1882. window[this.id] = U.M.apply(this, [[this.Invoke, this.parame]]); //设置唯一识别函数使用
  1883. }
  1884. U.M.getFun.init.prototype = {
  1885. set: function (UDE) { //设置传参
  1886. var i; //遍历初始化
  1887. for (i in UDE) {
  1888. (UDE.hasOwnProperty(i)) && (this[i] = UDE[i]);
  1889. }
  1890. return this;
  1891. },
  1892. toString: function () { //返回对象
  1893. return this.id;
  1894. },
  1895. //执行 同时销毁对象
  1896. Invoke: function () {
  1897. try {
  1898. if (U.Ut.isFunction(this.cb)) { //判断是否有回调函数
  1899. this.cb.apply(this, arguments);
  1900. }
  1901. if (this.isremove) { //是否移除对象
  1902. window[this.getId()] = null; //设置对象移除
  1903. delete window[this.getId()]; //清理对象
  1904. delete this;
  1905. }
  1906. } catch (e) { }
  1907. },
  1908. //获取ID
  1909. getId: function () {
  1910. return this.id;
  1911. }
  1912. };
  1913. /**
  1914. * HTML模版页面 支持js内置 类似于js上的php ejs
  1915. *
  1916. * @param {element} 需要变化的元素
  1917. * @param {object} 传参对象
  1918. */
  1919. U.M.Simulation = function (UDOD, UDE) {
  1920. new U.M.Simulation.init(UDOD, UDE).exec();
  1921. }
  1922. /**
  1923. * 初始化HTML模版页面 支持js内置 类似于js上的php ejs
  1924. *
  1925. * @param {element} 需要变化的元素
  1926. * @param {object} 传参对象
  1927. */
  1928. U.M.Simulation.init = function (UDOD, UDE) {
  1929. this.el = UDOD; //
  1930. U.Ut.AddObj(this, UDE);
  1931. return this;
  1932. }
  1933. U.M.Simulation.init.prototype = {
  1934. //正则配置
  1935. config: { m: /^\\<{+([\s\S])+\\}>$/, // /\+=([\s\S])+?\+$/g
  1936. zs: "+=", ze: "+", c: /\\/g,
  1937. d: /(?=["])/g, s: "<{", e: "}>",
  1938. f: "%",
  1939. t: "([\\s\\S])*?"
  1940. },
  1941. //执行
  1942. exec: function () {
  1943. try {
  1944. var i, _UCS = "",
  1945. _UPE = [],
  1946. _UT = this,
  1947. _UKE = this.key,
  1948. _UCE = this.config,
  1949. _USE = (this.el.innerHTML || this.el).trim(" ").replace(_UCE.c, "\\\\").replace(_UCE.d, "\\").replace(this.getConfig("\\\\", "", "", "\\\\"),
  1950. function (UST) { //配置输出查看
  1951. return UST.replace("\\" + _UCE.s, _UCE.s.replaceHtmlSign()).replace("\\" + _UCE.e, _UCE.e.replaceHtmlSign());
  1952. });
  1953. //函数匹配区域
  1954. _USE = _USE.replace(this.getConfig("", "", _UCE.f), function (UST) {
  1955. return UST.replace(_UCE.s + _UCE.f, "\";").replace(_UCE.e, ";uhtml+=\"");
  1956. });
  1957. _USE = _USE.replace(this.getConfig(), function (UST) {
  1958. return "\"+" + ((UST.replace(_UCE.s, "").replace(_UCE.e, "").replace(_UT.re("\\" + _UCE.zs + _UCE.t + "\\" + _UCE.ze),
  1959. function (UST) {
  1960. return UST.replace(_UCE.zs, "").replace(_UCE.ze, "").replaceHtmlSign();
  1961. })) || "\"\"") + "+\"";
  1962. }); //配置html输出区域
  1963. _USE = 'var uhtml="' + _USE + '"; return uhtml;';
  1964. //变量传参
  1965. if (_UKE) {
  1966. for (i in _UKE) {
  1967. (_UKE.hasOwnProperty(i)) && (_UCS += (_UCS ? "," : "") + i, _UPE.push(_UKE[i]));
  1968. }
  1969. };
  1970. _USE = Function(_UCS, _USE).apply(this.that || this, _UPE); //利用函数执行回调处理
  1971. (this.cb) && (this.cb(_USE)); //获取模版回调
  1972. }
  1973. catch (e) { throw new Error(e); }
  1974. },
  1975. /**
  1976. * 获取正则
  1977. *
  1978. * @param {string} 正则字符串
  1979. */
  1980. re: function (URE) {
  1981. return new RegExp(URE, "g");
  1982. },
  1983. /**
  1984. * 初始化HTML模版页面 支持js内置 类似于js上的php ejs
  1985. *
  1986. * @param {string} 正则开头
  1987. * @param {string} 正则结束
  1988. * @param {string} 正则中间的内容
  1989. * @param {string} 正则结束的内容
  1990. * @return {string} 正则内容
  1991. */
  1992. getConfig: function (US, UE, UOS, UOE) { //获取系统配置
  1993. var _UCE = this.config;
  1994. return this.re((US || "") + _UCE.s + (UOS || "") + _UCE.t + (UOE || "") + _UCE.e + (UE || ""));
  1995. },
  1996. getHtml: function () { //获取生成的html代码
  1997. },
  1998. /**
  1999. * 正则对象
  2000. *
  2001. * @param {object} 正则设置
  2002. */
  2003. set: function (UDE) { //设置config
  2004. var i, _UCE = this.config;
  2005. for (i in _UCE) {
  2006. (UDE.hasOwnProperty(i)) && (UDE[i] = _UCE[i]);
  2007. }
  2008. return this;
  2009. }
  2010. }