Office.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. 主要服务于word,excel,ppt,visio等文档的打开。
  3. 存在问题
  4. 1、保存的时候不弹出系统默认框
  5. 2、彻底分离各个模板
  6. 3、键盘处理 那些是快捷键 需要写流程图
  7. */
  8. Namespace.register("U.MD.O");
  9. //#region word创建,打开。
  10. /**
  11. * Word打开 之前通过第二个参数是guid进来的全部都要改
  12. *
  13. * @param {object} 登录用户信息
  14. * @param {object} 文档信息数组,如果为空,则创建空文档。
  15. * @return {object} 返回当前窗体
  16. */
  17. U.MD.O.word = function (userinfo, fileinfo, cb) {
  18. var _contentel,
  19. _fileid,
  20. _formel,
  21. _child
  22. ;
  23. //获取文档的id
  24. if (fileinfo && fileinfo.UserDirectoryID) {
  25. _fileid = fileinfo.UserDirectoryID; //获取文件id
  26. }
  27. if (!_fileid) { //第一次打开的文档的处理
  28. _fileid = Guid.newGuid();
  29. var _type = fileinfo.UserDirectoryExtendType;
  30. fileinfo = { "UserDirectoryID": _fileid, UserDirectoryExtendType: _type };
  31. if (_type == "un") {
  32. fileinfo.UsOffice = U.A.Request(US.CD, ([US.DB, "UseStudio_Disk", "GetFileContent", "6a8a235a-41c4-c3d2-8dd5-b6ee851e1967"])).value[0].UsOffice.unEscapeQuotes();
  33. } else {
  34. fileinfo.UsOffice = U.A.Request(US.CD, ([US.DB, "UseStudio_Disk", "GetFileContent", "d17a2910-11ba-df39-cd8a-5cac851c2148"])).value[0].UsOffice.unEscapeQuotes();
  35. }
  36. fileinfo.newfile = true;
  37. }
  38. //得到弹窗
  39. _formel = $("#UD_Word" + _fileid)[0];
  40. //未打开的创建加载处理
  41. if (!_formel) {
  42. //创建新窗口
  43. _contentel = $("#UD_Word").clone(true); //克隆word编辑器 包含头部菜单和功能及word编辑区域
  44. _child = $(_contentel[0]).Child(); //头部的区域
  45. _formel = new U.UF.UI.form(
  46. _child[0],
  47. _child[1],
  48. {
  49. "id": "UD_Word" + _fileid, "style": { "width": "90%", "height": "90%", "overflow": 'hidden' },
  50. "onresize": function () { }
  51. },
  52. {
  53. closecallback: function () {
  54. U.A.Request(US.SCOKET, ["quitOffice", JSON.stringify({ docId: fileinfo.UserDirectoryID, pageId: US.pageId, userId: top.US.userInfo.userid, type: fileinfo.UserDirectoryExtendType == 'un' ? 'nav' : 'word' })], function (r) {
  55. // console.log('退出文档');
  56. });
  57. }
  58. },
  59. { "style": { "height": "36px" } }).form; //创建窗体
  60. U.MD.O.header(userinfo, _child[0], fileinfo); //创建header头部
  61. U.UF.DL.loading(_child[1]); //添加loading处理
  62. //添加编辑区域,异步加载iframe并执行回调
  63. U.MD.O.officeLoad(_child[1], "Word", function (iframe) {
  64. iframe.contentWindow.U.MD.O.W.load(fileinfo, userinfo); //word的处理
  65. $('#UD_Word' + _fileid + ' .U_MD_O_H_head_navigation_Title')[0].onchange = iframe.contentWindow.U.MD.O.W.updateName;
  66. //打开word成功后执行回调
  67. if (U.UF.C.isFunction(cb)) {
  68. cb(iframe.contentWindow);
  69. }
  70. U.UF.DL.uploading(_child[1]); //移除loading处理
  71. }); //创建Office编辑器
  72. }
  73. //如果已经打开过的,直接置顶
  74. else {
  75. $('iframe', _formel)[0].contentWindow.U.MD.O.W.load(fileinfo, userinfo);
  76. U.UF.F.windowTopCenter(_formel);
  77. }
  78. return [_formel, fileinfo]; // 返回当前窗体
  79. }
  80. /**
  81. * 导航建站
  82. *
  83. * @param {element} 登录用户信息
  84. */
  85. U.MD.O.wordNav = function (el) {
  86. }
  87. //#endregion
  88. //#region Excel初始化
  89. /**
  90. * Excel打开
  91. *
  92. * @param {object} 登录用户信息
  93. * @param {object} 文档信息数组
  94. * @return {object} 返回当前窗体
  95. */
  96. U.MD.O.excel = function (userinfo, fileinfo) {
  97. var _contentel,
  98. _fileid,
  99. _formel,
  100. _child
  101. ;
  102. //获取文档的id
  103. if (fileinfo && fileinfo.UserDirectoryID) {
  104. _fileid = fileinfo.UserDirectoryID; //获取文件id
  105. }
  106. if (!_fileid) { //第一次打开的文档的处理
  107. _fileid = Guid.newGuid();
  108. fileinfo = { "UserDirectoryID": _fileid };
  109. }
  110. //得到弹窗
  111. _formel = $("#UD_Excel" + _fileid)[0];
  112. //未打开的创建加载处理
  113. if (!_formel) {
  114. //创建新窗口
  115. _contentel = $("#UD_Excel").clone(true); //克隆word编辑器 包含头部菜单和功能及word编辑区域
  116. _contentel[0].id = ""; //清除id
  117. _child = $(_contentel[0]).Child(); //头部的区域
  118. _formel = new U.UF.UI.form(_child[0], _child[1], { "id": "UD_Excel" + _fileid, "style": { "width": "90%", "height": "90%", "overflow": 'hidden' } }, {}, { "style": { "height": "36px" } }).form; //创建窗体
  119. U.UF.DL.loading(_child[1]); //添加loading处理
  120. U.MD.O.header(userinfo, _child[0], fileinfo); //创建header头部
  121. //添加编辑区域,异步加载iframe并执行回调
  122. U.MD.O.officeLoad(_child[1], "Excel", function (iframe) {
  123. U.UF.DL.uploading(_child[1]); //移除loading处理
  124. iframe.contentWindow.U.MD.O.E.load(fileinfo, userinfo, iframe); //word的处理
  125. }); //创建Office编辑器
  126. }
  127. //如果已经打开过的,直接置顶
  128. else {
  129. U.UF.F.windowTopCenter(_formel);
  130. }
  131. return _formel; // 返回当前窗体
  132. }
  133. //#endregion
  134. //#region 此函数只是用来创建word,excel,PPT等的编辑器,没有包含word,excel,PPT等的功能。word,excel,PPT的功能包含在异步函数U.MD.O.asynWord中,统一创建office的编辑iframe。
  135. /**
  136. * 创建Office窗体
  137. *
  138. * @param {element} 创建office的容器元素
  139. * @param {object} 登录用户信息
  140. * @param {object} 文档信息数组 或 null,用于显示文件内容
  141. * @param {str} 类型 Word || Excel||ppt|others...
  142. * @param {function} 回调函数
  143. */
  144. U.MD.O.officeLoad = function (el, type, cb) {
  145. var _file, //文件的路径
  146. _iframe //iframe的名字
  147. ;
  148. //初始化应用的路径。
  149. switch (type) {
  150. case "Word": //word的处理
  151. _file = "WordEditArea.htm";
  152. break;
  153. case "Excel": //excel的处理
  154. _file = "ExcelEditArea.htm";
  155. // type = 'ExcelCanvas';
  156. break;
  157. case "PPT": //ppt的处理
  158. _file = "PPT.htm";
  159. break;
  160. default: break;
  161. }
  162. //创建容纳word,Excel,PPT等的iframe。
  163. _iframe = $$("iframe", {
  164. "frameBorder": "0",
  165. "style": {
  166. "border": "0"
  167. }, //创建office
  168. "src": US.MAINDOMAIN + "/Controls/Office/" + type + "/" + _file,
  169. "width": "100%",
  170. "height": "100%"
  171. }, el);
  172. //异步加载iframe 添加office功能
  173. U.UF.DL.iframeLoad(_iframe, function () {
  174. $("body", _iframe.contentWindow.document)[0].onmousedown = function () {
  175. U.UF.F.topWindow(el, true);
  176. }
  177. cb(_iframe);
  178. });
  179. }
  180. /**
  181. * 用户头部生成
  182. *
  183. * @param {object} 登录用户信息
  184. * @param {element} 头部元素
  185. * @param {object} 文档信息数组
  186. */
  187. U.MD.O.header = function (userinfo, el, fileinfo) {
  188. var _filename,
  189. _hreadel;
  190. //获取文件名
  191. if (fileinfo && (fileinfo["UserallDirectoryName"] || fileinfo["UserFilesName"])) { //文件存在的时候文件的名字
  192. _filename = fileinfo["UserallDirectoryName"] || fileinfo["UserFilesName"];
  193. }
  194. //不存在文件的文件名
  195. else {
  196. _filename = "未命名文档(点击编辑)...";
  197. }
  198. $("input", el)[0].value = _filename; //文件名
  199. //头部处理
  200. _hreadel = $$("div", { "className": "U_MD_O_H_Editor" }, el.children[2].children[4]);
  201. $$("img", {
  202. "onerror": U.MD.C.imgError,
  203. "onerror": U.MD.C.imgError,
  204. "src": U.MD.C.getHeadImage(userinfo.UserThumbnailImageHead)
  205. }, _hreadel);
  206. $$("div", { "className": "U_MD_O_H_head_navigation_username", "innerHTML": userinfo.UserNickName || "" }, el.children[2].children[4]);
  207. }
  208. //#endregion
  209. //#region 统一区域
  210. /**
  211. * 只需要随便传递一个元素,则可以获取指定的Window操作层
  212. *
  213. * @param {element} Ifrmae下的元素
  214. * @return {boject} 指定的Window操作层,即iframe中的windows对象
  215. */
  216. U.MD.O.getOfficeWindow = function (el) {
  217. // 如果没有参数,则获取当前事件聚焦的对象。
  218. el = el || event.srcElement; //获取事件的源对象
  219. return $("iframe", $(el).Parent({ usform: "true" }) || el)[0].contentWindow; //却换到指定的window操作层
  220. }
  221. //#endregion