/*代码显示窗口*/ Namespace.register("U.CD.CD"); //------------------------------------------------------当拖动一个元素到iframe区域后,追加代码到Code区域------------------------------- //参数h为待追加元素。 U.CD.CD.AppendHTML = function (h) { //获取代码区域 var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域 var _ins = U.CD.CD.SplitHTML(h.outerHTML); //待插入元素数组。//有些浏览器不支持此属性,没办法。只能随主流。 //找到Body所在节点。 var _codes = _CA.getElementsByTagName("div"); //获取代码区域div数组,以循环查找body。解决了前后空格问题 for (var i = 0; i < _codes.length; i++) { if (_codes[i].innerText.trim().toLowerCase() == "
") {//找到Body后追加添加的元素。 //找到>符合的位置,下面元素前面追加几个空格 var _space = _codes[i].innerText.indexOf('>') - 1; //在元素前面追加空格,封装到U.UF.S。很多地方要用到。 for (var j = 0; j < _ins.length; j++) { var _d = $$("div", { "className": "UCD_R_C_Line", "innerText": _ins[j].addPreSpace(_space) }); //带插入div内容 _CA.insertBefore(_d, _codes[i + 1 + j]); //javascript只有插入前面的函数,插入位置需要计算。 U.CD.CD.DrawLine(_HH, _CA); //插入行号。 } return; //插入完毕后返回 } } } //此函数已经转移到主项目中 U.UF.EV.addPrototype(String, "addPreSpace", function (n) { var i, k = ""; for (i = 0; i < n; i++) k += " "; return k + this; }); //在字符串前面追加n个空格 //---------------------------------------------------初始化时根据iframe的内容刷新代码区域的初始内容-------------------------------- //代码区域初始化函数。好像还没有初始化哦。只能在系统第一次运行时调用? U.CD.CD.Init = function (node) { //获取CD文件的内容追加到Code区域,最好能实现换行操作,此种方法由于不支持Chrome,所以另外做了一个函数。 //var _i = $("#UCD_CT_SM_IF")[0]; _i.src = "http://d.1473.cn/RS.htm?ver="+Math.random(); //U.MD.IframeLoad(_i, [[U.CD.CD.InitAsyn, ([_i])]]); //用户未登录或者点击新建文件时之前执行的内容。直接获取iframe中内容,反馈到代码窗口。当结果视图有值时,新建文件就会有内容,导出出错,必须重新刷新。 //U.CD.CD.DrawCode($("#UCD_CT_SM_IF")[0].contentWindow.document.documentElement.outerHTML); U.CD.CD.DrawCode(U.CD.CD.InitCode(), false); //初始化代码后绘制在代码窗口 U.CD.CD.ExecIF($('#UCD_CT_Code_CT')[0]); U.CD.R.Save(node); //初始化保存按钮。此处还可以简化,明天再来。 } //iframe加载Cd.htm异步回调。 U.CD.CD.InitAsyn = function (i) { //如果是Chrome,缓存了上一次iframe的内容,好心做了坏事啊。。iframe还是记录了上一次的内容。 //看来初始化要换一种方法,直接写入编码到代码区域,然后输出到iframe中。 U.CD.CD.DrawCode(i.contentWindow.document.documentElement.outerHTML, true); } //获取RS.htm的所有内容。 //------------------------------------------------根据代码窗口刷新结果窗口的值。---------------------------------------- //根据代码区域的innerText刷新iframe显示结果,很多地方用到,封装为一个函数。小窗口运行效果。 //参数_CA为$("#UCD_CT_Code_CT")[0]代码元素。给代码窗口赋值,只能通过给代码窗口赋值,然后获取代码窗口innerText,才能最简单的得到给iframe打印的值,否则会带html标签到iframe。 U.CD.CD.DisNode = function (node) { var _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域 // console.log(node.Content); //数据库中保存的是所有的Div,带了样式,如果不带样式,则javascript,css必须用算法计算出来,比较复杂,暂时解决不了。, _CA.innerHTML = node.Content; //所以暂时浪费存储,求取简单化。,此上下2句话是把包含了hmtl标记的字符全部转换为没有html标记的字符,有技巧。 //晕,下面这句做执行时做就OK了。 //_CA.innerText = U.CD.CD.Is1473Domain(_CA.innerText); //检测node.Content是否包含了1473主域,没包含会导致跨域问题,直接追加一个1473主域js。 U.CD.CD.DrawCode(_CA.innerText, false); //调用统一的往代码窗口赋值函数,包括初始化从iframe中获取,已经装载用户自己的文件代码。 U.CD.R.Save(node); //保存结果?在打开的时候给保存按钮赋予保存事件!因为会打开多个文件,每个文件都会有对象的事件,一直发生变化 } //--------------------------------------------------------------通用方法--------------------------------------------- //当在Code编辑区中按下了回车键时,执行换行符操作,并刷新结果窗口,键盘回车键可能是13,也可能是10 //gs触发的格式:比如通过onkeydown触发的,返回qt。做switch判断到底是什么样子的键盘事件 //r是返回值。 //一个复杂的函数,统一的功能,用户统一处理函数,做一个回调。 U.CD.R.Wrap = function (gs, r) { //_HH代码行号 _CA代码区域 _T 提示信息 var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0], _T = $("#UCD_TP_TB")[0]; var _k = event.keyCode; //键盘按下的键值 //U.CD.Tip.KeyDown(_k, r); //转到代码提示窗口判断,由于键盘事件是依附于某一个div。所以要单独做在提示框中。 //alert(_k); //因为主空函数编辑器区域把光标也监控了,所以排除0这个键值,即光标。 //如果按下了Tab键盘,空4格子,已经在UC里面统一处理了。。。。 if (_k == 9) { //var _R = U.UF.E.GetSelectionRange(window, $("#UCD_CT_Code_CT")[0], document); //获取光标位置。 //var _G = _R.Replace(" "); //追加4个空格到光标前面 //U.M.StopDefault(); //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //要重新添加代码框键盘事件才能再次触发? } //如果按下了删除Delete键盘。有可能用户删除了一个字符,也可能删除了一个行的div。需要重新计算行数,才能匹配 if (_k == 46 || _k == 8) { //此函数响应不及时,原因还待分析,暂时这样。 var _last, _lines = _HH.childNodes.length - _CA.childNodes.length; var _t = $("#UCD_CT_HH_CT")[0].childNodes.length, c, y; document.getSelection().anchorNode.className == 'UCD_R_C_Line' ? y = document.getSelection().anchorNode : y = document.getSelection().anchorNode.parentElement var _a = U.CD.getNodeIndex(y); //获取当前div是第几个 // for (var i = 0; i <= _lines; i++) { // _last = _HH.lastElementChild || _HH.lastChild; //兼容写法,其实可以做成自己的函数,这里要做自己的函数!!! // _HH.removeChild(_last); // } var qn = setTimeout(function () { if (_CA.childNodes.length <= _HH.childNodes.length) { // if (_HH.childNodes.length - _CA.childNodes.length == 1) { for (var i = _HH.childNodes.length; i > parseInt($("#UCD_CT_Code_CT")[0].scrollHeight / 20); i--) { _HH.childNodes[i - 1].remove(); } // for (var i = _a; i < _t; i++) { //// if (i % 2 == 1) { //// $("#UCD_CT_Code_CT")[0].childNodes[i - 1].style.background = "rgba(245,245,245,0.5)" //// } else { // $("#UCD_CT_Code_CT")[0].childNodes[i].style.background = "" //// } // } for (var i = 0; i <= _CA.childNodes[_CA.childNodes.length - 1].childNodes.length; i++) { if (($("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i] && $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].tagName) == 'SPAN') { var _T = $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].innerText; $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].remove(); $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].innerText += _T; return; } } if ($("#UCD_CT_HH_Code")[0].clientHeight > $("#UCD_CT_HH_Code")[0].scrollHeight) { $("#UCD_CT_HH_Code")[0].scrollTop -= 25; } // } else { // for (var i = _HH.childNodes.length; i > _CA.childNodes.length; i--) { // _HH.childNodes[i - 1].remove(); // } // for (var i = 0; i <= _CA.childNodes[_CA.childNodes.length - 1].childNodes.length; i++) { // if (($("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i]&&$("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].tagName) == 'SPAN') { // var _T = $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].innerText; // $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].childNodes[i].remove(); // $("#UCD_CT_Code_CT")[0].childNodes[_a - 1].innerText += _T; // return; // } // // } // if ($("#UCD_CT_HH_Code")[0].clientHeight > $("#UCD_CT_HH_Code")[0].scrollHeight) { // $("#UCD_CT_HH_Code")[0].scrollTop -= 25; // } // } } }, 50); } if (_k == 10 || _k == 13 && gs != "UP") { //如果代码输入提示框已经出现,则回车键作用于提示框 if (_T.style.display == "none") { //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js,所以,不允许。//获取当前光标选中的字符包含的div。 //if (!U.CD.CD.StrFilter(U.CD.TipR.GetPStyle())) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。 if (!U.CD.CD.StrFilter(U.CD.TipR.Parent(null, true))) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。 U.M.StopDefault(); U.CD.CD.DrawLine(_HH, _CA); //添加新行 U.CD.CD.newLine(U.CD.TipR.Parent(null, true)); //同时需要检测新行的颜色为绿色,则要变成默认的,编辑器比较复杂啊 U.CD.CD.FushIframe(_CA); //根据代码窗口内容刷新小窗口iframe中立时显示的内容 } } if (_k == 0) { _T.style.display = "none"; } //获取到编辑区域光标事件后,隐藏提示框 //如果是.号,显示代码提示窗口。/如果是鼠标获取到了光标,并按下了,则隐藏提示框。//如果是.和并且没有按住Shift键 //代码提示功能要做完善,至少要1个月,还要考虑兼容性问题,暂时不实现!!!!!!!!!!!!!!!!!!!! if (_k == 190 && window.event.shiftKey == false) { if (U.CD.Tip.IsJs(r[0])) {//判断提示框是否为javascript U.CD.TipR.Replace("."); // //U.CD.TipR.GetGBWZ(r[0]); //得到位置索引,可以用Replace函数直接替换。 U.CD.Tip.Show(); U.M.StopDefault(); return; } if (U.CD.Tip.IsCss()) { } //判断提示框是否为css,这部分还没开始做 } //当按了Delete键盘,删除代码时,判断删除的代码是否包含了跨域js文件,如果有,提示用户不能删除。 //if (_k == 46) { //判断选择的文件是否包含了跨域文件,如果包含了,则要提示用户。 //var s = U.CD.TipR.GetSelectedText(); //if (U.CD.CD.IsDeleteDomain(s)) { U.M.StopDefault(); return; } //U.M.StopDefault可以阻止浏览器默认行为。 //} _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口 U.CD.CD.FushIframe($("#UCD_CT_Code_CT")[0]); } //嗯,原来javascript本身是有回车换行符号的,不过用记事本看不到的。这解决了一个问题。 //但也引起了一个新的问题。 //暂时用传入参数区分是初始化还是从数据库中获取,从数据库中获取回车换行是正确的,初始化时取iframe的outerhtml回车换行是不正确的 U.CD.CD.SplitHTML = function (h, init) { if (init) return U.CD.CD.SplitHTMLInit(h); //如果是Chrome或者FireFox,换行符号是'\n' //如果是ie8,换行符号是空格。这就很难办了 //如果是ie7,换行符号是'\r\n' var _B = U.UF.CI.getBrowser(); //获取浏览器信息 //if (_B.browser == "msie" && _B.ver == "7.0") return h.split('\r\n'); //为了识别换行,暂时强制让浏览器兼容ie7. //if (_B.browser == "msie" && _B.ver == "8.0") { return U.CD.CD.SplitHTMLInit(h); } //替换所有的\r\n为\n,但苹果好像不是这样兼容的 return h.replace(/\r\n/g, '\n').split('\n'); } //拆分HTML编码,适合于编辑器,不止是拆分html编码,同时还需要把中间的文字提出出来,例如javascript代码,div中间的文字等。 //在IE7浏览器下面,通过下标[]操作尽然无法获取到此下标对应的字符,得到undefined,所以采用charAt函数。 //最基本的字符串拆分,才是最复杂的,比如json增删查改。Google,百度就靠这个 //做得不完善,还需要继续完善。还差前面4个空格的判断了。。!! U.CD.CD.SplitHTMLInit = function (h) { //h = h.TrimAll(); //看1473U.MS里面,去掉所有空格回车。晕,此函数不正确。 //h = h.replace(/\s+/g, "");//这句正确,修改到1473UC中。但对于本项目不起作用,因为有些地方还必须要空格 var i, s, e = 0, a = []; //a为返回的数组,i循环变量。s为<的起始点位置记录。e为单个字符的起始位置。 for (i = 0; i < h.length; i++) { if (h.charAt(i) == "<") { if (e > s) {//如果e>s,表示e的记录晚于上一个s。 if (h.substring(e, i).replace(/\s+/g, "") != "")//有时候把前面4个空格,Tab等也作为一个数组了,需呀判断剔除,暂时这样写,以后用1473的函数, a.push(h.substring(e, i)); //记录文本数据。还差一个记录前面空格了 } s = i; } if (h.charAt(i) == ">") { if (h.charAt(i + 1) != "<") { e = i + 1; //记录不是html标记的起始位置。 } a.push(h.substring(s, i + 1)); } }; return a; } //把传入进来的html内容,不带的加上div分行标签。此处在控件中追加控件后会调用。。。比较重要。 U.CD.CD.DrawCode = function (h, init) { // h ,init //这里为什么不原样获取数据库内容和RS.htm中的内容,然后原样输出呢?因为获取RS.htm里面的内容排版是混乱的。同时有些特殊标记,例如注释等需要特别解析。 //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //给键盘事件,比如回车键赋予新函数。监控回车变化。这一句不能要.要了后U.CD.R.Wrap没有回调参数 /* ::迭代 var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域 var _a = U.CD.CD.SplitHTML(h, init), i; //行号 _CA.innerHTML = ""; //代码内容清空。 _HH.innerHTML = ""; //行号清空 for (i = 0; i < _a.length; i++) { $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号 //如果是注释,则标记绿色 U.CD.CD.AllFilComments(_a[i], _CA); } _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口 */ var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域 var _a = U.CD.CD.SplitHTML(h, init), i; //行号 _CA.innerHTML = ""; //代码内容清空。 _HH.innerHTML = ""; //行号清空 for (i = 0; i < _a.length; i++) { $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号 //如果是注释,则标记绿色 if (_a[i] == "") { _a[i] = '