/*代码显示窗口*/ 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] = '
' } if (i % 2 == 0) { U.CD.CD.AllFilComments(_a[i], _CA, true); } else { U.CD.CD.AllFilComments(_a[i], _CA, false); } } _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口 // U.CD.Editor.setValue(h); // U.CD.CD.FushIframe({ // "innerText": h // }); //反馈到结果视图中。 } //绘制行号 U.CD.CD.DrawLine = function (_HH, _CA) { var _line = _HH.getElementsByTagName("div").length + 1; //增加一个行号 for (var i = _HH.childNodes.length; i < parseInt($("#UCD_CT_Code_CT")[0].scrollHeight / 20) + 1; i++) { $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号 } _HH.style.height = _CA.scrollHeight + "px"; //设置行号滚动窗口 } //插入新的一行 做的太乱了 不想优化=.= U.CD.CD.newLine = function (p) { var _HH = $("#UCD_CT_HH_CT")[0].childNodes.length, c; if (document.getSelection().anchorNode.parentElement.tagName == 'SPAN') { //删除的时候 会有一个span承载内容 这样下面就不知道当前div是第几个了 加个判断 var _a = U.CD.getNodeIndex(document.getSelection().anchorNode.parentElement.parentElement) } else { var _a = U.CD.getNodeIndex(p); //获取当前div是第几个 } // if (_a + 2 == _HH) { // if (_HH % 2 == 1) { var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "
" }, $(p).Parent(), $(p).next()[0]); // } else { // var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "
" }, $(p).Parent(), $(p).next()[0]); // } if ($("#UCD_CT_HH_Code")[0].clientHeight < $("#UCD_CT_HH_Code")[0].scrollHeight) { $("#UCD_CT_HH_Code")[0].scrollTop += 20; } // if ($(".UCD_R_C_Line")[_a].innerHTML == "
") { return; } U.CD.Next(_a); // } else { // var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "
" }, $(p).Parent(), $(p).next()[0]); // for (var i = _a; i < _HH; i++) { // if ((i + 1) % 2 == 1) { // $("#UCD_CT_Code_CT")[0].childNodes[i].style.background = "rgba(245,245,245,0.5)" // } else { // $("#UCD_CT_Code_CT")[0].childNodes[i].style.background = "" // } // } // if ($("#UCD_CT_HH_Code")[0].clientHeight < $("#UCD_CT_HH_Code")[0].scrollHeight) { // $("#UCD_CT_HH_Code")[0].scrollTop += 20; // } // if ($(".UCD_R_C_Line")[_a].innerHTML == "
") { return; } // U.CD.Next(_a); // } U.CD.TipR.SL(c); } //字符串换行 U.CD.Next = function (_a) { if ($(".UCD_R_C_Line")[_a].innerText.length == document.getSelection().anchorOffset && $("#UCD_CT_HH_CT")[0].childNodes.length > _a) { return; } else { if (document.getSelection().anchorNode.parentElement.tagName == 'SPAN') { var _p = document.getSelection().anchorNode.parentElement.parentElement; } var array = $(".UCD_R_C_Line")[_a].innerText.split(''); //当前div的内容 拆分成数组 var _t = []; //留下来的字符 for (var i = 0; i < document.getSelection().anchorOffset; i++) { _t.push(array[i]) } var _BB = []; //要被换行的字符 for (var i = document.getSelection().anchorOffset; i < $(".UCD_R_C_Line")[_a].innerText.length; i++) { _BB.push(array[i]); } var _TT = _t.join(''); var _Next = _BB.join(''); _TT == '' ? $(".UCD_R_C_Line")[_a].innerHTML = '
' : $(".UCD_R_C_Line")[_a].innerText = _TT; $(".UCD_R_C_Line")[_a + 1].innerText = _Next; } } U.CD.getNodeIndex = function (node) { var i = 0; while (node = node.previousSibling) { i++; } return i; } //重新刷新iframe的新方法。。看起来无刷新,参数为代码区域的div...这句会到处调用,,这样可以做立时显示了,效果更好。 U.CD.CD.FushIframe = function (_CA) { //下面用try catch做功能,。 try { U.CD.CD.ExecIF(_CA); } catch (e) { U.CD.CD.AlertDomain(); } } //当用户没有http://d.1473.cn/UJ.js时,自动追加进去 U.CD.CD.ReInitDomain = function () { } //提示用户不能删除1473主域文件。 U.CD.CD.AlertDomain = function () { //alert("所有文件必须引用,否则会拒绝访问,请仔细检查"); } U.UF.EV.addPrototype(String, "Rtrim", function () { return this.replace(/(\s*$)/g, ""); }); //去掉右边空格 //独立出这个函数是为了加try catch。,暂时无用。 U.CD.CD.ExecIF = function (_CA) { //直接执行下面一句话会不停的往iframe里面追加内容,是追加,不是替换,会导致重复, //$("#UCD_CT_SM_IF")[0].contentWindow.document.write(_CA.innerText); //晕了,搞了半天,其实只需要做运行时自动追加一个即可。 //_CA.innerText=U.CD.CD.Is1473Domain(_CA.innerText); var s = U.CD.CD.ExecIFText(_CA); //判断Chrome浏览器在效果左右边加 的问题。 //用这几句话会替换iframe中的内容,并且无需重新装载iframe,像本机操作。 var newDoc = $("#UCD_CT_SM_IF")[0].contentWindow.document.open("text/html", "replace"); newDoc.write(s); //if() ie7有Bug,按道理需要newDoc.close(),但ie7敲入特殊字符(!!)会导致整个屏幕死掉。解决方案可以判断ie7,不关闭。暂时全部不要close。 //排除会导致ie7假死的字符。 //if (U.UF.CI.getBrowser().browser != "rv") newDoc.close(); //rv是firefox的标记,奇怪了 newDoc.close(); } //传入代码窗口div,得到里面的innerText,由于兼容性问题,需要独立一个函数。 U.CD.CD.ExecIFText = function (_CA) { var s = _CA.innerText || _CA.textContent; //textContent兼容FireFox,但好像还是有问题 //s = s.replace(/ /ig, ""); //去掉所有的nbsp,因为是输出结果,所有可以这样做。 //如果是chrome浏览器,需要去掉除html标签行的左右空格。 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); } //强制追加一行,不管有没有。只是做执行时追加,以前想得太复杂。 //s = s + "\n" + ""; //s = s + "\n" + ""; //s = s + "\n" + ""; //这种加分在形成html文档时会自动追加到head中。但在ie下面js失效。 //var j = ""; //var j = j + "\n" + ""; //j = j + "\n" + ""; // j = j + "\n" + ""; //var j = ""; //j = j + "\n" + ""; //var l = s.toLowerCase().split(""); //s = l[0] + ""+"\n " + j + l[1]; // s = j + s; //s = s + "\n" + "\n \n \n\n\n \n"; // var _d = "\n\n \n \n \n \n \n \n\n \n"; // if (s) _d += s + "\n"; //如果传递了参数,则把参数加在body里面,否则执行初始化代码 // _d += "\n"; var _d = "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += ""; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; _d += "" + "\n"; // var j = ""; // var j = j + "\n" + ""; // j = j + "\n" + ""; return _d; } //在字符串前面追加n个空格,参数s为待插入字符,n为在第几个字符位置插入,以后还可以继续改写 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; }); //返回元素位于父亲节点的索引位置,返回-1表示错误。因为有可能为0,不能返回false. U.UF.C.IndexOfParent = function (o) { var f = o.parentNode, i, s; if (!f) return -1; //找不到父亲节点,返回 s = f.childNodes; for (i = 0; i < s.length; i++) if (s[i] == o) return i; return -1; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。 U.CD.CD.StrFilter = function (SO) { var s = SO.innerText; //判断SO是否位于跨域js之前,如果是之前,返回false。并提示用户在正确的地方输入。使用新方法解决了此问题 //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js //if (U.CD.CD.GetInPos(SO) < 4) { alert("输入位置不对,请看下面注释!"); return false; } U.CD.CD.FilterComments(s); var _B = U.UF.CI.getBrowser(); //获取浏览器信息 if (_B.browser == "msie" && (_B.ver == "7.0" || _B.ver == "8.0")) { //如果包含了!!号,则提示用户ie7不允许输入!!号,返回 if (s.indexOf("!!") > -1) { alert("IE7,8输入'!!'会导致浏览器假死,请仔细检查!"); return false; } } return true; } //用户用户回车时的位置。 U.CD.CD.GetInPos = function (SO) { var _C, i; //如果用户拷贝代码,则会出现多层div。需要找到id为UCD_CT_Code_CT的div。 for (i = 0; i < 100; i++) { if (SO.parentNode.id != "UCD_CT_Code_CT") { SO = SO.parentNode; } else { _C = SO; break; } } return U.UF.C.IndexOfParent(_C); } //添加注释函数,还没完成,以后继续。还缺用户按下回车键获取当前行的判断 U.CD.CD.FilterComments = function (s) { //如果是//,则表示注释,标记为绿色。怎么标记?插入span标签? //var _G = U.CD.TipR.GetPStyle(), _fz = false; //获取当前光标选中的字符包含的div。 var _G = U.CD.TipR.Parent(null, true), _fz = false; //获取当前光标选中的字符包含的div。 if (s.indexOf("") >= 0) { _fz = true; } //html注释。 if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。 if (_fz) { $(_G).addAttrArray({ "style": { "cssText": "color:green"} }); } else { $(_G).addAttrArray({ "style": { "cssText": "color:#333"} }); } } //添加注释,当获取用户文件数据时使用。会循环调用此函数 U.UF.EV.addPrototype(String, "lTrim", function () { return this.replace(/(^\s*)/g, ""); }); //去掉左边空格 U.CD.CD.AllFilComments = function (s, _CA, _P) { //这里是复杂条件,该如何做?暂时如此,因为以后还会添加 var _fz = false; if (s.indexOf("") >= 0) { _fz = true; } //html注释。 if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。 //实际添加条目。 if (_fz && _P == false) { $$("div", { "style": { "color": "green" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); } // else if (_fz && _P == true) { $$("div", { "style": { "color": "green", "background": "rgba(245, 245, 245,0.5)" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); } else if (s == '
') { $$("div", { "className": "UCD_R_C_Line", "innerHTML": s }, _CA); } // else if (_P == true) { $$("div", { "className": "UCD_R_C_Line", "style": { "background": "rgba(245, 245, 245,0.5)" }, "innerText": s }, _CA); } else { $$("div", { "className": "UCD_R_C_Line", "innerText": s }, _CA); } //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。 } //拖拽展示代码部分 U.CD.CD.Drag = function (Top) { var _e = event || window.event; Top.clickY = _e.clientY; Top.Height = Top.parentNode.offsetHeight; Top.Height2 = $("#UCD_CT_IF")[0].offsetHeight document.addEventListener("mousemove", doDrag2, true); document.addEventListener("mouseup", stopDrag2, true); } doDrag2 = function () { var Top = $("#UCD_CT_HH_Drag")[0]; var _e = event || window.event; var t = Top.Height - _e.clientY + Top.clickY + 10; if (Top.clickY) { Top.parentNode.style.height = t + 'px'; $("#UCD_CT_IF")[0].style.height = (Top.Height2 + _e.clientY - Top.clickY) + 'px'; } } stopDrag2 = function () { $("#UCD_CT_HH_Drag")[0].clickY = false; } //--------------------------------------暂时无用的函数------------------------------------------------------------------------- //绘制运行窗口的代码!初始化时会运行,从数据库中获取代码后也会运行。在代码窗口输入内容时不执行。 U.CD.R.NoUse = function (_CA) { var _HH = $("#UCD_CT_HH_CT")[0]; //判断代码内容是否有多个
嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。 var _code = U.CD.R.RemoveMoreLine(_CA); //计算是否有重复的div,历史遗留问题。 _CA.innerHTML = _code.innerHTML; //反向赋值,否则无法显示,这处逻辑比较乱。思路不是很流畅。 _HH.innerHTML = ""; //清空所有行号? var _nodes = _code.getElementsByTagName("div"); //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。 if (_nodes.length == 0) { $$("div", { "className": "UCD_R_C_Line", "innerHTML": "" }, $("#UCD_CT_Code_CT")[0]); } //循环绘制行号。内容已经有了,不需要绘制了 for (var i = 0; i < _nodes.length; i++) { $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号 } //_HH.scrollTop = $("#UCD_CT_Code_CT")[0].scrollHeight; //设置行号滚动窗口 } //判断代码内容是否有多个
嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。解决历史遗留问题。 U.CD.R.RemoveMoreLine = function (c) { if (c.innerHTML == "") return c; //如果code为空,返回 //var _r = c.cloneNode(); //用赋值语句是无法清除节点的,因为赋值2个对象修改任何一个另外一个也会修改,只能克隆。。使用克隆方法会遇到节点减少的问题。 //采用创建新节点的方式。 var _r = document.createElement("div"); //创建一个新的div接受代码窗口赋值,否则,会出现引用循环问题。 var _nodes = c.getElementsByTagName("div"); for (var i = 0; i < _nodes.length; i++) { if (!_nodes[i].getElementsByTagName("div").length > 0) _r.appendChild(_nodes[i].cloneNode(true)); //克隆节点带true才能把里面内容全部拷贝。 } return _r; } //此函数可以刷新子iframe框架的内容。如果是Chrome浏览器,则不能,Chrome不支持iframe窗口的location.reload。是Chrome的一个Bug U.CD.CD.IFReload = function () { //$("#UCD_CT_SM_IF")[0].contentWindow.document.body.innerHTML += ""; //执行iframe中的内容,这是bug? //var _jr = $("#UCD_CT_SM_IF")[0].contentDocument || $("#UCD_CT_SM_IF")[0].contentWindow.document; //判断浏览器。 if (U.UF.CI.getBrowser().browser == "chrome") { U.CD.CD.ExecIF($("#UCD_CT_Code_CT")[0]); } else { var _jr = window.frames["UCD_CT_SM_IF"].document; _jr.location.reload(); } //$("#UCD_CT_SM_IF")[0].contentWindow.document.body.innerHTML += ""; //执行iframe中的内容,这是bug? //var _jr = $("#UCD_CT_SM_IF")[0].contentDocument || $("#UCD_CT_SM_IF")[0].contentWindow.document; //判断浏览器。 // if (U.UF.CI.getBrowser().browser == "chrome") { U.CD.CD.ExecIF({ "innerText": U.CD.Editor.getValue() }); } // else { // var _jr = window.frames["UCD_CT_SM_IF"].document; // _jr.location.reload(); // } } //判断是否有1473主域,否则会出现跨域访问。如果没有,则需要在head中追加。 //U.CD.CD.Is1473Domain = function (s) { // var i, _t = s.replace(/\r\n/g, '\n').split('\n'); //找到1473主域js,不理会,直接返回 // for (i = 0; i < _t.length; i++) { if (_t[i].toLowerCase().indexOf("http://d.1473.cn/UJ.js".toLowerCase()) > -1) return s; } // if (_t.length > 7) {//大于7行,则插入到head中插入比较复杂,暂时不理会这个函数 // _t.splice(5, 0, ""); //合并输出到s。此功能暂未实现。 // } // if (_t.length < 4) {//小于4行,则视为乱码,另外初始化代码区域,把内容追加到body中。 // s = U.CD.CD.InitCode(s); //追加s到初始化代码的body中。 // } // return s; //} //是否删除了UJ.js文件,如果删除了,提示用户,用于键盘回车键按下的时候。 //U.CD.CD.IsDeleteDomain = function (s) { // var z = s.replace(/\r\n/g, '\n').split('\n'), i; // for (i = 0; i < z.length; i++) { // if (z[i].lTrim().Rtrim() == "") { // U.CD.CD.AlertDomain(); // return true; // } // } // return false; //} //当出现错误时在视图页面填充错误信息以及用户提醒。 //U.CD.CD.FillErrorInfo = function () { // var _d = "\n\n \n \n \n\n\n
\n出错啦!!!\n
\n
\n代码中必须包含跨域文件http://d.1473.cn/uj.js。这是所有浏览器公有问题。\n
\n\n"; // U.CD.CD.DrawCode(_d, false); //} //US.G = {}; //做一个统一的全部变量存放地方。否则,变量比较乱。 //US.G.ImgType = ["jpg", "gif", "png", "bmp", "jpeg"]; //太多地方要判断是否为图片了。做一个全局变量,否则很乱。为了避免重复,循环是全部转小写判断 //判断是否为图片类型,filename为文件名,辅助函数,以后可删除。放在UC里面了 //U.UP.IsImg = function (filename) { // var ext = U.UP.GetUpName(filename)[1].toLowerCase(); //得到文件扩展名并转换为小写。 // var _A = US.G.ImgType, i; //全部转小写。 // for (i = 0; i < _A.length; i++) { // if (ext == _A[i]) // return true; // } // return false; //}