U.CD.Code.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. /*代码显示窗口*/
  2. Namespace.register("U.CD.CD");
  3. //还需要解决的问题是粘贴过来的多行字符会折换成一行。
  4. //------------------------------------------------------当拖动一个元素到iframe区域后,追加代码到Code区域-------------------------------
  5. //参数h为待追加元素。
  6. U.CD.CD.AppendHTML = function (h) {
  7. //获取代码区域
  8. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  9. var _ins = U.CD.CD.SplitHTML(h.outerHTML); //待插入元素数组。//有些浏览器不支持此属性,没办法。只能随主流。
  10. //找到Body所在节点。
  11. var _codes = _CA.getElementsByTagName("div"); //获取代码区域div数组,以循环查找body。解决了前后空格问题
  12. for (var i = 0; i < _codes.length; i++) {
  13. if (_codes[i].innerText.trim().toLowerCase() == "<body>") {//找到Body后追加添加的元素。
  14. //找到>符合的位置,下面元素前面追加几个空格
  15. var _space = _codes[i].innerText.indexOf('>')-1;
  16. //在元素前面追加空格,封装到U.MS。很多地方要用到。
  17. for (var j = 0; j < _ins.length; j++) {
  18. var _d = $$("div", { "className": "UCD_R_C_Line", "innerText": _ins[j].addPreSpace(_space) }); //带插入div内容,addPreSpace在字符串前面追加n个空格
  19. _CA.insertBefore(_d, _codes[i + 1 + j]); //javascript只有插入前面的函数,插入位置需要计算。
  20. U.CD.CD.DrawLine(_HH, _CA); //插入行号。
  21. }
  22. return; //插入完毕后返回
  23. }
  24. }
  25. }
  26. //---------------------------------------------------初始化时根据iframe的内容刷新代码区域的初始内容--------------------------------
  27. //代码区域初始化函数。好像还没有初始化哦。只能在系统第一次运行时调用?
  28. U.CD.CD.Init = function (node) {
  29. //获取CD文件的内容追加到Code区域,最好能实现换行操作,此种方法由于不支持Chrome,所以另外做了一个函数。
  30. //var _i = $("#UCD_CT_SM_IF")[0]; _i.src = "http://d.1473.cn/RS.htm?ver="+Math.random();
  31. //U.MD.IframeLoad(_i, [[U.CD.CD.InitAsyn, ([_i])]]);
  32. //用户未登录或者点击新建文件时之前执行的内容。直接获取iframe中内容,反馈到代码窗口。当结果视图有值时,新建文件就会有内容,导出出错,必须重新刷新。
  33. //U.CD.CD.DrawCode($("#UCD_CT_SM_IF")[0].contentWindow.document.documentElement.outerHTML);
  34. U.CD.CD.DrawCode(U.CD.CD.InitCode(),false);//初始化代码后绘制在代码窗口
  35. U.CD.R.Save(node); //初始化保存按钮。此处还可以简化,明天再来。
  36. }
  37. //iframe加载Cd.htm异步回调。
  38. U.CD.CD.InitAsyn = function (i) {
  39. //如果是Chrome,缓存了上一次iframe的内容,好心做了坏事啊。。iframe还是记录了上一次的内容。
  40. //看来初始化要换一种方法,直接写入编码到代码区域,然后输出到iframe中。
  41. U.CD.CD.DrawCode(i.contentWindow.document.documentElement.outerHTML, true);
  42. } //获取RS.htm的所有内容。
  43. //------------------------------------------------根据代码窗口刷新结果窗口的值。----------------------------------------
  44. //根据代码区域的innerText刷新iframe显示结果,很多地方用到,封装为一个函数。小窗口运行效果。
  45. //参数_CA为$("#UCD_CT_Code_CT")[0]代码元素。给代码窗口赋值,只能通过给代码窗口赋值,然后获取代码窗口innerText,才能最简单的得到给iframe打印的值,否则会带html标签到iframe。
  46. U.CD.CD.DisNode = function (node) {
  47. var _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  48. //数据库中保存的是所有的Div,带了样式,如果不带样式,则javascript,css必须用算法计算出来,比较复杂,暂时解决不了。,
  49. _CA.innerHTML = node.Content; //所以暂时浪费存储,求取简单化。,此上下2句话是把包含了hmtl标记的字符全部转换为没有html标记的字符,有技巧。
  50. //晕,下面这句做执行时做就OK了。
  51. //_CA.innerText = U.CD.CD.Is1473Domain(_CA.innerText); //检测node.Content是否包含了1473主域,没包含会导致跨域问题,直接追加一个1473主域js。
  52. U.CD.CD.DrawCode(_CA.innerText, false); //调用统一的往代码窗口赋值函数,包括初始化从iframe中获取,已经装载用户自己的文件代码。
  53. U.CD.R.Save(node); //保存结果?在打开的时候给保存按钮赋予保存事件!因为会打开多个文件,每个文件都会有对象的事件,一直发生变化
  54. }
  55. //--------------------------------------------------------------通用方法---------------------------------------------
  56. //当在Code编辑区中按下了回车键时,执行换行符操作,并刷新结果窗口,键盘回车键可能是13,也可能是10
  57. //gs触发的格式:比如通过onkeydown触发的,返回qt。做switch判断到底是什么样子的键盘事件
  58. //r是返回值。
  59. //一个复杂的函数,统一的功能,用户统一处理函数,做一个回调。
  60. U.CD.R.Wrap = function (gs, r) {
  61. //_HH代码行号 _CA代码区域 _T 提示信息
  62. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0], _T = $("#UCD_TP_TB")[0];
  63. var _k = event.keyCode; //键盘按下的键值
  64. //U.CD.Tip.KeyDown(_k, r); //转到代码提示窗口判断,由于键盘事件是依附于某一个div。所以要单独做在提示框中。
  65. //alert(_k); //因为主空函数编辑器区域把光标也监控了,所以排除0这个键值,即光标。
  66. //如果按下了Tab键盘,空4格子,已经在UC里面统一处理了。。。。
  67. if (_k == 9) {
  68. //var _R = U.D.E.GetSelectionRange(window, $("#UCD_CT_Code_CT")[0], document); //获取光标位置。
  69. //var _G = _R.Replace("&nbsp;&nbsp;&nbsp;&nbsp;"); //追加4个空格到光标前面
  70. //U.M.StopDefault();
  71. //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //要重新添加代码框键盘事件才能再次触发?
  72. }
  73. //如果按下了删除Delete键盘。有可能用户删除了一个字符,也可能删除了一个行的div。需要重新计算行数,才能匹配
  74. if (_k == 46) {
  75. //此函数响应不及时,原因还待分析,暂时这样。
  76. var _last, _lines = _HH.childNodes.length - _CA.childNodes.length;
  77. for (var i = 0; i <= _lines; i++) {
  78. _last = _HH.lastElementChild || _HH.lastChild; //兼容写法,其实可以做成自己的函数,这里要做自己的函数!!!
  79. _HH.removeChild(_last);
  80. }
  81. }
  82. if (_k == 10 || _k == 13) {
  83. //如果代码输入提示框已经出现,则回车键作用于提示框
  84. if (_T.style.display == "none") {
  85. //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js,所以,不允许。//获取当前光标选中的字符包含的div。
  86. if (!U.CD.CD.StrFilter(U.CD.TipR.GetPStyle())) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。
  87. U.CD.CD.DrawLine(_HH, _CA); //添加新行
  88. //同时需要检测新行的颜色为绿色,则要变成默认的,编辑器比较复杂啊
  89. //U.CD.CD.FushIframe(_CA); //根据代码窗口内容刷新小窗口iframe中立时显示的内容
  90. }
  91. }
  92. if (_k == 0) { _T.style.display = "none"; U.CD.R.CErrF.style.backgroundColor = "white"; } //获取到编辑区域光标事件后,隐藏提示框,并重置代码窗口错误行的颜色
  93. //如果是.号,显示代码提示窗口。/如果是鼠标获取到了光标,并按下了,则隐藏提示框。//如果是.和并且没有按住Shift键
  94. //代码提示功能要做完善,至少要1个月,还要考虑兼容性问题,暂时不实现!!!!!!!!!!!!!!!!!!!!
  95. if (_k == 190 && window.event.shiftKey == false) {
  96. if (U.CD.Tip.IsJs(r[0])) {//判断提示框是否为javascript
  97. //U.CD.TipR.Replace("."); // //U.CD.TipR.GetGBWZ(r[0]); //得到位置索引,可以用Replace函数直接替换。
  98. //U.CD.Tip.Show();
  99. //U.M.StopDefault();
  100. return;
  101. }
  102. if (U.CD.Tip.IsCss()) { } //判断提示框是否为css,这部分还没开始做
  103. }
  104. //当按了Delete键盘,删除代码时,判断删除的代码是否包含了跨域js文件,如果有,提示用户不能删除。
  105. if (_k == 46) {
  106. //判断选择的文件是否包含了跨域文件,如果包含了,则要提示用户。
  107. //var s = U.CD.TipR.GetSelectedText();
  108. //if (U.CD.CD.IsDeleteDomain(s)) { U.M.StopDefault(); return; } //U.M.StopDefault可以阻止浏览器默认行为。
  109. }
  110. _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口
  111. }
  112. //嗯,原来javascript本身是有回车换行符号的,不过用记事本看不到的。这解决了一个问题。
  113. //但也引起了一个新的问题。
  114. //暂时用传入参数区分是初始化还是从数据库中获取,从数据库中获取回车换行是正确的,初始化时取iframe的outerhtml回车换行是不正确的
  115. U.CD.CD.SplitHTML = function (h, init) {
  116. if (init) return U.CD.CD.SplitHTMLInit(h);
  117. //如果是Chrome或者FireFox,换行符号是'\n'
  118. //如果是ie8,换行符号是空格。这就很难办了
  119. //如果是ie7,换行符号是'\r\n'
  120. var _B = U.CI.getBrowser(); //获取浏览器信息
  121. //if (_B.browser == "msie" && _B.ver == "7.0") return h.split('\r\n');
  122. //为了识别换行,暂时强制让浏览器兼容ie7.
  123. //if (_B.browser == "msie" && _B.ver == "8.0") { return U.CD.CD.SplitHTMLInit(h); }
  124. //替换所有的\r\n为\n,但苹果好像不是这样兼容的
  125. return h.replace(/\r\n/g, '\n').split('\n');
  126. }
  127. //拆分HTML编码,适合于编辑器,不止是拆分html编码,同时还需要把中间的文字提出出来,例如javascript代码,div中间的文字等。
  128. //在IE7浏览器下面,通过下标[]操作尽然无法获取到此下标对应的字符,得到undefined,所以采用charAt函数。
  129. //最基本的字符串拆分,才是最复杂的,比如json增删查改。Google,百度就靠这个
  130. //做得不完善,还需要继续完善。还差前面4个空格的判断了。。!!
  131. U.CD.CD.SplitHTMLInit = function (h) {
  132. //h = h.trim(); //看1473U.MS里面,去掉所有空格回车。晕,此函数不正确。
  133. //h = h.replace(/\s+/g, "");//这句正确,修改到1473UC中。但对于本项目不起作用,因为有些地方还必须要空格
  134. var i, s, e = 0, a = []; //a为返回的数组,i循环变量。s为<的起始点位置记录。e为单个字符的起始位置。
  135. for (i = 0; i < h.length; i++) {
  136. if (h.charAt(i) == "<") {
  137. if (e > s) {//如果e>s,表示e的记录晚于上一个s。
  138. if (h.substring(e, i).replace(/\s+/g, "") != "")//有时候把前面4个空格,Tab等也作为一个数组了,需呀判断剔除,暂时这样写,以后用1473的函数,
  139. a.push(h.substring(e, i)); //记录文本数据。还差一个记录前面空格了
  140. }
  141. s = i;
  142. }
  143. if (h.charAt(i) == ">") {
  144. if (h.charAt(i + 1) != "<") {
  145. e = i + 1; //记录不是html标记的起始位置。
  146. }
  147. a.push(h.substring(s, i + 1));
  148. }
  149. };
  150. return a;
  151. }
  152. //把传入进来的html内容,不带<div></div>的加上div分行标签。此处在控件中追加控件后会调用。。。比较重要。
  153. U.CD.CD.DrawCode = function (h, init) {
  154. //这里为什么不原样获取数据库内容和RS.htm中的内容,然后原样输出呢?因为获取RS.htm里面的内容排版是混乱的。同时有些特殊标记,例如注释等需要特别解析。
  155. //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //给键盘事件,比如回车键赋予新函数。监控回车变化。
  156. var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
  157. var _a = U.CD.CD.SplitHTML(h, init), i; //行号
  158. _CA.innerHTML = ""; //代码内容清空。
  159. _HH.innerHTML = ""; //行号清空
  160. for (i = 0; i < _a.length; i++) {
  161. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
  162. //如果是注释,则标记绿色
  163. U.CD.CD.AllFilComments(_a[i], _CA);
  164. }
  165. _HH.style.height = _CA.scrollHeight+"px"; //设置行号滚动窗口
  166. //U.CD.CD.FushIframe(_CA); //反馈到结果视图中。
  167. }
  168. //绘制行号
  169. U.CD.CD.DrawLine = function (_HH,_CA) {
  170. var _line = _HH.getElementsByTagName("div").length + 1; //增加一个行号
  171. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": _line }, _HH); //绘制行号
  172. _HH.style.height = _CA.scrollHeight+"px"; //设置行号滚动窗口
  173. }
  174. //初始化代码区域,不传递
  175. U.CD.CD.InitCode = function () {
  176. return U.CD.CL.LangArr[U.CD.CL.Lang(U.CD.USLang)][0]; //初始化默认返回每种语言的第一位。
  177. //var _d = "#include <stdio.h>\nvoid main(){\n printf(\"hello world\");\n}\n";
  178. //if (s) _d += s + "\n"; //如果传递了参数,则把参数加在body里面,否则执行初始化代码
  179. //_d += "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
  180. //return _d;
  181. }
  182. //在字符串前面追加n个空格,参数s为待插入字符,n为在第几个字符位置插入,以后还可以继续改写
  183. U.M.Setprototype(String, "InsertStr", function (s, n) { var t = this.substr(0, n); var e = this.substr(n, this.length); return t + s + e;});
  184. //返回元素位于父亲节点的索引位置,返回-1表示错误。因为有可能为0,不能返回false.
  185. U.M.IndexOfParent = function (o) {
  186. var f = o.parentNode, i, s;
  187. if (!f) return -1; //找不到父亲节点,返回
  188. s = f.childNodes;
  189. for (i = 0; i < s.length; i++) if (s[i] == o) return i;
  190. return -1;
  191. }
  192. //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。
  193. U.CD.CD.StrFilter = function (SO) {
  194. var s = SO.innerText;
  195. //判断SO是否位于跨域js之前,如果是之前,返回false。并提示用户在正确的地方输入。使用新方法解决了此问题
  196. //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js
  197. //if (U.CD.CD.GetInPos(SO) < 4) { alert("输入位置不对,请看下面注释!"); return false; }
  198. U.CD.CD.FilterComments(s);
  199. var _B = U.CI.getBrowser(); //获取浏览器信息
  200. if (_B.browser == "msie" && (_B.ver == "7.0" || _B.ver == "8.0")) {
  201. //如果包含了!!号,则提示用户ie7不允许输入!!号,返回
  202. if (s.indexOf("!!") > -1) { alert("IE7,8输入'!!'会导致浏览器假死,请仔细检查!"); return false; }
  203. }
  204. return true;
  205. }
  206. //用户用户回车时的位置。
  207. U.CD.CD.GetInPos = function (SO) {
  208. var _C,i;
  209. //如果用户拷贝代码,则会出现多层div。需要找到id为UCD_CT_Code_CT的div。
  210. for (i = 0; i < 100; i++) {
  211. if (SO.parentNode.id != "UCD_CT_Code_CT") { SO = SO.parentNode;}
  212. else { _C = SO; break;}
  213. }
  214. return U.M.IndexOfParent(_C);
  215. }
  216. //添加注释函数,还没完成,以后继续。主要用户按下回车键获取当前行的判断
  217. U.CD.CD.FilterComments = function (s) {
  218. //如果是//,则表示注释,标记为绿色。怎么标记?插入span标签?
  219. var _G = U.CD.TipR.GetPStyle(),_fz=false; //获取当前光标选中的字符包含的div。
  220. if (s.indexOf("<!--") >= 0 && s.indexOf("-->") >= 0) { _fz = true; } //<!-- -->html注释。
  221. if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。
  222. if (_fz) { $(_G).addAttrArray({ "style": { "cssText": "color:green"} }); }
  223. else { $(_G).addAttrArray({ "style": { "cssText": "color:#333"} }); }
  224. }
  225. //添加注释,当获取用户文件数据时使用。会循环调用此函数
  226. U.M.Setprototype(String, "lTrim", function () { return this.replace(/(^\s*)/g, ""); }); //去掉左边空格
  227. U.CD.CD.AllFilComments = function (s, _CA) {
  228. //这里是复杂条件,该如何做?暂时如此,因为以后还会添加
  229. var _fz = false;
  230. if (s.indexOf("<!--") >= 0 && s.indexOf("-->") >= 0) { _fz = true; } //<!-- -->html注释。
  231. if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。
  232. //实际添加条目。
  233. if (_fz) { $$("div", { "style": { "color": "green" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); }
  234. else { $$("div", { "className": "UCD_R_C_Line", "innerText": s }, _CA); } //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。
  235. }
  236. U.M.Setprototype(String, "RemoveNBSP", function () { return this.replace(/&nbsp;/ig, ""); }); //去掉所有的&nbsp标签
  237. //去掉运行结果或者错误结果中每行字符的右边空格以及目录标识。
  238. U.CD.CD.ExecLangBack = function (s) {
  239. //如果用户在ide中输入的是数字,则s.replace会出错。需要转换为字符串
  240. if (typeof (s) == "number") s = s.toString();
  241. //截取掉以./userfiles/开始的+32位guid字符,. / 在正则表达式中必须加转义字符反斜杠\,有些编译型的格式为/output/userfiles,解释型的为./output
  242. //s = s.replace(/\.\/userfiles\/\w{32}/g, "test");
  243. s = s.replace(/(\.\/output|\.|)\/userfiles\/\w{32}/g, "test"); //(\.\/output|\.|)表示或者.或者./output或者什么都没有(在nodejs中会什么什么都没有), 所有转义前面加反斜杠\
  244. var z = s.replace(/\r\n/g, '\n').split('\n'), i, s = "";
  245. for (i = 0; i < z.length; i++) {
  246. //晕,昨天发现Chrome在div的中间有空格都不行。需要判断div中是否有nbsp字符?
  247. //if (z[i].indexOf("<") >= 0 && z[i].indexOf(">") >= 0){ z[i] = z[i].RemoveNBSP(); }//去掉所有$nbsp。不起作用!!很难调试。
  248. //else { z[i] = z[i].lTrim().Rtrim(); } //去掉左右空格
  249. z[i] = z[i].lTrim().Rtrim();
  250. s += z[i] + "\n"; //添加换行符
  251. //昨天遇到样式表前面留空格,在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦,有了思路再看。因为此处是运行时,所以其实不需要前面的if判断,所有空格全部清除。
  252. }
  253. //return z.join(""); //这是把字符串数组转为字符串的函数,但会去掉回车符号,不能使用。
  254. return s;
  255. }
  256. U.CD.CD.ExecIFCompChrome = function (s) {
  257. var z = s.replace(/\r\n/g, '\n').split('\n'), i, s = "";
  258. for (i = 0; i < z.length; i++) {
  259. //晕,昨天发现Chrome在div的中间有空格都不行。需要判断div中是否有nbsp字符?
  260. //if (z[i].indexOf("<") >= 0 && z[i].indexOf(">") >= 0){ z[i] = z[i].RemoveNBSP(); }//去掉所有$nbsp。不起作用!!很难调试。
  261. //else { z[i] = z[i].lTrim().Rtrim(); } //去掉左右空格
  262. z[i] = z[i].Rtrim();
  263. //Python居然用空格作为标识来运行程序,晕了!只能排出掉Python语言
  264. if(U.CD.USLang!="Python")
  265. z[i] = z[i].lTrim(); //Chrome浏览器必须要截取掉左边的空格,奇怪了
  266. s += z[i] + "\n"; //添加换行符
  267. //昨天遇到样式表前面留空格,在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦,有了思路再看。因为此处是运行时,所以其实不需要前面的if判断,所有空格全部清除。
  268. }
  269. //return z.join(""); //这是把字符串数组转为字符串的函数,但会去掉回车符号,不能使用。
  270. return s;
  271. }
  272. //--------------------------------------暂时无用的函数-------------------------------------------------------------------------
  273. //绘制运行窗口的代码!初始化时会运行,从数据库中获取代码后也会运行。在代码窗口输入内容时不执行。
  274. U.CD.R.NoUse = function (_CA) {
  275. var _HH = $("#UCD_CT_HH_CT")[0];
  276. //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。
  277. var _code = U.CD.R.RemoveMoreLine(_CA); //计算是否有重复的div,历史遗留问题。
  278. _CA.innerHTML = _code.innerHTML; //反向赋值,否则无法显示,这处逻辑比较乱。思路不是很流畅。
  279. _HH.innerHTML = ""; //清空所有行号?
  280. var _nodes = _code.getElementsByTagName("div");
  281. //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。
  282. if (_nodes.length == 0) { $$("div", { "className": "UCD_R_C_Line", "innerHTML": "" }, $("#UCD_CT_Code_CT")[0]); }
  283. //循环绘制行号。内容已经有了,不需要绘制了
  284. for (var i = 0; i < _nodes.length; i++) {
  285. $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
  286. }
  287. //_HH.scrollTop = $("#UCD_CT_Code_CT")[0].scrollHeight; //设置行号滚动窗口
  288. }
  289. //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。解决历史遗留问题。
  290. U.CD.R.RemoveMoreLine = function (c) {
  291. if (c.innerHTML == "") return c; //如果code为空,返回
  292. //var _r = c.cloneNode(); //用赋值语句是无法清除节点的,因为赋值2个对象修改任何一个另外一个也会修改,只能克隆。。使用克隆方法会遇到节点减少的问题。 //采用创建新节点的方式。
  293. var _r = document.createElement("div"); //创建一个新的div接受代码窗口赋值,否则,会出现引用循环问题。
  294. var _nodes = c.getElementsByTagName("div");
  295. for (var i = 0; i < _nodes.length; i++) {
  296. if (!_nodes[i].getElementsByTagName("div").length > 0)
  297. _r.appendChild(_nodes[i].cloneNode(true)); //克隆节点带true才能把里面内容全部拷贝。
  298. }
  299. return _r;
  300. }
  301. //此函数可以刷新子iframe框架的内容。如果是Chrome浏览器,则不能,Chrome不支持iframe窗口的location.reload。是Chrome的一个Bug
  302. U.CD.CD.IFReload = function () {
  303. //$("#UCD_CT_SM_IF")[0].contentWindow.document.body.innerHTML += ""; //执行iframe中的内容,这是bug?
  304. //var _jr = $("#UCD_CT_SM_IF")[0].contentDocument || $("#UCD_CT_SM_IF")[0].contentWindow.document;
  305. //判断浏览器。
  306. if (U.CI.getBrowser().browser == "chrome") { U.CD.CD.ExecIF($("#UCD_CT_Code_CT")[0]); }
  307. else {
  308. var _jr = window.frames["UCD_CT_SM_IF"].document;
  309. _jr.location.reload();
  310. }
  311. }
  312. //检查是否为htm
  313. U.UP.IsHTML = function () {}
  314. //是否删除了UJ.js文件,如果删除了,提示用户,用于键盘回车键按下的时候。
  315. U.CD.CD.IsDeleteDomain = function (s) {
  316. var z = s.replace(/\r\n/g, '\n').split('\n'), i;
  317. for (i = 0; i < z.length; i++) {
  318. if (z[i].lTrim().Rtrim() == "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>") {
  319. U.CD.CD.AlertDomain();
  320. return true;
  321. }
  322. }
  323. return false;
  324. }
  325. //当出现错误时在视图页面填充错误信息以及用户提醒。
  326. U.CD.CD.FillErrorInfo = function () {
  327. 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>";
  328. U.CD.CD.DrawCode(_d, false);
  329. }
  330. //US.G = {}; //做一个统一的全部变量存放地方。否则,变量比较乱。
  331. //US.G.ImgType = ["jpg", "gif", "png", "bmp", "jpeg"]; //太多地方要判断是否为图片了。做一个全局变量,否则很乱。为了避免重复,循环是全部转小写判断
  332. //判断是否为图片类型,filename为文件名,辅助函数,以后可删除。放在UC里面了
  333. //U.UP.IsImg = function (filename) {
  334. // var ext = U.UP.GetUpName(filename)[1].toLowerCase(); //得到文件扩展名并转换为小写。
  335. // var _A = US.G.ImgType, i; //全部转小写。
  336. // for (i = 0; i < _A.length; i++) {
  337. // if (ext == _A[i])
  338. // return true;
  339. // }
  340. // return false;
  341. //}
  342. //重新刷新iframe的新方法。。看起来无刷新,参数为代码区域的div...这句会到处调用,,这样可以做立时显示了,效果更好。
  343. U.CD.CD.FushIframe = function (_CA) {
  344. //下面用try catch做功能,。
  345. try { U.CD.CD.ExecIF(_CA); }
  346. catch (e) { U.CD.CD.AlertDomain(); }
  347. }
  348. //独立出这个函数是为了加try catch。,暂时无用。
  349. U.CD.CD.ExecIF = function (_CA) {
  350. //直接执行下面一句话会不停的往iframe里面追加内容,是追加,不是替换,会导致重复,
  351. //$("#UCD_CT_SM_IF")[0].contentWindow.document.write(_CA.innerText);
  352. //晕了,搞了半天,其实只需要做运行时自动追加一个<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>即可。
  353. //_CA.innerText=U.CD.CD.Is1473Domain(_CA.innerText);
  354. var s = U.CD.CD.ExecIFText(_CA); //判断Chrome浏览器在效果左右边加&nbsp的问题。
  355. //用这几句话会替换iframe中的内容,并且无需重新装载iframe,像本机操作。
  356. var newDoc = $("#UCD_CT_SM_IF")[0].contentWindow.document.open("text/html", "replace");
  357. newDoc.write(s);
  358. //if() ie7有Bug,按道理需要newDoc.close(),但ie7敲入特殊字符(!!)会导致整个屏幕死掉。解决方案可以判断ie7,不关闭。暂时全部不要close。
  359. //排除会导致ie7假死的字符。
  360. //if (U.CI.getBrowser().browser != "rv") newDoc.close(); //rv是firefox的标记,奇怪了
  361. newDoc.close();
  362. }
  363. U.M.Setprototype(String, "Rtrim", function () { return this.replace(/(\s*$)/g, ""); }); //去掉右边空格
  364. //传入代码窗口div,得到里面的innerText,由于兼容性问题,需要独立一个函数。
  365. U.CD.CD.ExecIFText = function (_CA) {
  366. var s = _CA.innerText || _CA.textContent; //textContent兼容FireFox,但好像还是有问题
  367. //s = s.replace(/&nbsp;/ig, ""); //去掉所有的nbsp,因为是输出结果,所有可以这样做。
  368. //如果是chrome浏览器,需要去掉除html标签行的左右空格。
  369. if (U.CI.getBrowser().browser == "chrome") { s = U.CD.CD.ExecIFCompChrome(s); }
  370. if (U.CI.getBrowser().browser == "firefox") { s = U.CD.CD.ExecIFCompChrome(s); }
  371. if (U.CI.getBrowser().browser == "rv") { s = U.CD.CD.ExecIFCompChrome(s); } //rv也是firefox的
  372. //强制追加一行,不管有没有<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>。只是做执行时追加,以前想得太复杂。
  373. s = s + "\n" + "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>";
  374. s = s + "\n" + "<link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />";
  375. return s;
  376. }
  377. //判断是否有1473主域,否则会出现跨域访问。如果没有,则需要在head中追加。
  378. U.CD.CD.Is1473Domain = function (s) {
  379. var i, _t = s.replace(/\r\n/g, '\n').split('\n');
  380. //找到1473主域js,不理会,直接返回
  381. for (i = 0; i < _t.length; i++) { if (_t[i].toLowerCase().indexOf("http://d.1473.cn/UJ.js".toLowerCase()) > -1) return s; }
  382. //大于7行,则插入到head中插入比较复杂,暂时不理会这个函数
  383. if (_t.length > 7) {
  384. _t.splice(5, 0, "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>");
  385. //合并输出到s。此功能暂未实现。
  386. }
  387. //小于4行,则视为乱码,另外初始化代码区域,把内容追加到body中。
  388. if (_t.length < 4) {
  389. s = U.CD.CD.InitCode(s); //追加s到初始化代码的body中。
  390. }
  391. return s;
  392. }