U.D.E.js 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. /*
  2. 编辑使用区域
  3. */
  4. Namespace.register("U.D.E");
  5. //#region 编辑区域
  6. /**
  7. * 编辑器区域初始化设置全局变量
  8. *
  9. * @param {window} window
  10. * @param {element} 当前编辑框元素
  11. * @param {object} 编辑传参对象
  12. -----------[CB] 回调函数
  13. -----------[TF] 识别id
  14. */
  15. U.D.E.setVariable = function (id, cursor) {
  16. var _cursors = U.D.E.SORange;
  17. if (id) {
  18. //设置监视前进后退变化使用 函数有问题以后要修改
  19. _cursors["OAT"][id] = [{ "OR": new cursor.init(cursor, false), "C": ""}]; //创建前进后退处理
  20. _cursors["OAT"][id].l = 0; //当前前进后退所在的位置
  21. _cursors["OE"][id] = cursor; //保存当前光标变量
  22. }
  23. }
  24. /**
  25. * 初始化编辑区域 判断光标是否存在、创建光标、写入全局光标变量、监听键盘
  26. *
  27. * @param {window} window
  28. * @param {element} 当前编辑框元素
  29. * @param {object} 编辑传参对象
  30. -----------[CB] 回调函数
  31. -----------[TF] 识别id
  32. */
  33. U.D.E.GetSelectionRange = function (win, el, obj) {
  34. try {
  35. var _id = obj["TF"], //对该光标的唯一标识
  36. _cursors = U.D.E.SORange, //所有使用编辑光标
  37. _cursor = _cursors["OE"][_id]; //获取已经创建的光标功能区
  38. //已经创建直接刷新光标
  39. if (_id && _cursor) {
  40. //_cursor = _cursor.setVariable(win, win.document, el, obj); //光标存在,把光标的变量重新赋值
  41. _cursor.CreateR(); //重新创建光标
  42. }
  43. else { //创建一个新的光标控制
  44. _cursor = new U.D.E.SelectionRange(win, win.document, el, obj).CreateR(true); //创建光标
  45. //设置光标的全局变量
  46. U.D.E.setVariable(_id, _cursor); //全局变量初始化
  47. //把键盘事件和光标一起绑定,因为要使用光标的地方全部都要监控键盘输入输出,所以绑定在一起,如果有机会,可以独立。
  48. //事件监视使用 处理页面在选择 输入 点击的时候的处理
  49. U.D.E.KeyboardBinding(_cursor.PSO, _cursor); //键盘绑定处理
  50. }
  51. return _cursor;
  52. }
  53. catch (e) { return false; }
  54. }
  55. /**
  56. * 键盘绑定处理
  57. *
  58. * @param {element} window
  59. * @param {U.D.E.SelectionRange} 光标对象
  60. */
  61. U.D.E.KeyboardBinding = function (el, cursor) {
  62. $(el).bind({
  63. "keydown": U.M.apply(cursor, cursor.GetKE), //键盘点击
  64. "keyup": U.M.apply(cursor, cursor.CLKU), //键盘结束处理
  65. "copy": U.M.apply(cursor, cursor.Copy), //键盘结束处理
  66. "paste": U.M.apply(cursor, cursor.Paste), //键盘结束处理
  67. "cut": U.M.apply(cursor, cursor.Cut), //键盘结束处理
  68. //selectstart: U.M.apply(_URE, _URE.selectAll), //页面选择处理函数
  69. "click": U.M.apply(cursor, cursor.CLMU) //点击处理
  70. });
  71. }
  72. /**
  73. * 初始化编辑区域 光标的前进后退有问题 需要用其他的解决方案
  74. *
  75. * @param {window} 触发的域
  76. * @param {document} 触发的域下的document
  77. * @param {element} 当前编辑元素
  78. * @param {object} 传参
  79. -----------[CB] 回调函数
  80. -----------[TF] 识别id
  81. * @param {element} 上级不变的元素
  82. */
  83. U.D.E.SelectionRange = function (UW, UD, UDOD, UDE) {
  84. this.setVariable(UW, UD, UDOD, UDE);
  85. }
  86. ///**
  87. //* 获取可编辑的元素
  88. //*
  89. //* @param {window} 触发的域
  90. //*/
  91. //U.D.E.SelectionRange.GetEditElement = function () {
  92. // //获取可编辑对象
  93. // while (_UCE && ((_UTF = _UCE.tagName.toLocaleLowerCase()) == "p" || _UCE.contentEditable != "true") && _UTF != "body") {
  94. // _UCE = _UCE.parentNode;
  95. // }
  96. // this.PSO = _UCE; //设置可编辑区域值
  97. //}
  98. //使用方法集
  99. U.D.E.SORange = U.D.E.SelectionRange.prototype = {
  100. OAT: {}, //前进后退使用集
  101. OE: {}, //记录创建光标值
  102. setVariable: function (UW, UD, UDOD, UDE) {
  103. this.CW = UW; //编辑的windows层次
  104. this.CD = UD; //编辑的document
  105. this.SO = UDOD || this.Parent(); //编辑区域
  106. this.PSO = $(UDOD).Parent({ "contentEditable": "true" }); //编辑区域的父亲
  107. this.CB = UDE["CB"]; //编辑的回调函数
  108. this.TF = UDE["TF"]; //创建光标的唯一识别码
  109. this.TIM = [];
  110. this.S = null;
  111. this.R = null;
  112. this.J = null;
  113. this.TR = null;
  114. this.BCB = null;
  115. this.FCB = null;
  116. this.Dectect = U.D.E.codeDetect();
  117. this.CTH = "";
  118. },
  119. /**
  120. * 创建一个光标记载查看
  121. *
  122. * @param {boolean} 创建对象时候时候聚焦对象
  123. */
  124. CreateR: function (UTF) {
  125. // U.Ut.AddObj(this, { SO: this.SO || this.Parent(), PSO: this.SO }); //设置当前元素和上级元素
  126. //变量定义
  127. var _b,
  128. _win = this.CW, //当前域
  129. _doc = this.CD; //域下的document对象
  130. //设置加载对象
  131. try {
  132. if (_win.getSelection) { //html5
  133. U.Ut.AddObj(this, { S: _win.getSelection(), TR: _doc.createRange() }); //添加可编辑对象
  134. if (UTF !== false && this.SO) { //聚焦到制定的位置
  135. if (this.SO.focus && (!this.S.rangeCount || !U.M.EISE(this.PSO, this.Parent(this.S.getRangeAt(0))))) { //判断对象是否在元素内
  136. this.SO.focus(); //当前对象聚焦
  137. this.QX(this.getLen(this.SO), this.getLen(this.SO), this.SO); //设置对象在当前位置
  138. this.S = _win.getSelection(); //设置选择区对象
  139. }
  140. }
  141. this.R = this.S.rangeCount ? this.S.getRangeAt(0) : this.R || _doc.createRange(); //选取对象
  142. }
  143. else { //老ie
  144. U.Ut.AddObj(this, { //光标选区的创建
  145. S: _doc.selection, //选取对象
  146. R: _doc.selection.createRange(), //光标对象
  147. TR: document.body.createTextRange() //输入光标对象
  148. });
  149. if ((_UTF = (UTF !== false && this.SO && !U.M.EISE(this.PSO, this.Parent(this.R)))) || UTF) { //需要插入光标
  150. if (_UTF) { //是否聚焦到指定位置中
  151. this.R = this.QX(this.getLen(this.SO), this.getLen(this.SO), this.SO) || this.R; //设置选取位置
  152. }
  153. else { //当前元素聚焦
  154. this.SO.focus();
  155. this.Replace(""); //写入光标
  156. }
  157. this.S = _doc.selection; //插入光标
  158. }
  159. }
  160. } catch (e) { }
  161. return this;
  162. },
  163. /**
  164. * 初始化编辑区域
  165. *
  166. * @param {object} 编辑对象
  167. -----------[CW] 当前域
  168. -----------[CD] 当前域下的doc
  169. -----------[SO] 对象
  170. -----------[{}]
  171. -------[TF] 识别id
  172. -------[CB] 回调函数
  173. -----------[PSO] 编辑的上级元素
  174. * @param {boolean} 变化的数组 实现数组 0 、 1 切换
  175. */
  176. init: function (URE, UTF) { //创建光标监视区域
  177. this.setVariable(URE["CW"], URE["CD"], URE["SO"], { "TF": URE["TF"], "CB": URE["CB"] }, URE["PSO"])
  178. this.CreateR(UTF);
  179. },
  180. //#region 获取指定编辑元素
  181. /**
  182. * 初始化编辑区域
  183. *
  184. * @param {object} 光标对象
  185. * @param {document} 是否连text也获取
  186. */
  187. Parent: function (UDR, UTF, NT) { //获取当前光标所在的区域
  188. if (UDR = UDR || this.R) { //光标存在使用
  189. if (UDR.parentElement || UDR.commonParentElement) { //老IE获取
  190. return (UDR.parentElement || UDR.commonParentElement)(); //上级元素 选择元素区域
  191. }
  192. else { //统一使用
  193. var _UDOD = UDR.commonAncestorContainer;
  194. if (NT) {
  195. return UDR.endContainer.parentElement;
  196. }
  197. return ((_UDOD.nodeName == "#text" && UTF) ? _UDOD.parentNode : _UDOD);
  198. }
  199. }
  200. },
  201. /**
  202. * 获取当前选中的元素
  203. */
  204. Element: function (UDR) {
  205. if (UDR = UDR || this.R) { //光标存在使用
  206. if (UDR.parentElement || UDR.commonParentElement) { //老IE获取
  207. return (UDR.parentElement || UDR.commonParentElement)();
  208. }
  209. else { //统一使用
  210. return UDR.commonAncestorContainer;
  211. }
  212. }
  213. },
  214. /**
  215. * 获取父亲层
  216. *
  217. * @param {object} 光标对象
  218. * @param {document} 是否连text也获取
  219. */
  220. IParent: function (UTH, UDR) {
  221. UTH = U.Ut.isUndefined(UTH) ? this.GetSelectedHtml() : UTH; //选中的蚊子
  222. var _UDPD,
  223. _UDOD = this.Parent(UDR),
  224. _UDTD = $$("div", { "innerHTML": UTH });
  225. while (_UDOD && _UDOD.innerText && (_UDTD.innerText == _UDOD.innerText) && (_UDOD != this.PSO) && (_UDPD = _UDOD)) {
  226. _UDOD = _UDOD.parentNode;
  227. }
  228. return _UDPD;
  229. },
  230. //#endregion
  231. /**
  232. * 文字替换 同时也是插入文字的方法 这里用在 设置文字大小 字号等..
  233. *
  234. * @param {string} 需要插入或者替换的文字
  235. * @param {object} range光标对象
  236. * @param {boolean} 是否聚焦到最后
  237. * @return {object} 光标编辑对象
  238. */
  239. Replace: function (UTS, URD, UTF) { //光标选区文字替换
  240. var i, _userid, _UDOD, _UDCD, _UDTD, _UDSD, _UDE, _UTF, _UST = "",
  241. _UTH = UTS == null ? UTS : (UTS.outerHTML || UTS); //需要插入或者替换的文字
  242. URD = URD || this.R; //光标对象
  243. if (URD && UTS != null) { //判断是否具有光标和替换的文字7
  244. _UDE = [];
  245. _UDOD = this.Parent(URD); //获取上级元素
  246. _userid = "R" + Guid.newGuid();
  247. _UDTD = $$("span", { "id": _userid, "innerHTML": _UTH }); //生成需要写入的数据元素
  248. _UTF = this.GetSelectedText(); //当前需要替换的文字
  249. if (_UDOD != document) { //判断处理的编辑区域是否在原来的编辑框里 U.M.EISE(this.PSO, _UDOD) &&
  250. if (window.getSelection) { //html5
  251. _UDTD = URD.createContextualFragment(_UTH); //创建选取
  252. (_UDOD.innerText == this.GetSelectedText() && _UDOD.innerText) && (URD.selectNodeContents(_UDOD)); //文字聚焦到当前选取中
  253. URD.deleteContents(); //移除文字
  254. this.S.removeAllRanges(); //移除选取
  255. // if (_UDTD.children[0]) {
  256. // URD.selectNodeContents(_UDTD.children[0])
  257. // }
  258. URD.insertNode(_UDTD); //插入选择的蚊子
  259. // if ($("#" + _userid).Child()[0]) {
  260. // URD.selectNodeContents($("#" + _userid).Child()[0]);
  261. // $("#" + _userid)[0].outerHTML = $("#" + _userid)[0].innerHTML;
  262. // }
  263. if (UTF) {
  264. URD.collapse(false);
  265. }
  266. this.S.addRange(URD); //把替换的文章添加到当前指定的选取中
  267. }
  268. else { //老IE兼容
  269. if (!_UDTD.innerText && !$("div", _UDTD).length && !$("div", this.PSO).length) { //无输入的内容 直接新建换行内容符号 div
  270. this.SL($$("div", {}, this.PSO)); //添加输入的div
  271. _UST = _UDTD.innerHTML; //设置使用的值
  272. }
  273. else { //获取需要插入的内容
  274. _UST = (_UDTD.innerHTML && !UTF) ? _UDTD.outerHTML : _UDTD.innerHTML;
  275. }
  276. URD.select(); //选取聚焦
  277. URD.pasteHTML(""); //添加选取文字
  278. URD.pasteHTML(_UST); //添加选取文字
  279. if (UTF || !_UDTD.innerHTML) { URD.collapse(false); } //聚焦到最后
  280. else { //选取聚焦
  281. _UDTD = $("span", this.Parent())[_UDTD.id]; //选择元素
  282. _UDTD.outerHTML = _UDTD.innerHTML; //替换焦点
  283. this.R.select(); //元素聚焦
  284. }
  285. }
  286. this.CreateR(); //选择成功后 重新生成选取 光标
  287. //U.Ut.AddObj(this, { "SO": this.Parent(), "TR": URD }); //设置对象和光标
  288. }
  289. }
  290. return this;
  291. },
  292. //#region 元素选择选区处理
  293. /**
  294. * 指定的位置创建光标选区
  295. *
  296. * @param {number} 文字插入到指定位置
  297. * @param {number} range光标对象
  298. * @param {element} 是否聚焦到最后
  299. * @return {object} 光标编辑对象
  300. */
  301. QX: function (US, UE, UDOD) { //
  302. try {
  303. var _UOE, _UTE,
  304. _UD = this.CD; //使用域下的document
  305. UDOD = UDOD || this.Parent(); //获取元素的上一级
  306. if (window.getSelection) { //Html5
  307. this.S = (this.S || this.CW.getSelection());
  308. (!this.S.rangeCount) && (this.CW.focus(), UDOD.focus(),
  309. this.R = this.S.getRangeAt(0)); //获取选区
  310. if (this.R.commonAncestorContainer != document) { //指定的位置可编辑可聚焦
  311. _UOE = document.createRange();
  312. _UOE.selectNode((UDOD)); //聚焦制定的位置
  313. US = US == null ? _UOE.startOffset : US == -1 ? _UOE.endOffset : US;
  314. UE = UE == null ? _UOE.endOffset : UE == -1 ? _UOE.endOffset : UE; //获取位置
  315. try {
  316. _UOE.setStart((UDOD || this.R.startContainer), US);
  317. _UOE.setEnd((UDOD || this.R.endContainer), UE);
  318. }
  319. catch (e) {
  320. _UOE.setStart(this.R.startContainer, US);
  321. _UOE.setEnd(this.R.endContainer, UE);
  322. }
  323. this.S.removeAllRanges();
  324. this.S.addRange(_UOE); //设置位置
  325. }
  326. }
  327. else { //老IE使用
  328. if (U.Ut.isNumber(US)) {
  329. _UOE = _UD.body.createTextRange();
  330. _UTE = _UD.body.createTextRange();
  331. _UOE.moveToElementText(UDOD);
  332. (U.Ut.isNumber(US)) && (_UOE.moveStart("character", US), _UTE.moveToElementText(UDOD), _UTE.moveStart("character", UE), _UOE.setEndPoint("EndToStart", _UTE));
  333. (US !== UE) && (_UOE.select());
  334. }
  335. else { this.R.select(); }
  336. }
  337. return _UOE;
  338. }
  339. catch (e) { return false; }
  340. },
  341. /**
  342. * 移动光标处理
  343. *
  344. * @param {number} 需要移动的范围
  345. * @return {object} 光标编辑对象
  346. */
  347. moveRange: function (US) {
  348. this.CreateR(false);
  349. if (window.getSelection) { //Html5
  350. try {
  351. this.TR.setStart(this.R.startContainer, this.R.startOffset + US);
  352. this.TR.setEnd(this.R.endContainer, this.R.endOffset);
  353. }
  354. catch (e) { }
  355. this.S.removeAllRanges();
  356. this.S.addRange(this.TR); //设置位置
  357. }
  358. else { //老IE使用
  359. this.TR.moveToElementText(this.Parent());
  360. _UOE.moveStart("character", US);
  361. }
  362. this.CreateR();
  363. },
  364. /**
  365. * 选择选中区域元素
  366. *
  367. */
  368. GetSE: function () {
  369. if (window.getSelection) { //HTML5
  370. _USE = this.CW.getSelection();
  371. _URE = _USE.rangeCount ? _USE.getRangeAt(0) : this.R;
  372. (UDR) && (_URE.setStart(UDR.endContainer, UDR.endOffset));
  373. }
  374. else {//老IE兼容
  375. _USE = document.selection;
  376. _URE = document.selection.createRange();
  377. (UDR) && (_URE.setEndPoint("EndToEnd", UDR));
  378. }
  379. },
  380. /**
  381. * 设定元素为选择元素
  382. *
  383. * @param {element} 文字插入到指定位置
  384. * @param {object} range光标对象
  385. * @return {object} 光标编辑对象
  386. */
  387. SL: function (UDOD, UDR) {
  388. UDOD = UDOD || this.SO;
  389. if (window.getSelection) { //html5选择
  390. (!UDR) && (UDR = document.createRange());
  391. UDR.selectNodeContents(UDOD);
  392. this.S = this.S || this.CW.getSelection();
  393. this.S.removeAllRanges();
  394. this.S.addRange(UDR);
  395. this.R = UDR;
  396. }
  397. else { //老IE选择元素
  398. (!UDR) && (UDR = document.body.createTextRange(), UDR.moveToElementText(UDOD));
  399. UDR.select();
  400. }
  401. // (!UDR) && (UDR = document.body.createTextRange(), UDR.moveToElementText(UDOD)); UDR.collapse(false); UDR.select();
  402. return this;
  403. },
  404. //#endregion
  405. //#region 获取文字
  406. /**
  407. * 获取当前选区的html
  408. *
  409. * @param {object} range对象
  410. */
  411. GetSelectedHtml: function (UDR) {
  412. if ((UDR = UDR || this.R)) {
  413. var i, _UDAD, _UDCD, _URE, UST = "",
  414. _UIE = 1;
  415. if (UDR.cloneContents) { //判断是否
  416. var _UDOD = $$("div");
  417. _UDOD.appendChild(UDR.cloneContents());
  418. UST = _UDOD.innerHTML;
  419. _UDCD = $($$("div", { "innerHTML": UST })).Nodes();
  420. UST = "";
  421. for (i = 0; i < _UDCD.length; i++) {
  422. UST += _UDCD[i].outerHTML ? _UDCD[i].outerHTML : "<span>" + _UDCD[i].data + "</span>";
  423. }
  424. }
  425. else if (UDR.commonParentElement) {
  426. UST = UDR.commonParentElement();
  427. UST = UST.outerHTML || UST.innerHTML || UST.value || "";
  428. }
  429. else {
  430. UST = UDR.htmlText;
  431. _UDAD = $$("div", { "innerHTML": UDR.htmlText }).childNodes;
  432. if (_UDAD.length) {
  433. UST = ""; _URE = UDR.duplicate();
  434. _URE.moveStart("character", -1);
  435. _UDCD = $($$("div", { "innerHTML": _URE.htmlText })).Nodes();
  436. if ((_UDCD.length == _UDAD.length && _UDAD[0].outerHTML == _UDCD[0].outerHTML) || (_UDCD.length != _UDAD.length && _URE.htmlText != UDR.htmlText)) {
  437. UST = $$("div", { "innerHTML": _UDAD[0].outerHTML || _UDAD[0].nodeValue || _UDAD[0].data || _UDAD[0].text }).innerHTML;
  438. }
  439. else {
  440. UST = ($($$("div", { "innerHTML": _UDAD[0].innerHTML })).Child().length ? _UDAD[0].innerHTML : (_UDAD[0].innerHTML || _UDAD[0].nodeValue || _UDAD[0].data || _UDAD[0].text ? $$("span", { "innerHTML": _UDAD[0].innerHTML || _UDAD[0].nodeValue || _UDAD[0].data || _UDAD[0].text }).outerHTML : ""));
  441. }
  442. if (_UDAD.length > 1) {
  443. for (i = 1; i < _UDAD.length - 1; i++) {
  444. UST += _UDAD[i].outerHTML || _UDAD[i].nodeValue || _UDAD[i].data || _UDAD[i].text;
  445. }
  446. _URE = UDR.duplicate(); _URE.moveEnd("character", 1);
  447. _UDCD = $($$("div", { "innerHTML": _URE.htmlText })).Child();
  448. if ((_UDCD.length == _UDAD.length && _UDAD[_UDAD.length - 1].outerHTML == _UDCD[_UDCD.length - 1].outerHTML) || (_UDCD.length != _UDAD.length && _URE.htmlText != UDR.htmlText)) {
  449. UST += $$("div", { "innerHTML": _UDAD[_UDAD.length - 1].outerHTML || _UDAD[_UDAD.length - 1].nodeValue || _UDAD[_UDAD.length - 1].data || _UDAD[_UDAD.length - 1].text }).innerHTML;
  450. }
  451. else {
  452. UST += ($($$("div", { "innerHTML": _UDAD[_UDAD.length - 1].innerHTML })).Child().length ? _UDAD[_UDAD.length - 1].innerHTML : _UDAD[_UDAD.length - 1].innerHTML || _UDAD[_UDAD.length - 1].nodeValue || _UDAD[_UDAD.length - 1].data || _UDAD[_UDAD.length - 1].text ? $$("span", { "innerHTML": _UDAD[_UDAD.length - 1].innerHTML || _UDAD[_UDAD.length - 1].nodeValue || _UDAD[_UDAD.length - 1].data || _UDAD[_UDAD.length - 1].text }).outerHTML : "");
  453. }
  454. }
  455. }
  456. }
  457. return UST;
  458. }
  459. },
  460. /**
  461. * 设定元素为选择元素
  462. *
  463. * @param {element} 获取当前光标选区的text
  464. */
  465. GetSelectedText: function (UDR) {
  466. return (UDR = UDR || this.R) == null || UDR.add ? null : UDR.text != undefined ? UDR.text : (this.S.toString()); //全兼容的获取
  467. },
  468. //#endregion
  469. //#region 键盘操作处理
  470. /**
  471. * 设定元素为选择元素
  472. *
  473. * @param {string}
  474. */
  475. GetKE: function (UTF) { //输入处理
  476. var i, _UCE, _UDE, _UKE, _UL, _UDSD,
  477. _UTP = this.TF;
  478. UTF = UTF && U.Ut.isString(UTF) ? UTF : this.Dectect.getValue(); //获取键盘的值
  479. switch (UTF) {
  480. case "redo": //前进
  481. // U.M.StopDefault();
  482. // _UDE = this.OAT[_UTP];
  483. // _UL = _UDE.l;
  484. // _UKE = _UDE[_UL]; //使用值
  485. // for (i = _UL; i < _UDE.length; i++) {
  486. // if (_UDE[i].C) {
  487. // _UCE = _UDE[i]; _UDE.l = i; break;
  488. // }
  489. // } //获取使用列
  490. // if (_UCE) {
  491. // if (!window.getSelection) { //光标位置使用
  492. // try {
  493. // _UKE = _UKE.OR.R;
  494. // if (_UCE.P.boundingLeft || _UCE.P.boundingTop) {
  495. // _UCE.OR.R.moveToPoint(_UCE.P.boundingLeft, _UCE.P.boundingTop);
  496. // };
  497. // }
  498. // catch (e) {
  499. // try {
  500. // if (_UCE.OR.R.boundingTop < _UCE.P.boundingTop) {
  501. // _UCE.OR.R.moveToPoint(_UKE.boundingLeft + _UKE.boundingWidth - 1, _UKE.boundingTop);
  502. // }
  503. // } catch (e) { }
  504. // }
  505. // }
  506. // _UCE.OR.Replace(_UCE.C); _UCE.C = "";
  507. // }
  508. break;
  509. case "undo": //后退
  510. // (this.TIM[1]) && (this.TIM[1]());
  511. // _UDE = this.OAT[_UTP];
  512. // _UL = _UDE.l;
  513. // _UCE = _UDE[_UL];
  514. // U.M.StopDefault();
  515. // if (!_UCE.OR.GetSelectedText()) {
  516. // if (_UL > 0) {
  517. // _UL = (_UDE.l -= 1);
  518. // _UCE = _UDE[_UL];
  519. // } else { _UCE = null; }
  520. // }
  521. // if (_UCE) {
  522. // _UCE.C = _UCE.C || _UCE.OR.GetSelectedHtml();
  523. // _UCE.OR.Replace("");
  524. // }
  525. break;
  526. default:
  527. // if (U.Ut.isNumber(UTF[0])) { //是否为数字
  528. // if (UTF[0] == 9) { //tab处理
  529. // U.M.StopDefault();
  530. // this.CreateR().Replace("&emsp;", null, true); //插入tag值
  531. // }
  532. // // else if (!(UTF[1] || UTF[2]) && UTF[4].length < 2) { //需要重新记录
  533. // // _UDE = this.OAT[_UTP];
  534. // // if (_UDE.l != _UDE.length - 1) {
  535. // // _UDE[_UDE.l].C = "";
  536. // // _UDE.splice(_UDE.l + 1, _UDE.length);
  537. // // }
  538. // // else {
  539. // // this.ADQJ();
  540. // // }
  541. // // }
  542. // else if (!(UTF[1] || UTF[2]) && (UTF[0] == 13 || UTF[0] == 8 || UTF[0] == 3 || (UTF[0] > 32 && UTF[0] < 40) || UTF[0] == 46 || (UTF[0] > 63231 && UTF[0] < 63236) || (UTF[0] > 63272 && UTF[0] < 63278 && UTF[0] != 63274)) && this.TF) { //特殊键处理
  543. // }
  544. // }
  545. break;
  546. }
  547. if (this.CB && this.CB(U.Ut.isString(UTF) ? UTF : UTF[4], [this.Parent()], this, UTF, window) === 1) { //回调设置
  548. // U.M.StopDefault();
  549. }
  550. },
  551. /**
  552. * 键盘输入输出处理
  553. *
  554. */
  555. CLKU: function () {
  556. var _UDPD = this.PSO,
  557. _UTF = this.Dectect.getValue(); //获取键盘属性值
  558. // //后退键的处理
  559. // if (_UTF[4] == "Backspace" && !$(_UDPD).Child().length) { } //后退键处理
  560. // //方向输出键
  561. // else if (!(_UTF[1] || _UTF[2]) && (_UTF[0] == 13 || _UTF[0] == 8 || _UTF[0] == 3 || (_UTF[0] > 32 && _UTF[0] < 40) || _UTF[0] == 46 || (_UTF[0] > 63231 && _UTF[0] < 63236) || (_UTF[0] > 63272 && _UTF[0] < 63278 && _UTF[0] != 63274))) {
  562. // this.ADQJS("");
  563. // }
  564. //执行回调使用
  565. if ((this.CB) && (this.CB("UP", [this.Parent()], this, _UTF, window) == 1)) {
  566. // U.M.StopDefault();
  567. }
  568. //this.CreateR(false); //创建记录
  569. },
  570. //#endregion
  571. /**
  572. * 点击时候创建光标
  573. *
  574. * @param {element} 需要复制到的元素
  575. */
  576. CLMU: function () {
  577. // this.ADQJS("");
  578. this.CreateR(); //重新记录光标
  579. var mb = window.parent.document.getElementsByClassName("UD_SYF_S UD_SYKO")[window.parent.document.getElementsByClassName("UD_SYF_S UD_SYKO").length - 1];
  580. // UDPD = $(this.Parent(null, true,true)).Parent({ "tagName": "DIV" }); //获取当前行的元素
  581. _UTH = this.getBoundingClientRect(); //获取光标位置和大小
  582. // U.Alert(_UTH.height);
  583. // window.parent.document.getElementById("UD_Word"+U.Word.TF.fileinfo.UserDirectoryParentID).children[2].children[0].children[0].children[0].children[7].children[0].value=this.Parent(null, true,true).style.fontSize||"10.5pt";
  584. mb.children[2].children[0].children[0].children[0].children[7].children[0].value = this.Parent(null, true, true).style.fontSize || "10.5pt";
  585. },
  586. //#endregion
  587. Cut: function () {
  588. this.CreateR(); //重新记录光标
  589. this.CTH = this.GetSelectedHtml(); //复制的文字处理
  590. if (this.CB && this.CB("Cut", [this.Parent()], this, "Cut", window) === 1) { //回调设置
  591. // U.M.StopDefault();
  592. }
  593. },
  594. /**
  595. * 复制
  596. *
  597. * @param {string} 需要复制的位置
  598. */
  599. Copy: function () { //复制
  600. this.CreateR(); //重新记录光标
  601. this.CTH = this.GetSelectedHtml(); //复制的文字处理
  602. if (this.CB && this.CB("Copy", [this.Parent()], this, "Cut", window) === 1) { //回调设置
  603. // U.M.StopDefault();
  604. }
  605. },
  606. /**
  607. * 粘贴
  608. *
  609. * @param {element} 需要粘贴到的元素
  610. */
  611. Paste: function (UDOD) { //粘贴
  612. this.CreateR(); //重新记录光标
  613. if (this.CB && this.CB("Paste", [this.Parent()], this, "Cut", window) === 1) { //回调设置
  614. // U.M.StopDefault();
  615. }
  616. // if (this.CTH) {
  617. // if (UDOD) { //添加到指定的元素
  618. // UDOD.innerHTML = this.CTH.outerHTML || this.CTH;
  619. // }
  620. // else { //添加到指定的位置
  621. // this.Replace(this.CTH, null, true); this.CLMU();
  622. // }
  623. // }
  624. },
  625. /**
  626. * 指定的文字生成写入的样式元素
  627. *
  628. * @param {string} 需要写入的文字
  629. * @param {object} 转化的样式集 {width:100px,height:100px}
  630. * @return {string} 需要粘贴到的元素
  631. */
  632. SetStyle: function (UTH, UDE) { //写入样式生成元素
  633. var i, _UDAD, _UTH = "",
  634. _UDOD = $$("span", { "innerHTML": UTH });
  635. this.writeStyle(_UDOD, UDE); //设置样式输出
  636. return $("*", _UDOD).length ? _UDOD.innerHTML : _UDOD.outerHTML; //设置新的样式
  637. },
  638. /**
  639. * 通过元素设置样式
  640. *
  641. * @param {string} 需要写入的元素
  642. * @param {object} 转化的样式集 {width:100px,height:100px}
  643. * @return {string} 需要粘贴到的元素
  644. */
  645. writeStyle: function (UDOD, UDE) { //
  646. var i, j, _UTF,
  647. _UKE = {},
  648. _UCE = {},
  649. _USE = ["textAlign"], //textAlign 无法设置行内元素 要设置块状元素才可以
  650. _UDPD = this.Parent(), //上级元素
  651. _UDAD = $(UDOD).Nodes(); //获取所有的子元素
  652. while (_UDPD.tagName == "SPAN") {
  653. _UDPD = $(_UDPD).Parent();
  654. }
  655. //循环需要添加的样式集合
  656. for (i in UDE) {
  657. if (UDE.hasOwnProperty(i)) {
  658. if (_USE.indexOf(U.M.CssTHH(i)) > -1 ? _UCE : _UKE == _UCE) { //判断样式中是否有行内元素无法设置的样式 如果有就添加到全局设置样式的区域
  659. _UCE[i] = UDE[i][0] == _UDPD.style[i] ? UDE[i][1] : UDE[i][0];
  660. }
  661. else { //可设置样式区域
  662. _UKE[i] = UDE[i][0];
  663. if (UDOD.style && UDOD.style[i] == UDE[i][0]) { //判断元素的样式是否已经存在
  664. _UKE[i] = UDE[i][1];
  665. }
  666. else {
  667. //子元素设置样式
  668. for (j = 0; j < _UDAD.length; j++) {
  669. if (_UDAD[j].style && _UDAD[j].style[i] == UDE[i][0]) {
  670. _UKE[i] = UDE[i][1]; break;
  671. }
  672. }
  673. }
  674. }
  675. }
  676. }
  677. //设置只有块状元素才能设置的样式
  678. (_UDPD.style) && ($(_UDPD).addAttrArray({ "style": _UCE }));
  679. //所有元素设置指定的样式
  680. $(UDOD).addAttrArray({ "style": _UKE });
  681. $("*", UDOD).addAttrArray({ "style": _UKE });
  682. },
  683. /**
  684. * 获取光标据制定元素所在的位置
  685. *
  686. * @param {element} 指定的元素
  687. * @param {boolean} 获取到指定的元素的开头的范围
  688. * @return {number} 范围
  689. */
  690. GetGBWZ: function (UDOD, UTF) {
  691. var _USE, _URE, _UDTD;
  692. if (window.getSelection) {//HTML5
  693. _USE = this.CW.getSelection();
  694. _URE = _USE.rangeCount ? _USE.getRangeAt(0) : this.R;
  695. return UTF ? _URE.startOffset : _URE.endOffset;
  696. }
  697. else { //ie
  698. try {
  699. UDOD = UDOD || this.Parent();
  700. _URE = this.QX(0, 0, UDOD);
  701. _URE.setEndPoint("EndTo" + (UTF ? "Start" : "End"), this.R);
  702. return (_UDTD = $$("div", { "innerHTML": _URE.htmlText })).innerText.length + ($("img", _UDTD).length);
  703. } catch (e) { }
  704. }
  705. return 0;
  706. },
  707. /**
  708. * 获取光标据制定元素所在的位置
  709. *
  710. * @param {element} 指定的元素
  711. * @param {boolean} 获取到指定的元素的开头的范围
  712. * @return {number} 范围
  713. */
  714. getBoundingClientRect: function () {
  715. if (window.getSelection) {//HTML5
  716. return this.R.getBoundingClientRect();
  717. }
  718. else {
  719. return {
  720. bottom: this.R.P.boundingBottom,
  721. height: this.R.P.boundingHeight,
  722. left: this.R.P.boundingLeft,
  723. right: this.R.P.boundingRight,
  724. top: this.R.P.boundingTop,
  725. width: 1,
  726. x: this.R.P.boundingLeft,
  727. y: this.R.P.boundingTop
  728. };
  729. }
  730. },
  731. /**
  732. * 判断是否在相同的范围
  733. *
  734. * @param {object} range 光标对象
  735. * @return {booean} 是否在指定的范围中
  736. */
  737. IsP: function (UDR) {
  738. if (!UDR) { return true; }
  739. if (window.getSelection) {
  740. var _UDE = document.getSelection();
  741. return (!_UDE.rangeCount || ((_UDE = _UDE.getRangeAt(0)) && UDR.endContaine == _UDE.endContaine && UDR.startContaine == _UDE.startContaine && UDR.endOffset == _UDE.endOffset && UDR.startOffset == _UDE.startOffset));
  742. }
  743. else {
  744. try { return UDR.isEqual(document.selection.createRange()); } catch (e) { }
  745. }
  746. return false;
  747. },
  748. /**
  749. * 判断元素是否在指定区域
  750. *
  751. * @param {object} range 光标对象
  752. * @return {booean} 是否在指定的范围中
  753. */
  754. isE: function (UDOD) {
  755. if (window.getSelection) { //HTML5
  756. return this.S.containsNode(UDOD, true);
  757. }
  758. else {
  759. _URE = document.body.createTextRange();
  760. try {
  761. _URE.moveToElementText(UDOD);
  762. return this.R.inRange(_URE);
  763. }
  764. catch (e) { return false; }
  765. }
  766. },
  767. /**
  768. * 选取元素计算长度
  769. *
  770. * @param {object} 元素
  771. * @return {number} 元素文字的长度
  772. */
  773. getLen: function (UDOD) { //
  774. return $("img", UDOD).length + UDOD.innerText.length;
  775. },
  776. //#region 前进后退处理区域
  777. /**
  778. * 输入等待添加前进后退
  779. *
  780. * @param {obnject} U.D.E.SelectionRange的派生对象
  781. * @return {funciotn} 光标记录回调函数
  782. */
  783. ADQJ: function (UDR) {
  784. clearTimeout(this.TIM[0]); //清除等待
  785. this.TIM[0] = setTimeout((this.TIM[1] = U.M.apply(this, [[this.ADQJS, ["", UDR]]])), 500); //等待生成记录
  786. return this.TIM[1]; //返回回调
  787. },
  788. /**
  789. * 添加前进后退记录
  790. *
  791. * @param {string} 前进后退记录的内容
  792. * @param {object} U.D.E.SelectionRange的派生对象
  793. */
  794. ADQJS: function (UHT, UDR) { //判断添加
  795. clearTimeout(this.TIM[0]); //清除等待
  796. this.TIM = []; //记录前进后退的对象
  797. this.JHGB(UHT, UDR, this); //记录
  798. },
  799. /**
  800. * 记录前进后退(每一次结束自动创建)
  801. *
  802. * @param {string} 前进后退记录的内容
  803. * @param {object} U.D.E.SelectionRange的派生对象
  804. * @param {object} 当前使用的this对象
  805. */
  806. JHGB: function (UHT, UDR, UE) {
  807. var _UTF = this.TF, //标记 识别id
  808. _UDE = this.OAT[_UTF], //获取识别id下的光标对象
  809. _UKE = this.IsP(_UDE[_UDE.l]["OR"]["R"]); //判断光标是否上次记录的范围
  810. (!_UKE && _UTF) && (this.AddHT(UHT, UDR, UE)); //如果没有记录该光标 记录
  811. },
  812. /**
  813. * 添加前进后退区域 直接传参记录
  814. *
  815. * @param {string} 前进后退记录的内容
  816. * @param {object} U.D.E.SelectionRange的派生对象
  817. * @param {object} 当前使用的this对象
  818. */
  819. AddHT: function (UHT, UDR, UE) {
  820. var i, _UTP,
  821. _UTF = this.TF, //识别id
  822. _UDE = this.OAT[_UTF], //识别id下前进后退所有的对象
  823. _UOE = _UDE[_UDE.l]; //当前前进后退所在的对象
  824. _UDE.l++; //生成新的对象的位置
  825. _UDE.splice(_UDE.l, _UDE.length - _UDE.l, (_UTE = { "OR": new this.init(UE, false), "C": (UHT || "") })); //添加新的前进后退对象
  826. if (window.getSelection) { //html5 光标保存
  827. _UOE["OR"]["R"].setEnd(_UTE["OR"]["R"].startContainer, _UTE["OR"]["R"].startOffset);
  828. }
  829. else { //ie位置大小保存
  830. _UTE = ["boundingWidth", "offsetLeft", "boundingLeft", "boundingTop", "offsetTop", "boundingHeight"]; //这里为光标的位置记录
  831. _UOE.P = {};
  832. for (i = 0; i < _UTE.length; i++) { //循环记录光标
  833. _UOE.P[_UTE[i]] = _UOE.OR.R[_UTE[i]];
  834. }
  835. }
  836. },
  837. /**
  838. * 失去焦点的时候保存
  839. *
  840. * @param {element} 需要粘贴到的元素
  841. */
  842. Brul: function () {
  843. (this.TIM[1]) && (this.TIM[1]());
  844. }
  845. //#endregion
  846. }
  847. //前进后退的处理 需要修改
  848. U.D.E.SORange.init.prototype = U.D.E.SORange;
  849. //前进后退处理函数区域
  850. //#region 编辑器提供的接口处理区域
  851. /**
  852. * 设置选择区域的样式处理
  853. *
  854. * @param {element} 编辑元素
  855. * @param {element} 需要修改的样式集
  856. * @param {element} 光标方法集合对象
  857. * @param {element} 光标所在的域的识别id
  858. * @return {element} 需要粘贴到的元素
  859. */
  860. U.D.E.FontSizeType = function (UDOD, USE, UDE, UTF) {
  861. UDE = UDE || U.D.E.GetSelectionRange(window, UDOD, { "TF": UTF || "QL" }); //获取光标方法集
  862. var i, _UFT,
  863. _UST = "", //获取设置样式后的html值
  864. _UKE = {}, //最终修改样式的值
  865. _UDPD = UDE.Parent(), //获取父亲层
  866. _UTH = UDE.GetSelectedHtml(); //选择的元素
  867. //获取可设置样式的层
  868. while (!_UDPD.tagName) {
  869. _UDPD = $(_UDPD).Parent();
  870. }
  871. //样式设置
  872. for (i in USE) {
  873. if (USE.hasOwnProperty(i)) {
  874. USE[i] = typeof USE[i] == "object" ? USE[i] : [USE[i], USE[i]];
  875. _UKE[i] = USE[i];
  876. }
  877. }
  878. //有选取
  879. if (_UTH) {
  880. _UST = UDE.SetStyle(_UTH, USE);
  881. USE = USE;
  882. }
  883. else {
  884. UDE.writeStyle(UDE.Parent(null, true), USE);
  885. }
  886. UDE.Replace(_UST, null, _UST ? null : true);
  887. return UDE; //生成添加的内容
  888. }
  889. //#endregion
  890. //键盘检查器
  891. U.D.E.codeDetect = (function () {
  892. var _UKE = { 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause",
  893. 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left",
  894. 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 48: "0", 49: "1", 50: "2", 51: "3", 52: "4", 53: "5", 54: "6", 55: "7", 56: "8", 57: "9", 59: ";", 65: "A", 66: "B", 67: "C", 68: "D", 69: "E", 70: "F", 71: "G", 72: "H", 73: "I", 74: "J", 75: "K", 76: "L", 77: "M", 78: "N", 79: "O", 80: "P", 81: "Q", 82: "R", 83: "S", 84: "T", 85: "U", 86: "V", 87: "W", 88: "X", 89: "Y", 90: "Z", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 127: "Delete", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\"", 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63236: "F1", 63237: "F2", 63238: "F3", 63239: "F4", 63240: "F5", 63241: "F6", 63242: "F7", 63243: "F8", 63244: "F9", 63245: "F10", 63246: "F11", 63247: "F12", 63272: "Delete", 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
  895. },
  896. _USE = { "alt": [[37, "goLineStart"], [38, "goDocStart"], [39, "goLineEnd"]], "ctrl": [[65, "selectAll"], [8, "delGroupBefore"], [67, "copy"], [86, "paste"], [68, "deleteLine"], [46, "delGroupAfter"], [40, "goDocEnd"], [63275, "goDocEnd"], [70, "find"], [71, "findNext"], [63273, "goDocStart"], [37, "goGroupLeft"], [39, "goGroupRight"], [83, "save"], [89, "redo"], [90, "undo"], [219, "indentLess"], [221, "indentMore"]], "shift-ctrl": [[70, "replace"], [71, "findPrev"], [82, "replaceAll"], [90, "redo"]] },
  897. _ = function (UDE) { return new _.init(UDE); }; //初始化查看使用
  898. U.Ut.AddObj(_, _.prototype = {
  899. init: function (UDE) { //初始化检测器
  900. UDE = UDE || {}; U.Ut.AddObj(this, UDE); (UDE.el) && (this.bind(UDE.el));
  901. },
  902. bind: function (UDOD) { //绑定函数时间
  903. $(UDOD).bind({ keydown: U.M.apply(this, this.down) });
  904. },
  905. down: function () { //键盘事件
  906. (this.cb) && (this.cb.call(this, this.getValue(), this.el));
  907. },
  908. getValue: function () { //根据输入获取检测器值
  909. var i, j, _UGE, _UCE, e = event, k = e.keyCode; //基础编辑器快捷键
  910. _UGE: for (i in _USE) {
  911. if (_USE.hasOwnProperty(i)) {
  912. _UCE = i.split("-"); for (j = 0; j < _UCE.length; j++) { if (!e[_UCE[j] + "Key"]) { continue _UGE; } } for (j = 0; j < _USE[i].length; j++) {
  913. if ((_UCE = _USE[i][j])[0] == k) {
  914. return _UCE[1];
  915. };
  916. }
  917. }
  918. }
  919. return [k, e.altKey, e.ctrlKey, e.shiftKey, _UKE[k] || ""];
  920. },
  921. set: function () { //键盘设置 允许自定义键监视
  922. }
  923. });
  924. _.init.prototype = _; return _;
  925. })()