U.CD.Code.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. /*代码显示窗口*/
  2. Namespace.register("U.CD.CD");
  3. //------------------------------------------------------当拖动一个元素到iframe区域后,追加代码到Code区域-------------------------------
  4. //参数h为待追加元素。
  5. U.CD.CD.AppendHTML = function (h) {
  6. //获取代码区域
  7. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  8. var _ins = U.CD.CD.SplitHTML(h.outerHTML); //待插入元素数组。//有些浏览器不支持此属性,没办法。只能随主流。
  9. //找到Body所在节点。
  10. var _codes = _CA.getElementsByTagName("div"); //获取代码区域div数组,以循环查找body。解决了前后空格问题
  11. for (var i = 0; i < _codes.length; i++) {
  12. if (_codes[i].innerText.trim().toLowerCase() == "<body>") {//找到Body后追加添加的元素。
  13. //找到>符合的位置,下面元素前面追加几个空格
  14. var _space = _codes[i].innerText.indexOf('>') - 1;
  15. //在元素前面追加空格,封装到U.UF.S。很多地方要用到。
  16. for (var j = 0; j < _ins.length; j++) {
  17. var _d = $$("div", { "className": "UCD_R_C_Line", "innerText": _ins[j].addPreSpace(_space) }); //带插入div内容
  18. _CA.insertBefore(_d, _codes[i + 1 + j]); //javascript只有插入前面的函数,插入位置需要计算。
  19. U.CD.CD.DrawLine(_HH, _CA); //插入行号。
  20. }
  21. return; //插入完毕后返回
  22. }
  23. }
  24. }
  25. //此函数已经转移到主项目中
  26. U.UF.EV.addPrototype(String, "addPreSpace", function (n) { var i, k = ""; for (i = 0; i < n; i++) k += " "; return k + this; }); //在字符串前面追加n个空格
  27. //---------------------------------------------------初始化时根据iframe的内容刷新代码区域的初始内容--------------------------------
  28. //代码区域初始化函数。好像还没有初始化哦。只能在系统第一次运行时调用?
  29. U.CD.CD.Init = function (node) {
  30. //获取CD文件的内容追加到Code区域,最好能实现换行操作,此种方法由于不支持Chrome,所以另外做了一个函数。
  31. //var _i = $("#UCD_CT_SM_IF")[0]; _i.src = "http://d.1473.cn/RS.htm?ver="+Math.random();
  32. //U.MD.IframeLoad(_i, [[U.CD.CD.InitAsyn, ([_i])]]);
  33. //用户未登录或者点击新建文件时之前执行的内容。直接获取iframe中内容,反馈到代码窗口。当结果视图有值时,新建文件就会有内容,导出出错,必须重新刷新。
  34. //U.CD.CD.DrawCode($("#UCD_CT_SM_IF")[0].contentWindow.document.documentElement.outerHTML);
  35. U.CD.CD.DrawCode(U.CD.CD.InitCode(), false); //初始化代码后绘制在代码窗口
  36. U.CD.CD.ExecIF($('#UCD_CT_Code_CT')[0]);
  37. U.CD.R.Save(node); //初始化保存按钮。此处还可以简化,明天再来。
  38. }
  39. //iframe加载Cd.htm异步回调。
  40. U.CD.CD.InitAsyn = function (i) {
  41. //如果是Chrome,缓存了上一次iframe的内容,好心做了坏事啊。。iframe还是记录了上一次的内容。
  42. //看来初始化要换一种方法,直接写入编码到代码区域,然后输出到iframe中。
  43. U.CD.CD.DrawCode(i.contentWindow.document.documentElement.outerHTML, true);
  44. } //获取RS.htm的所有内容。
  45. //------------------------------------------------根据代码窗口刷新结果窗口的值。----------------------------------------
  46. //根据代码区域的innerText刷新iframe显示结果,很多地方用到,封装为一个函数。小窗口运行效果。
  47. //参数_CA为$("#UCD_CT_Code_CT")[0]代码元素。给代码窗口赋值,只能通过给代码窗口赋值,然后获取代码窗口innerText,才能最简单的得到给iframe打印的值,否则会带html标签到iframe。
  48. U.CD.CD.DisNode = function (node) {
  49. var _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  50. // console.log(node.Content);
  51. //数据库中保存的是所有的Div,带了样式,如果不带样式,则javascript,css必须用算法计算出来,比较复杂,暂时解决不了。,
  52. _CA.innerHTML = node.Content; //所以暂时浪费存储,求取简单化。,此上下2句话是把包含了hmtl标记的字符全部转换为没有html标记的字符,有技巧。
  53. //晕,下面这句做执行时做就OK了。
  54. //_CA.innerText = U.CD.CD.Is1473Domain(_CA.innerText); //检测node.Content是否包含了1473主域,没包含会导致跨域问题,直接追加一个1473主域js。
  55. U.CD.CD.DrawCode(_CA.innerText, false); //调用统一的往代码窗口赋值函数,包括初始化从iframe中获取,已经装载用户自己的文件代码。
  56. U.CD.R.Save(node); //保存结果?在打开的时候给保存按钮赋予保存事件!因为会打开多个文件,每个文件都会有对象的事件,一直发生变化
  57. }
  58. //--------------------------------------------------------------通用方法---------------------------------------------
  59. //当在Code编辑区中按下了回车键时,执行换行符操作,并刷新结果窗口,键盘回车键可能是13,也可能是10
  60. //gs触发的格式:比如通过onkeydown触发的,返回qt。做switch判断到底是什么样子的键盘事件
  61. //r是返回值。
  62. //一个复杂的函数,统一的功能,用户统一处理函数,做一个回调。
  63. U.CD.R.Wrap = function (gs, r) {
  64. //_HH代码行号 _CA代码区域 _T 提示信息
  65. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0], _T = $("#UCD_TP_TB")[0];
  66. var _k = event.keyCode; //键盘按下的键值
  67. //U.CD.Tip.KeyDown(_k, r); //转到代码提示窗口判断,由于键盘事件是依附于某一个div。所以要单独做在提示框中。
  68. //alert(_k); //因为主空函数编辑器区域把光标也监控了,所以排除0这个键值,即光标。
  69. //如果按下了Tab键盘,空4格子,已经在UC里面统一处理了。。。。
  70. if (_k == 9) {
  71. //var _R = U.UF.E.GetSelectionRange(window, $("#UCD_CT_Code_CT")[0], document); //获取光标位置。
  72. //var _G = _R.Replace("&nbsp;&nbsp;&nbsp;&nbsp;"); //追加4个空格到光标前面
  73. //U.M.StopDefault();
  74. //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //要重新添加代码框键盘事件才能再次触发?
  75. }
  76. //如果按下了删除Delete键盘。有可能用户删除了一个字符,也可能删除了一个行的div。需要重新计算行数,才能匹配
  77. if (_k == 46 || _k == 8) {
  78. //此函数响应不及时,原因还待分析,暂时这样。
  79. var _last, _lines = _HH.childNodes.length - _CA.childNodes.length;
  80. var _t = $("#UCD_CT_HH_CT")[0].childNodes.length, c, y;
  81. document.getSelection().anchorNode.className == 'UCD_R_C_Line' ? y = document.getSelection().anchorNode : y = document.getSelection().anchorNode.parentElement
  82. var _a = U.CD.getNodeIndex(y); //获取当前div是第几个
  83. // for (var i = 0; i <= _lines; i++) {
  84. // _last = _HH.lastElementChild || _HH.lastChild; //兼容写法,其实可以做成自己的函数,这里要做自己的函数!!!
  85. // _HH.removeChild(_last);
  86. // }
  87. var qn = setTimeout(function () {
  88. if (_CA.childNodes.length <= _HH.childNodes.length) {
  89. // if (_HH.childNodes.length - _CA.childNodes.length == 1) {
  90. for (var i = _HH.childNodes.length; i > parseInt($("#UCD_CT_Code_CT")[0].scrollHeight / 20); i--) {
  91. _HH.childNodes[i - 1].remove();
  92. }
  93. // for (var i = _a; i < _t; i++) {
  94. //// if (i % 2 == 1) {
  95. //// $("#UCD_CT_Code_CT")[0].childNodes[i - 1].style.background = "rgba(245,245,245,0.5)"
  96. //// } else {
  97. // $("#UCD_CT_Code_CT")[0].childNodes[i].style.background = ""
  98. //// }
  99. // }
  100. for (var i = 0; i <= _CA.childNodes[_CA.childNodes.length - 1].childNodes.length; i++) {
  101. if (($("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i] && $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].tagName) == 'SPAN') {
  102. var _T = $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].innerText;
  103. $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].remove();
  104. $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].innerText += _T;
  105. return;
  106. }
  107. }
  108. if ($("#UCD_CT_HH_Code")[0].clientHeight > $("#UCD_CT_HH_Code")[0].scrollHeight) {
  109. $("#UCD_CT_HH_Code")[0].scrollTop -= 25;
  110. }
  111. // } else {
  112. // for (var i = _HH.childNodes.length; i > _CA.childNodes.length; i--) {
  113. // _HH.childNodes[i - 1].remove();
  114. // }
  115. // for (var i = 0; i <= _CA.childNodes[_CA.childNodes.length - 1].childNodes.length; i++) {
  116. // if (($("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i]&&$("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].tagName) == 'SPAN') {
  117. // var _T = $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].innerText;
  118. // $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].remove();
  119. // $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].innerText += _T;
  120. // return;
  121. // }
  122. //
  123. // }
  124. // if ($("#UCD_CT_HH_Code")[0].clientHeight > $("#UCD_CT_HH_Code")[0].scrollHeight) {
  125. // $("#UCD_CT_HH_Code")[0].scrollTop -= 25;
  126. // }
  127. // }
  128. }
  129. }, 50);
  130. }
  131. if (_k == 10 || _k == 13 && gs != "UP") {
  132. //如果代码输入提示框已经出现,则回车键作用于提示框
  133. if (_T.style.display == "none") {
  134. //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js,所以,不允许。//获取当前光标选中的字符包含的div。
  135. //if (!U.CD.CD.StrFilter(U.CD.TipR.GetPStyle())) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。
  136. if (!U.CD.CD.StrFilter(U.CD.TipR.Parent(null, true))) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。
  137. U.M.StopDefault();
  138. U.CD.CD.DrawLine(_HH, _CA); //添加新行
  139. U.CD.CD.newLine(U.CD.TipR.Parent(null, true));
  140. //同时需要检测新行的颜色为绿色,则要变成默认的,编辑器比较复杂啊
  141. U.CD.CD.FushIframe(_CA); //根据代码窗口内容刷新小窗口iframe中立时显示的内容
  142. }
  143. }
  144. if (_k == 0) { _T.style.display = "none"; } //获取到编辑区域光标事件后,隐藏提示框
  145. //如果是.号,显示代码提示窗口。/如果是鼠标获取到了光标,并按下了,则隐藏提示框。//如果是.和并且没有按住Shift键
  146. //代码提示功能要做完善,至少要1个月,还要考虑兼容性问题,暂时不实现!!!!!!!!!!!!!!!!!!!!
  147. if (_k == 190 && window.event.shiftKey == false) {
  148. if (U.CD.Tip.IsJs(r[0])) {//判断提示框是否为javascript
  149. U.CD.TipR.Replace("."); // //U.CD.TipR.GetGBWZ(r[0]); //得到位置索引,可以用Replace函数直接替换。
  150. U.CD.Tip.Show();
  151. U.M.StopDefault();
  152. return;
  153. }
  154. if (U.CD.Tip.IsCss()) { } //判断提示框是否为css,这部分还没开始做
  155. }
  156. //当按了Delete键盘,删除代码时,判断删除的代码是否包含了跨域js文件,如果有,提示用户不能删除。
  157. //if (_k == 46) {
  158. //判断选择的文件是否包含了跨域文件,如果包含了,则要提示用户。
  159. //var s = U.CD.TipR.GetSelectedText();
  160. //if (U.CD.CD.IsDeleteDomain(s)) { U.M.StopDefault(); return; } //U.M.StopDefault可以阻止浏览器默认行为。
  161. //}
  162. _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口
  163. U.CD.CD.FushIframe($("#UCD_CT_Code_CT")[0]);
  164. }
  165. //嗯,原来javascript本身是有回车换行符号的,不过用记事本看不到的。这解决了一个问题。
  166. //但也引起了一个新的问题。
  167. //暂时用传入参数区分是初始化还是从数据库中获取,从数据库中获取回车换行是正确的,初始化时取iframe的outerhtml回车换行是不正确的
  168. U.CD.CD.SplitHTML = function (h, init) {
  169. if (init) return U.CD.CD.SplitHTMLInit(h);
  170. //如果是Chrome或者FireFox,换行符号是'\n'
  171. //如果是ie8,换行符号是空格。这就很难办了
  172. //如果是ie7,换行符号是'\r\n'
  173. var _B = U.UF.CI.getBrowser(); //获取浏览器信息
  174. //if (_B.browser == "msie" && _B.ver == "7.0") return h.split('\r\n');
  175. //为了识别换行,暂时强制让浏览器兼容ie7.
  176. //if (_B.browser == "msie" && _B.ver == "8.0") { return U.CD.CD.SplitHTMLInit(h); }
  177. //替换所有的\r\n为\n,但苹果好像不是这样兼容的
  178. return h.replace(/\r\n/g, '\n').split('\n');
  179. }
  180. //拆分HTML编码,适合于编辑器,不止是拆分html编码,同时还需要把中间的文字提出出来,例如javascript代码,div中间的文字等。
  181. //在IE7浏览器下面,通过下标[]操作尽然无法获取到此下标对应的字符,得到undefined,所以采用charAt函数。
  182. //最基本的字符串拆分,才是最复杂的,比如json增删查改。Google,百度就靠这个
  183. //做得不完善,还需要继续完善。还差前面4个空格的判断了。。!!
  184. U.CD.CD.SplitHTMLInit = function (h) {
  185. //h = h.TrimAll(); //看1473U.MS里面,去掉所有空格回车。晕,此函数不正确。
  186. //h = h.replace(/\s+/g, "");//这句正确,修改到1473UC中。但对于本项目不起作用,因为有些地方还必须要空格
  187. var i, s, e = 0, a = []; //a为返回的数组,i循环变量。s为<的起始点位置记录。e为单个字符的起始位置。
  188. for (i = 0; i < h.length; i++) {
  189. if (h.charAt(i) == "<") {
  190. if (e > s) {//如果e>s,表示e的记录晚于上一个s。
  191. if (h.substring(e, i).replace(/\s+/g, "") != "")//有时候把前面4个空格,Tab等也作为一个数组了,需呀判断剔除,暂时这样写,以后用1473的函数,
  192. a.push(h.substring(e, i)); //记录文本数据。还差一个记录前面空格了
  193. }
  194. s = i;
  195. }
  196. if (h.charAt(i) == ">") {
  197. if (h.charAt(i + 1) != "<") {
  198. e = i + 1; //记录不是html标记的起始位置。
  199. }
  200. a.push(h.substring(s, i + 1));
  201. }
  202. };
  203. return a;
  204. }
  205. //把传入进来的html内容,不带<div></div>的加上div分行标签。此处在控件中追加控件后会调用。。。比较重要。
  206. U.CD.CD.DrawCode = function (h, init) { // h ,init
  207. //这里为什么不原样获取数据库内容和RS.htm中的内容,然后原样输出呢?因为获取RS.htm里面的内容排版是混乱的。同时有些特殊标记,例如注释等需要特别解析。
  208. //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //给键盘事件,比如回车键赋予新函数。监控回车变化。这一句不能要.要了后U.CD.R.Wrap没有回调参数
  209. /* ::迭代
  210. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  211. var _a = U.CD.CD.SplitHTML(h, init), i; //行号
  212. _CA.innerHTML = ""; //代码内容清空。
  213. _HH.innerHTML = ""; //行号清空
  214. for (i = 0; i < _a.length; i++) {
  215. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
  216. //如果是注释,则标记绿色
  217. U.CD.CD.AllFilComments(_a[i], _CA);
  218. }
  219. _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口
  220. */
  221. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  222. var _a = U.CD.CD.SplitHTML(h, init), i; //行号
  223. _CA.innerHTML = ""; //代码内容清空。
  224. _HH.innerHTML = ""; //行号清空
  225. for (i = 0; i < _a.length; i++) {
  226. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
  227. //如果是注释,则标记绿色
  228. if (_a[i] == "") { _a[i] = '<br>' }
  229. if (i % 2 == 0) {
  230. U.CD.CD.AllFilComments(_a[i], _CA, true);
  231. } else {
  232. U.CD.CD.AllFilComments(_a[i], _CA, false);
  233. }
  234. }
  235. _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口
  236. // U.CD.Editor.setValue(h);
  237. // U.CD.CD.FushIframe({
  238. // "innerText": h
  239. // }); //反馈到结果视图中。
  240. }
  241. //绘制行号
  242. U.CD.CD.DrawLine = function (_HH, _CA) {
  243. var _line = _HH.getElementsByTagName("div").length + 1; //增加一个行号
  244. for (var i = _HH.childNodes.length; i < parseInt($("#UCD_CT_Code_CT")[0].scrollHeight / 20) + 1; i++) {
  245. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
  246. }
  247. _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口
  248. }
  249. //插入新的一行 做的太乱了 不想优化=.=
  250. U.CD.CD.newLine = function (p) {
  251. var _HH = $("#UCD_CT_HH_CT")[0].childNodes.length, c;
  252. if (document.getSelection().anchorNode.parentElement.tagName == 'SPAN') { //删除的时候 会有一个span承载内容 这样下面就不知道当前div是第几个了 加个判断
  253. var _a = U.CD.getNodeIndex(document.getSelection().anchorNode.parentElement.parentElement)
  254. } else {
  255. var _a = U.CD.getNodeIndex(p); //获取当前div是第几个
  256. }
  257. // if (_a + 2 == _HH) {
  258. // if (_HH % 2 == 1) {
  259. var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "<br>" }, $(p).Parent(), $(p).next()[0]);
  260. // } else {
  261. // var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "<br>" }, $(p).Parent(), $(p).next()[0]);
  262. // }
  263. if ($("#UCD_CT_HH_Code")[0].clientHeight < $("#UCD_CT_HH_Code")[0].scrollHeight) {
  264. $("#UCD_CT_HH_Code")[0].scrollTop += 20;
  265. }
  266. // if ($(".UCD_R_C_Line")[_a].innerHTML == "<br>") { return; }
  267. U.CD.Next(_a);
  268. // } else {
  269. // var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "<br>" }, $(p).Parent(), $(p).next()[0]);
  270. // for (var i = _a; i < _HH; i++) {
  271. // if ((i + 1) % 2 == 1) {
  272. // $("#UCD_CT_Code_CT")[0].childNodes[i].style.background = "rgba(245,245,245,0.5)"
  273. // } else {
  274. // $("#UCD_CT_Code_CT")[0].childNodes[i].style.background = ""
  275. // }
  276. // }
  277. // if ($("#UCD_CT_HH_Code")[0].clientHeight < $("#UCD_CT_HH_Code")[0].scrollHeight) {
  278. // $("#UCD_CT_HH_Code")[0].scrollTop += 20;
  279. // }
  280. // if ($(".UCD_R_C_Line")[_a].innerHTML == "<br>") { return; }
  281. // U.CD.Next(_a);
  282. // }
  283. U.CD.TipR.SL(c);
  284. }
  285. //字符串换行
  286. U.CD.Next = function (_a) {
  287. if ($(".UCD_R_C_Line")[_a].innerText.length == document.getSelection().anchorOffset && $("#UCD_CT_HH_CT")[0].childNodes.length > _a) {
  288. return;
  289. } else {
  290. if (document.getSelection().anchorNode.parentElement.tagName == 'SPAN') {
  291. var _p = document.getSelection().anchorNode.parentElement.parentElement;
  292. }
  293. var array = $(".UCD_R_C_Line")[_a].innerText.split(''); //当前div的内容 拆分成数组
  294. var _t = []; //留下来的字符
  295. for (var i = 0; i < document.getSelection().anchorOffset; i++) {
  296. _t.push(array[i])
  297. }
  298. var _BB = []; //要被换行的字符
  299. for (var i = document.getSelection().anchorOffset; i < $(".UCD_R_C_Line")[_a].innerText.length; i++) {
  300. _BB.push(array[i]);
  301. }
  302. var _TT = _t.join('');
  303. var _Next = _BB.join('');
  304. _TT == '' ? $(".UCD_R_C_Line")[_a].innerHTML = '<br>' : $(".UCD_R_C_Line")[_a].innerText = _TT;
  305. $(".UCD_R_C_Line")[_a + 1].innerText = _Next;
  306. }
  307. }
  308. U.CD.getNodeIndex = function (node) {
  309. var i = 0;
  310. while (node = node.previousSibling) {
  311. i++;
  312. }
  313. return i;
  314. }
  315. //重新刷新iframe的新方法。。看起来无刷新,参数为代码区域的div...这句会到处调用,,这样可以做立时显示了,效果更好。
  316. U.CD.CD.FushIframe = function (_CA) {
  317. //下面用try catch做功能,。
  318. try { U.CD.CD.ExecIF(_CA); }
  319. catch (e) { U.CD.CD.AlertDomain(); }
  320. }
  321. //当用户没有http://d.1473.cn/UJ.js时,自动追加进去
  322. U.CD.CD.ReInitDomain = function () {
  323. }
  324. //提示用户不能删除1473主域文件。
  325. U.CD.CD.AlertDomain = function () {
  326. //alert("所有文件必须引用<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>,否则会拒绝访问,请仔细检查");
  327. }
  328. U.UF.EV.addPrototype(String, "Rtrim", function () { return this.replace(/(\s*$)/g, ""); }); //去掉右边空格
  329. //独立出这个函数是为了加try catch。,暂时无用。
  330. U.CD.CD.ExecIF = function (_CA) {
  331. //直接执行下面一句话会不停的往iframe里面追加内容,是追加,不是替换,会导致重复,
  332. //$("#UCD_CT_SM_IF")[0].contentWindow.document.write(_CA.innerText);
  333. //晕了,搞了半天,其实只需要做运行时自动追加一个<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>即可。
  334. //_CA.innerText=U.CD.CD.Is1473Domain(_CA.innerText);
  335. var s = U.CD.CD.ExecIFText(_CA); //判断Chrome浏览器在效果左右边加&nbsp的问题。
  336. //用这几句话会替换iframe中的内容,并且无需重新装载iframe,像本机操作。
  337. var newDoc = $("#UCD_CT_SM_IF")[0].contentWindow.document.open("text/html", "replace");
  338. newDoc.write(s);
  339. //if() ie7有Bug,按道理需要newDoc.close(),但ie7敲入特殊字符(!!)会导致整个屏幕死掉。解决方案可以判断ie7,不关闭。暂时全部不要close。
  340. //排除会导致ie7假死的字符。
  341. //if (U.UF.CI.getBrowser().browser != "rv") newDoc.close(); //rv是firefox的标记,奇怪了
  342. newDoc.close();
  343. }
  344. //传入代码窗口div,得到里面的innerText,由于兼容性问题,需要独立一个函数。
  345. U.CD.CD.ExecIFText = function (_CA) {
  346. var s = _CA.innerText || _CA.textContent; //textContent兼容FireFox,但好像还是有问题
  347. //s = s.replace(/&nbsp;/ig, ""); //去掉所有的nbsp,因为是输出结果,所有可以这样做。
  348. //如果是chrome浏览器,需要去掉除html标签行的左右空格。
  349. if (U.UF.CI.getBrowser().browser == "chrome" || U.UF.CI.getBrowser().browser == "firefox" || U.UF.CI.getBrowser().browser == "rv") { s = U.CD.CD.ExecIFCompChrome(s); }
  350. //强制追加一行,不管有没有<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>。只是做执行时追加,以前想得太复杂。
  351. //s = s + "\n" + "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>";
  352. //s = s + "\n" + "<script src='http://d.1473.cn/js/Main/U.CD.IF.js' type='text/javascript'></script>";
  353. //s = s + "\n" + "<link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />";
  354. //这种加分在形成html文档时会自动追加到head中。但在ie下面js失效。
  355. //var j = "<link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' />";
  356. //var j = j + "\n" + "<script src='http://www.1473.cn/uform.js' type='text/javascript'></script>";
  357. //j = j + "\n" + "<script src='js/External/U.CD.Config.js' type='text/javascript'></script>";
  358. // j = j + "\n" + "<script type='text/javascript'>window.BMap_loadScriptTime = (new Date).getTime();</script>";
  359. //var j = "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>";
  360. //j = j + "\n" + "<script src='http://d.1473.cn/js/Main/U.CD.IF.js' type='text/javascript'></script>";
  361. //var l = s.toLowerCase().split("<head>");
  362. //s = l[0] + "<head>"+"\n " + j + l[1];
  363. // s = j + s;
  364. //s = s + "\n" + "<script src='http://www.1473.cn/js/UC/UC21.js' type='text/javascript'><\/script>";
  365. //s = s + "\n" + "<script src='http://d.1473.cn/js/U.CD.IF.js' type='text/javascript'><\/script>";
  366. //s = s + "\n" + "<link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />";
  367. return s;
  368. }
  369. U.UF.EV.addPrototype(String, "RemoveNBSP", function () { return this.replace(/&nbsp;/ig, ""); }); //去掉所有的&nbsp标签
  370. //兼容Chrome以及IE9以后的自动填充&ngsp的问题。
  371. U.CD.CD.ExecIFCompChrome = function (s) {
  372. var z = s.replace(/\r\n/g, '\n').split('\n'), i, s = "";
  373. for (i = 0; i < z.length; i++) {
  374. //晕,昨天发现Chrome在div的中间有空格都不行。需要判断div中是否有nbsp字符?
  375. //if (z[i].indexOf("<") >= 0 && z[i].indexOf(">") >= 0){ z[i] = z[i].RemoveNBSP(); }//去掉所有$nbsp。不起作用!!很难调试。
  376. //else { z[i] = z[i].lTrim().Rtrim(); } //去掉左右空格
  377. z[i] = z[i].lTrim().Rtrim();
  378. s += z[i] + "\n"; //添加换行符
  379. //昨天遇到样式表前面留空格,在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦,有了思路再看。因为此处是运行时,所以其实不需要前面的if判断,所有空格全部清除。
  380. }
  381. //return z.join(""); //这是把字符串数组转为字符串的函数,但会去掉回车符号,不能使用。
  382. return s;
  383. }
  384. //初始化代码区域,不传递
  385. U.CD.CD.InitCode = function (s) {
  386. //var _d = "<html xmlns='http://www.w3.org/1999/xhtml'>\n<head>\n <title></title>\n <link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css'/>\n <script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>\n <script src=\"http://d.1473.cn/js/U.CD.IF.js\" type=\"text/javascript\"></script>\n <!--css代码,js代码写在下面-->\n</head>\n<body>\n <!-- html元素写在下面 -->\n";
  387. // var _d = "<html xmlns='http://www.w3.org/1999/xhtml'>\n<head>\n <title></title>\n <!--css代码,js代码写在下面-->\n <link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' /> \n <script src='http://www.1473.cn/uform.js' type='text/javascript'></script> \n <script src='http://www.1473.cn/uform.js' type='text/javascript'></script> \n </head>\n<body>\n <!-- html元素写在下面 -->\n";
  388. // if (s) _d += s + "\n"; //如果传递了参数,则把参数加在body里面,否则执行初始化代码
  389. // _d += "</body>\n</html>";
  390. var _d = "<html xmlns='http://www.w3.org/1999/xhtml'>" + "\n";
  391. _d += "<head>" + "\n";
  392. _d += "<title></title>" + "\n";
  393. _d += "<!--uform.js常用函数库-->" + "\n";
  394. _d += "<script src='http://www.1473.cn/uform.js' type='text/javascript'></script>" + "\n";
  395. _d += "<!--uformd.js所有UI模式调用的函数例如:登录注册弹出网盘、论坛、窗体-->" + "\n";
  396. _d += "<script src='http://www.1473.cn/uformd.js' type='text/javascript'></script>" + "\n";
  397. _d += "<script src='js/External/U.CD.Config.js' type='text/javascript'></script>";
  398. _d += "<!--uform.css所有的UI的样式整个1473的模型样式-->" + "\n";
  399. _d += "<link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' />" + "\n";
  400. _d += "</head>" + "\n";
  401. _d += "<body>" + "\n";
  402. _d += "<!-- html元素写在下面 -->" + "\n";
  403. _d += "</body>" + "\n";
  404. _d += "</html>" + "\n";
  405. // var j = "<link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' />";
  406. // var j = j + "\n" + "<script src='http://www.1473.cn/uform.js' type='text/javascript'></script>";
  407. // j = j + "\n" + "<script src='js/External/U.CD.Config.js' type='text/javascript'></script>";
  408. return _d;
  409. }
  410. //在字符串前面追加n个空格,参数s为待插入字符,n为在第几个字符位置插入,以后还可以继续改写
  411. U.UF.EV.addPrototype(String, "InsertStr", function (s, n) { var t = this.substr(0, n); var e = this.substr(n, this.length); return t + s + e; });
  412. //返回元素位于父亲节点的索引位置,返回-1表示错误。因为有可能为0,不能返回false.
  413. U.UF.C.IndexOfParent = function (o) {
  414. var f = o.parentNode, i, s;
  415. if (!f) return -1; //找不到父亲节点,返回
  416. s = f.childNodes;
  417. for (i = 0; i < s.length; i++) if (s[i] == o) return i;
  418. return -1;
  419. }
  420. //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。
  421. U.CD.CD.StrFilter = function (SO) {
  422. var s = SO.innerText;
  423. //判断SO是否位于跨域js之前,如果是之前,返回false。并提示用户在正确的地方输入。使用新方法解决了此问题
  424. //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js
  425. //if (U.CD.CD.GetInPos(SO) < 4) { alert("输入位置不对,请看下面注释!"); return false; }
  426. U.CD.CD.FilterComments(s);
  427. var _B = U.UF.CI.getBrowser(); //获取浏览器信息
  428. if (_B.browser == "msie" && (_B.ver == "7.0" || _B.ver == "8.0")) {
  429. //如果包含了!!号,则提示用户ie7不允许输入!!号,返回
  430. if (s.indexOf("!!") > -1) { alert("IE7,8输入'!!'会导致浏览器假死,请仔细检查!"); return false; }
  431. }
  432. return true;
  433. }
  434. //用户用户回车时的位置。
  435. U.CD.CD.GetInPos = function (SO) {
  436. var _C, i;
  437. //如果用户拷贝代码,则会出现多层div。需要找到id为UCD_CT_Code_CT的div。
  438. for (i = 0; i < 100; i++) {
  439. if (SO.parentNode.id != "UCD_CT_Code_CT") { SO = SO.parentNode; }
  440. else { _C = SO; break; }
  441. }
  442. return U.UF.C.IndexOfParent(_C);
  443. }
  444. //添加注释函数,还没完成,以后继续。还缺用户按下回车键获取当前行的判断
  445. U.CD.CD.FilterComments = function (s) {
  446. //如果是//,则表示注释,标记为绿色。怎么标记?插入span标签?
  447. //var _G = U.CD.TipR.GetPStyle(), _fz = false; //获取当前光标选中的字符包含的div。
  448. var _G = U.CD.TipR.Parent(null, true), _fz = false; //获取当前光标选中的字符包含的div。
  449. if (s.indexOf("<!--") >= 0 && s.indexOf("-->") >= 0) { _fz = true; } //<!-- -->html注释。
  450. if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。
  451. if (_fz) { $(_G).addAttrArray({ "style": { "cssText": "color:green"} }); }
  452. else { $(_G).addAttrArray({ "style": { "cssText": "color:#333"} }); }
  453. }
  454. //添加注释,当获取用户文件数据时使用。会循环调用此函数
  455. U.UF.EV.addPrototype(String, "lTrim", function () { return this.replace(/(^\s*)/g, ""); }); //去掉左边空格
  456. U.CD.CD.AllFilComments = function (s, _CA, _P) {
  457. //这里是复杂条件,该如何做?暂时如此,因为以后还会添加
  458. var _fz = false;
  459. if (s.indexOf("<!--") >= 0 && s.indexOf("-->") >= 0) { _fz = true; } //<!-- -->html注释。
  460. if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。
  461. //实际添加条目。
  462. if (_fz && _P == false) { $$("div", { "style": { "color": "green" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); }
  463. // else if (_fz && _P == true) { $$("div", { "style": { "color": "green", "background": "rgba(245, 245, 245,0.5)" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); }
  464. else if (s == '<br>') { $$("div", { "className": "UCD_R_C_Line", "innerHTML": s }, _CA); }
  465. // else if (_P == true) { $$("div", { "className": "UCD_R_C_Line", "style": { "background": "rgba(245, 245, 245,0.5)" }, "innerText": s }, _CA); }
  466. else { $$("div", { "className": "UCD_R_C_Line", "innerText": s }, _CA); } //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。
  467. }
  468. //拖拽展示代码部分
  469. U.CD.CD.Drag = function (Top) {
  470. var _e = event || window.event;
  471. Top.clickY = _e.clientY;
  472. Top.Height = Top.parentNode.offsetHeight;
  473. Top.Height2 = $("#UCD_CT_IF")[0].offsetHeight
  474. document.addEventListener("mousemove", doDrag2, true);
  475. document.addEventListener("mouseup", stopDrag2, true);
  476. }
  477. doDrag2 = function () {
  478. var Top = $("#UCD_CT_HH_Drag")[0];
  479. var _e = event || window.event;
  480. var t = Top.Height - _e.clientY + Top.clickY + 10;
  481. if (Top.clickY) {
  482. Top.parentNode.style.height = t + 'px';
  483. $("#UCD_CT_IF")[0].style.height = (Top.Height2 + _e.clientY - Top.clickY) + 'px';
  484. }
  485. }
  486. stopDrag2 = function () {
  487. $("#UCD_CT_HH_Drag")[0].clickY = false;
  488. }
  489. //--------------------------------------暂时无用的函数-------------------------------------------------------------------------
  490. //绘制运行窗口的代码!初始化时会运行,从数据库中获取代码后也会运行。在代码窗口输入内容时不执行。
  491. U.CD.R.NoUse = function (_CA) {
  492. var _HH = $("#UCD_CT_HH_CT")[0];
  493. //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。
  494. var _code = U.CD.R.RemoveMoreLine(_CA); //计算是否有重复的div,历史遗留问题。
  495. _CA.innerHTML = _code.innerHTML; //反向赋值,否则无法显示,这处逻辑比较乱。思路不是很流畅。
  496. _HH.innerHTML = ""; //清空所有行号?
  497. var _nodes = _code.getElementsByTagName("div");
  498. //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。
  499. if (_nodes.length == 0) { $$("div", { "className": "UCD_R_C_Line", "innerHTML": "" }, $("#UCD_CT_Code_CT")[0]); }
  500. //循环绘制行号。内容已经有了,不需要绘制了
  501. for (var i = 0; i < _nodes.length; i++) {
  502. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
  503. }
  504. //_HH.scrollTop = $("#UCD_CT_Code_CT")[0].scrollHeight; //设置行号滚动窗口
  505. }
  506. //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。解决历史遗留问题。
  507. U.CD.R.RemoveMoreLine = function (c) {
  508. if (c.innerHTML == "") return c; //如果code为空,返回
  509. //var _r = c.cloneNode(); //用赋值语句是无法清除节点的,因为赋值2个对象修改任何一个另外一个也会修改,只能克隆。。使用克隆方法会遇到节点减少的问题。 //采用创建新节点的方式。
  510. var _r = document.createElement("div"); //创建一个新的div接受代码窗口赋值,否则,会出现引用循环问题。
  511. var _nodes = c.getElementsByTagName("div");
  512. for (var i = 0; i < _nodes.length; i++) {
  513. if (!_nodes[i].getElementsByTagName("div").length > 0)
  514. _r.appendChild(_nodes[i].cloneNode(true)); //克隆节点带true才能把里面内容全部拷贝。
  515. }
  516. return _r;
  517. }
  518. //此函数可以刷新子iframe框架的内容。如果是Chrome浏览器,则不能,Chrome不支持iframe窗口的location.reload。是Chrome的一个Bug
  519. U.CD.CD.IFReload = function () {
  520. //$("#UCD_CT_SM_IF")[0].contentWindow.document.body.innerHTML += ""; //执行iframe中的内容,这是bug?
  521. //var _jr = $("#UCD_CT_SM_IF")[0].contentDocument || $("#UCD_CT_SM_IF")[0].contentWindow.document;
  522. //判断浏览器。
  523. if (U.UF.CI.getBrowser().browser == "chrome") { U.CD.CD.ExecIF($("#UCD_CT_Code_CT")[0]); }
  524. else {
  525. var _jr = window.frames["UCD_CT_SM_IF"].document;
  526. _jr.location.reload();
  527. }
  528. //$("#UCD_CT_SM_IF")[0].contentWindow.document.body.innerHTML += ""; //执行iframe中的内容,这是bug?
  529. //var _jr = $("#UCD_CT_SM_IF")[0].contentDocument || $("#UCD_CT_SM_IF")[0].contentWindow.document;
  530. //判断浏览器。
  531. // if (U.UF.CI.getBrowser().browser == "chrome") { U.CD.CD.ExecIF({ "innerText": U.CD.Editor.getValue() }); }
  532. // else {
  533. // var _jr = window.frames["UCD_CT_SM_IF"].document;
  534. // _jr.location.reload();
  535. // }
  536. }
  537. //判断是否有1473主域,否则会出现跨域访问。如果没有,则需要在head中追加。
  538. //U.CD.CD.Is1473Domain = function (s) {
  539. // var i, _t = s.replace(/\r\n/g, '\n').split('\n'); //找到1473主域js,不理会,直接返回
  540. // for (i = 0; i < _t.length; i++) { if (_t[i].toLowerCase().indexOf("http://d.1473.cn/UJ.js".toLowerCase()) > -1) return s; }
  541. // if (_t.length > 7) {//大于7行,则插入到head中插入比较复杂,暂时不理会这个函数
  542. // _t.splice(5, 0, "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>"); //合并输出到s。此功能暂未实现。
  543. // }
  544. // if (_t.length < 4) {//小于4行,则视为乱码,另外初始化代码区域,把内容追加到body中。
  545. // s = U.CD.CD.InitCode(s); //追加s到初始化代码的body中。
  546. // }
  547. // return s;
  548. //}
  549. //是否删除了UJ.js文件,如果删除了,提示用户,用于键盘回车键按下的时候。
  550. //U.CD.CD.IsDeleteDomain = function (s) {
  551. // var z = s.replace(/\r\n/g, '\n').split('\n'), i;
  552. // for (i = 0; i < z.length; i++) {
  553. // if (z[i].lTrim().Rtrim() == "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>") {
  554. // U.CD.CD.AlertDomain();
  555. // return true;
  556. // }
  557. // }
  558. // return false;
  559. //}
  560. //当出现错误时在视图页面填充错误信息以及用户提醒。
  561. //U.CD.CD.FillErrorInfo = function () {
  562. // var _d = "<html xmlns='http://www.w3.org/1999/xhtml'>\n<head>\n <title></title>\n <link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />\n <script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>\n</head>\n<body>\n<div style='color:red; font-size:20px;'>\n出错啦!!!\n</div>\n<div>\n代码中必须包含跨域文件http://d.1473.cn/uj.js。这是所有浏览器公有问题。\n</div>\n</body>\n</html>";
  563. // U.CD.CD.DrawCode(_d, false);
  564. //}
  565. //US.G = {}; //做一个统一的全部变量存放地方。否则,变量比较乱。
  566. //US.G.ImgType = ["jpg", "gif", "png", "bmp", "jpeg"]; //太多地方要判断是否为图片了。做一个全局变量,否则很乱。为了避免重复,循环是全部转小写判断
  567. //判断是否为图片类型,filename为文件名,辅助函数,以后可删除。放在UC里面了
  568. //U.UP.IsImg = function (filename) {
  569. // var ext = U.UP.GetUpName(filename)[1].toLowerCase(); //得到文件扩展名并转换为小写。
  570. // var _A = US.G.ImgType, i; //全部转小写。
  571. // for (i = 0; i < _A.length; i++) {
  572. // if (ext == _A[i])
  573. // return true;
  574. // }
  575. // return false;
  576. //}