Form.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. //#region 窗体
  2. //UI窗体区域
  3. Namespace.register("U.UF.UI") //窗体的命名空间
  4. //#region 窗体
  5. /** 初始化uform窗体,创建一个窗体,调用方式如下
  6. * new new U.UF.UI.form(
  7. * "测试内容",
  8. * "中间内容",
  9. * { "style": { "width": "570px", "height": "80%", "maxHeight": "700px"} },
  10. * );
  11. * @param string 头部标题 必填
  12. * @param string|element 中间区域的内容 必填
  13. * @param object 窗体的属性 {id :"1", style:{"width":"100px", "height":"100px"}} 选填 有默认的属性,原函数有注释
  14. * @param object 窗体功能的属性 { istop: true, isdrag: true, isstretching:true,isenlarge:true,isnarrow:true,isclose:true } 选填
  15. * @param object 头部的属性 {style:{"width":"100px"}} 选填 有默认的属性,原函数有注释
  16. * @param object 内容的属性 { style:{"height":"100px"}} 选填 有默认属性,原函数有注释
  17. * @param object 关闭、放大、缩小按钮区域的属性设置 { "style":{"left":"100px"}} 选填,有默认属性,原函数有注释
  18. * @param element 窗体追加到制定的元素 选填 有默认的属性,原函数有注释
  19. */
  20. U.UF.UI.form = function(title, content, formattr, formfun, headattr, contentattr, headbottomattr, parentel) {
  21. var _this = this;
  22. //所有的窗体中找到是否已经创建的窗体
  23. if (formattr && U.UF.UI.form.allForm[formattr.id]) {
  24. var _this = U.UF.UI.form.allForm[formattr.id]; //得到原来的窗体
  25. }
  26. //初始化未赋值,用到的变量
  27. else {
  28. //设置窗体唯一的识别
  29. this.id = formattr && formattr.id ? formattr.id : Guid.newGuid();
  30. //初始化成功后添加到所有窗体管理的对象中,以便于用户查找窗体和管理
  31. U.UF.UI.form.allForm[this.id] = this;
  32. }
  33. _this.form; //窗体
  34. _this.header; //头部
  35. _this.middle; //中间区域
  36. _this.title = title; //窗体的标题
  37. _this.content = content; //需要插入的元素,包含div和iframe等元素,以前站外应用的功能是靠这个方式去实现的
  38. _this.formattr = formattr; //窗体的属性
  39. _this.headattr = headattr; //头部的属性
  40. _this.contentattr = contentattr; //内容的属性
  41. _this.headbottomattr = headbottomattr; //头部功能区域整体的属性设置
  42. //下面是用户功能处理包含是否允许一直置顶、是否允许拖动、是否拉伸、是否允许放大、是否允许缩小、是否允许关闭
  43. //如果用户没有传入功能处理
  44. if (formfun == null) {
  45. formfun = {}; //初始化一个功能处理类
  46. }
  47. _this.istop = null;
  48. if (formfun.istop != null) { //是否允许一直置顶
  49. _this.istop = formfun.istop;
  50. }
  51. _this.isdrag = true;
  52. if (formfun.isdrag != null) { //是否允许拖动
  53. _this.isdrag = formfun.isdrag; //是否允许拖动
  54. }
  55. _this.isstretching = true;
  56. if (formfun.isstretching != null) { //是否拉伸
  57. _this.isstretching = formfun.isstretching;
  58. }
  59. _this.isenlarge = true;
  60. if (formfun.isenlarge != null) { //是否允许放大
  61. _this.isenlarge = formfun.isenlarge;
  62. }
  63. _this.isnarrow = true;
  64. if (formfun.isnarrow != null) { //是否允许缩小
  65. _this.isnarrow = formfun.isnarrow; //是否允许缩小
  66. }
  67. _this.isclose = true;
  68. _this.closecallback = formfun.closecallback; //关闭回调
  69. if (formfun.isclose != null) { //是否允许关闭
  70. _this.isclose = formfun.isclose; //是否允许关闭
  71. }
  72. _this.parentel = parentel || document.body; //窗体添加到制定的元素处理
  73. _this.create(); //重新添加处理
  74. return _this; //返回处理
  75. }
  76. //所有给给创建的窗体管理
  77. U.UF.UI.form.allForm = {};
  78. //窗体的方法
  79. U.UF.UI.form.prototype = {
  80. /** 初始化uform窗体
  81. */
  82. create: function() {
  83. var i, //用于循环
  84. _resizefun,
  85. _formel, //窗体元素
  86. _headel, //窗体头部元素
  87. _contentel, //内容区域的元素
  88. _contentchildel, //内容区域的
  89. _stretchingel, //拉伸元素
  90. _stretchinginfo, //拉伸的信息
  91. _headbottom, //头部按钮区域
  92. _enlargeel, //放大按钮
  93. _mousedown, //
  94. _formattr = this.formattr || {}, //窗体属性
  95. _headattr = this.headattr || {}, //头部属性
  96. _contentattr = this.contentattr || {}, //内容的属性
  97. _replaceel = U.UF.UI.form.allForm[_formattr.id] ? U.UF.UI.form.allForm[_formattr.id].form : null //得到之前创建的窗体,如果窗体存在,那么下面创建后直接替换
  98. ;
  99. //窗体的统一属性设置,默认属性
  100. if (_formattr.style) {
  101. _formattr.style.cssText = _formattr.style.cssText || "";
  102. _formattr.style.cssText = "width: 70%; position: fixed; border: 1px solid #444; background-color: #fff; z-index: 10; border-radius: 1px; overflow: hidden; -moz-box-shadow:0 0 30px 5px #555; -webkit-box-shadow:0 0 30px 5px #555; box-shadow:0 0 30px 5px #555; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius:5px;" + _formattr.style.cssText;
  103. } else {
  104. _formattr.style = {
  105. cssText: "width: 70%; position: fixed; border: 1px solid #444; background-color: #fff; z-index: 10; border-radius: 1px; overflow: hidden; -moz-box-shadow:0 0 30px 5px #555; -webkit-box-shadow:0 0 30px 5px #555; box-shadow:0 0 30px 5px #555; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius:5px;"
  106. };
  107. }
  108. _formattr.close = U.UF.C.apply(this, function() { //关闭窗体;
  109. U.UF.F.closeWindow(this.form); //关闭窗体
  110. });
  111. _formattr.usform = "true"; //设置窗体的属性,作为窗体的识别,有助于调用的用户通过js找到所有的窗体
  112. _formattr.id = _formattr.id || ""; //窗体的id
  113. _formattr.style = _formattr.style || {}; //窗体的样式
  114. if (_formattr.onresize) {
  115. _resizefun = _formattr.onresize;
  116. _mousedown = _formattr.onmousedown;
  117. _formattr.onresize = U.UF.C.apply(this, function() { //当窗体大小发生变化的处理
  118. this.size(); //大小变化处理
  119. if (_resizefun) {
  120. _resizefun(); //大小变化回调
  121. }
  122. });
  123. _formattr.onmousedown = U.UF.C.apply(this, function() {
  124. //窗体点击置顶的处理
  125. if (this.istop !== false) {
  126. this.top(); //大小变化处理
  127. }
  128. if (_mousedown) {
  129. _mousedown(); //大小变化回调
  130. }
  131. });
  132. } else if (_formattr.onresize !== false) {
  133. _formattr.onresize = U.UF.C.apply(this, function() { //当窗体大小发生变化的处理
  134. this.size(); //大小变化处理
  135. });
  136. }
  137. //创建大窗体,设置窗体属性
  138. var _formel = $$("div", this.formattr);
  139. //判断是否允许一直置顶
  140. if (this.istop === true) {
  141. _formel.style.zIndex = "9999";
  142. _formel["__top__"] = "false"; //设置不允许点击切换置顶
  143. } else if (this.istop === false) {
  144. _formel["__top__"] = "false"; //设置不允许点击切换置顶
  145. }
  146. this.form = _formel; //窗体全局变量设置
  147. //如果用户设置了false,那么就不加载头部
  148. if (this.title !== false) {
  149. //窗体头部属性统一设置
  150. if (_headattr.style) {
  151. _headattr.style.cssText = _headattr.style.cssText || "";
  152. _headattr.style.cssText = "text-indent: 10px; color: White; line-height: inherit; font-size: 14px; height: 30px; line-height: 30px; background-color: #2967A7; overflow: hidden; color: White; font-size: 14px; overflow: hidden; " + _headattr.style.cssText;
  153. } else {
  154. _headattr.style = {
  155. cssText: "text-indent: 10px; color: White; line-height: inherit; font-size: 14px; height: 30px; line-height: 30px; background-color: #2967A7; overflow: hidden; color: White; font-size: 14px; overflow: hidden; "
  156. }
  157. }
  158. //设置头部有拖拽事件
  159. if (this.isdrag) { //判断是否允许拖动窗体
  160. _headattr.onmousedown = function() {
  161. U.UF.F.drag(_formel); //拖动事件调用
  162. };
  163. }
  164. //创建头部区域
  165. _headel = $$("div", _headattr, _formel);
  166. //如果是字符串的处理
  167. if (U.UF.C.isString(this.title)) {
  168. _headel.innerHTML = this.title;
  169. }
  170. //如果中间区域是元素的处理
  171. else if (U.UF.C.isElement(this.title)) {
  172. _headel.appendChild(this.title); //添加所选元素
  173. }
  174. this.header = _headel; //设置中间的全局变量
  175. }
  176. //创建中间
  177. _contentel = $$("div", { "style": { "cssText": "width: 100%; height:100%; position: relative;" } }, _formel);
  178. //中间的内容
  179. _contentattr.usbody = "true";
  180. //窗体头部属性统一设置
  181. if (_contentattr.style) {
  182. _contentattr.style.cssText = _contentattr.style.cssText || "";
  183. //_contentattr.style.cssText = "text-align: left; overflow: auto;" + _contentattr.style.cssText;
  184. _contentattr.style.cssText = "text-align: left; overflow: hidden;" + _contentattr.style.cssText;
  185. } else {
  186. _contentattr.style = {
  187. cssText: "text-align: left; overflow: auto;"
  188. };
  189. }
  190. //创建中间内容元素
  191. _contentchildel = $$("div", _contentattr, _contentel);
  192. //如果是字符串的处理
  193. if (U.UF.C.isString(this.content)) {
  194. _contentchildel.innerHTML = this.content;
  195. }
  196. //如果中间区域是元素的处理
  197. else if (U.UF.C.isElement(this.content)) {
  198. _contentchildel.appendChild(this.content); //添加所选元素
  199. }
  200. this.middle = _contentchildel; //中间的内容
  201. //在头部不存在的情况下,设置中间内容可以拖动
  202. if (this.title === false && this.isdrag) {
  203. _contentel.onmousedown = function() {
  204. U.UF.F.drag(_formel); //拖动事件调用
  205. };
  206. }
  207. //设置拉伸处理
  208. if (this.isstretching !== false) {
  209. //创建窗体拉伸
  210. _stretchingel = $$("div", { style: { "cssText": "display: block;" } }, _formel);
  211. //拉伸的信息 key代表样式的结尾,value代表拉伸的方向
  212. _stretchinginfo = {
  213. "top": "cursor: n-resize; left: 0px; top: 0px; width: 100%; height: 5px;",
  214. "rightTop": "cursor: ne-resize; right: -2px; top: -2px; width: 12px; height: 12px;",
  215. "leftTop": "cursor: nw-resize; top: 0px; left: 0px; width: 12px; height: 12px;",
  216. "left": "cursor: w-resize; left: 0px; top: 0px; width: 5px; height: 100%;",
  217. "right": "cursor: e-resize; right: 0px; top: 0px; width: 5px; height: 100%;",
  218. "bottom": "cursor: s-resize; left: 0px; bottom: 0px; width: 100%; height: 5px;",
  219. "leftBottom": "cursor: sw-resize; left: -2px; bottom: -2px; width: 12px; height: 12px;",
  220. "rightBottom": "cursor: se-resize; right: -2px; bottom: -2px; width: 12px; height: 12px;"
  221. }
  222. //循环创建拉伸条,包含上、下、左、右、上左、下左、上右、下右
  223. for (i in _stretchinginfo) {
  224. $$("div", {
  225. "style": {
  226. "cssText": "position: absolute; overflow: hidden; display: block; z-index: 10;" + _stretchinginfo[i]
  227. },
  228. "onmousedown": U.UF.C.closure(function(scope, typename) {
  229. //拉伸函数的调用
  230. U.UF.F.stretching(_formel, typename, U.UF.C.apply(scope, scope.size));
  231. }, [this, i])
  232. }, _stretchingel);
  233. }
  234. }
  235. //头部功能区域
  236. if (this.title !== false) {
  237. _headbottom = $$("div", {
  238. "style": { "cssText": "position: absolute; top: 3px; right: 0px; width: 80px; display: table-cell; vertical-align: middle;" }
  239. }, _formel);
  240. }
  241. if (this.isclose !== false) {
  242. //关闭窗体的按钮
  243. $$("div", {
  244. "style": {
  245. "cssText": "background-image:url(../../../img/close.png); _background-image:url(/img/close.png);width: 14px; height: 14px; background-repeat: no-repeat; background-size: 100%; float: right; margin-right: 5px;margin-top:6px; cursor: pointer;"
  246. },
  247. "title": "点击关闭",
  248. "onmousedown": U.UF.EV.stopBubble,
  249. "onclick": U.UF.C.apply(this, function() {
  250. U.UF.F.closeWindow(this.form); //调用窗体关闭函数
  251. try {
  252. //关闭任务栏处理
  253. if (U.MD.D.T.taskbar.close) {
  254. U.MD.D.T.taskbar.close({ "forms": _formel });
  255. U.MD.N.urlWrite("", "智慧课堂平台");
  256. }
  257. } catch (e) {}
  258. //回调处理
  259. if (U.UF.C.isFunction(this.closecallback)) {
  260. this.closecallback();
  261. }
  262. })
  263. }, _headbottom);
  264. }
  265. //是否允许放大
  266. if (this.isenlarge !== false) {
  267. //放大按钮
  268. _enlargeel = $$("div", {
  269. "style": {
  270. "cssText": "background-image:url(../../../img/max.png); _background-image:url(/img/max.png); background-size: 100%; float: right; margin-right: 10px; width: 17px; height: 17px; cursor: pointer;margin-top: 4px;"
  271. },
  272. "title": "最大化",
  273. "onmousedown": U.UF.EV.stopBubble,
  274. //最大化点击事件处理
  275. "onclick": function() {
  276. U.UF.F.windowZooming(_formel); //调用窗体最大化函数
  277. }
  278. }, _headbottom);
  279. //如果有head头部的处理
  280. if (_headel) {
  281. //头部双击放大缩小处理处理
  282. _headel.ondblclick = U.UF.C.apply(_headel, function() {
  283. //判断双击的元素是否在头部导航上,否则如果头部上有其他的按钮什么的双击了,也会触发放大方法
  284. if (event.srcElement == this || U.UF.EL.isChild(this, event.srcElement)) {
  285. _enlargeel.onclick(); //放大的处理
  286. }
  287. });
  288. }
  289. }
  290. //是否允许最小化
  291. if (this.isnarrow !== false) {
  292. //最小化的按钮处理
  293. $$("div", {
  294. "style": {
  295. "cssText": "background-image:url(../../../img/min.png); _background-image:url(/img/min.png);background-size: 100%; float: right; margin-right: 10px; margin-top: 3px; width: 20px; height: 20px; cursor: pointer;background-repeat: no-repeat;"
  296. },
  297. "title": "最小化",
  298. "onmousedown": U.UF.EV.stopBubble,
  299. "onclick": function() {
  300. U.UF.F.windowMinimize(_formel); //窗体最小化处理
  301. }
  302. }, _headbottom);
  303. }
  304. //如果窗体已经创建,那么直接替换
  305. if (_replaceel && _replaceel.parentNode != null) {
  306. _replaceel.parentNode.replaceChild(_formel, _replaceel);
  307. }
  308. //元素添加到制定的元素中
  309. else {
  310. this.parentel.appendChild(_formel);
  311. }
  312. //如果没有设置top和left那么居中弹出
  313. if (_formel.style.top == "" && _formel.style.left == "" && _formel.style.right == "" && _formel.style.bottom == "") {
  314. //居中置顶弹出
  315. U.UF.F.windowTopCenter(_formel);
  316. }
  317. //否则置顶
  318. else {
  319. U.UF.F.topWindow(_formel);
  320. }
  321. //初始化的时候默认设置大小
  322. this.size();
  323. },
  324. /** 窗体每一次点击置顶
  325. */
  326. top: function() {
  327. U.UF.F.topWindow(this.form); //点击置顶的处理
  328. },
  329. /** 窗体大小处理
  330. */
  331. size: function() {
  332. var _headheight = 0; //head头部的高度
  333. //如果存在head头部,那么获取head头部处理
  334. if (this.header) {
  335. _headheight = this.header.clientHeight;
  336. }
  337. //设置窗体content区域大小设置
  338. if (this.header) {
  339. this.middle.style.height = this.form.clientHeight - this.header.clientHeight + "px";
  340. } else {
  341. this.middle.style.height = this.form.clientHeight + "px";
  342. }
  343. }
  344. }
  345. /** 窗体大小处理
  346. */
  347. U.UF.UI.form.windowResize = function() {
  348. var i,
  349. _style,
  350. _bodywidth = US.width, //获取原本在窗体大小没有变化前的width
  351. _bodyheight = US.height, //获取原本在窗体大小没有变化前的height
  352. _sizeinfo, //大小信息
  353. _width, //长度
  354. _height, //高度
  355. _formel, //窗体元素
  356. _forms = U.UF.UI.form.allForm //获取所有的窗体
  357. ;
  358. //循环所有的窗体
  359. for (i in _forms) {
  360. _formel = _forms[i].form; //获取窗体的处理
  361. if ($(_formel).css("display") != "none") { //判断窗体是否隐藏
  362. _style = {}; //设置位置
  363. _width = U.selectEl(_formel).css("width"); //获取窗体的长
  364. _height = U.selectEl(_formel).css("height"); //获取窗体的宽
  365. //计算位置,如果有百分比,则按照百分比的方式进行计算,否则,得到百分比。
  366. _width = _width.indexOf("%") > -1 ? _width.toInt() / 100 : _formel.offsetWidth / _bodywidth;
  367. _height = _height.indexOf("%") > -1 ? _height.toInt() / 100 : _formel.offsetWidth / _bodyheight;
  368. //设置位置,如果没有右对齐,则设置左对齐
  369. if (_formel.style.right == "" || _formel.style.right == "auto") {
  370. _style.left = _formel.offsetLeft + (document.body.offsetWidth - _bodywidth) * ((1 - _width) / 2) + "px";
  371. }
  372. //如果没有下对齐,则设置上对齐
  373. if (_formel.style.bottom == "" || _formel.style.bottom == "auto") {
  374. _style.top = _formel.offsetTop + (document.body.offsetHeight - _bodyheight) * ((1 - _height) / 2) + "px";
  375. }
  376. //设置值
  377. U.selectEl(_formel).addAttrArray({ "style": _style });
  378. }
  379. }
  380. }
  381. /** 关闭所有的窗体
  382. */
  383. U.UF.UI.form.closeWindows = function() {
  384. var i;
  385. for (i in U.UF.UI.form.allForm) {
  386. if (U.UF.UI.form.allForm[i].isclose) {
  387. U.UF.UI.form.allForm[i].form.close();
  388. }
  389. }
  390. }
  391. //#endregion
  392. //#endregion