123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651 |
- /*代码显示窗口*/
- 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>") {//找到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></div>的加上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] = '<br>' }
- 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": "<br>" }, $(p).Parent(), $(p).next()[0]);
- // } else {
- // var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "<br>" }, $(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 == "<br>") { return; }
- U.CD.Next(_a);
- // } else {
- // var c = $$("div", { "className": "UCD_R_C_Line", "innerHTML": "<br>" }, $(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 == "<br>") { 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 = '<br>' : $(".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("所有文件必须引用<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>,否则会拒绝访问,请仔细检查");
- }
- 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);
- //晕了,搞了半天,其实只需要做运行时自动追加一个<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>即可。
- //_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); }
- //强制追加一行,不管有没有<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>。只是做执行时追加,以前想得太复杂。
- //s = s + "\n" + "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>";
- //s = s + "\n" + "<script src='http://d.1473.cn/js/Main/U.CD.IF.js' type='text/javascript'></script>";
- //s = s + "\n" + "<link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />";
- //这种加分在形成html文档时会自动追加到head中。但在ie下面js失效。
- //var j = "<link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' />";
- //var j = j + "\n" + "<script src='http://www.1473.cn/uform.js' type='text/javascript'></script>";
- //j = j + "\n" + "<script src='js/External/U.CD.Config.js' type='text/javascript'></script>";
- // j = j + "\n" + "<script type='text/javascript'>window.BMap_loadScriptTime = (new Date).getTime();</script>";
- //var j = "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>";
- //j = j + "\n" + "<script src='http://d.1473.cn/js/Main/U.CD.IF.js' type='text/javascript'></script>";
- //var l = s.toLowerCase().split("<head>");
- //s = l[0] + "<head>"+"\n " + j + l[1];
- // s = j + s;
- //s = s + "\n" + "<script src='http://www.1473.cn/js/UC/UC21.js' type='text/javascript'><\/script>";
- //s = s + "\n" + "<script src='http://d.1473.cn/js/U.CD.IF.js' type='text/javascript'><\/script>";
- //s = s + "\n" + "<link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />";
- return s;
- }
- U.UF.EV.addPrototype(String, "RemoveNBSP", function () { return this.replace(/ /ig, ""); }); //去掉所有的 标签
- //兼容Chrome以及IE9以后的自动填充&ngsp的问题。
- U.CD.CD.ExecIFCompChrome = function (s) {
- var z = s.replace(/\r\n/g, '\n').split('\n'), i, s = "";
- for (i = 0; i < z.length; i++) {
- //晕,昨天发现Chrome在div的中间有空格都不行。需要判断div中是否有nbsp字符?
- //if (z[i].indexOf("<") >= 0 && z[i].indexOf(">") >= 0){ z[i] = z[i].RemoveNBSP(); }//去掉所有$nbsp。不起作用!!很难调试。
- //else { z[i] = z[i].lTrim().Rtrim(); } //去掉左右空格
- z[i] = z[i].lTrim().Rtrim();
- s += z[i] + "\n"; //添加换行符
- //昨天遇到样式表前面留空格,在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦,有了思路再看。因为此处是运行时,所以其实不需要前面的if判断,所有空格全部清除。
- }
- //return z.join(""); //这是把字符串数组转为字符串的函数,但会去掉回车符号,不能使用。
- return s;
- }
- //初始化代码区域,不传递
- U.CD.CD.InitCode = function (s) {
- //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";
- // 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";
- // if (s) _d += s + "\n"; //如果传递了参数,则把参数加在body里面,否则执行初始化代码
- // _d += "</body>\n</html>";
- var _d = "<html xmlns='http://www.w3.org/1999/xhtml'>" + "\n";
- _d += "<head>" + "\n";
- _d += "<title></title>" + "\n";
- _d += "<!--uform.js常用函数库-->" + "\n";
- _d += "<script src='http://www.1473.cn/uform.js' type='text/javascript'></script>" + "\n";
- _d += "<!--uformd.js所有UI模式调用的函数例如:登录注册弹出网盘、论坛、窗体-->" + "\n";
- _d += "<script src='http://www.1473.cn/uformd.js' type='text/javascript'></script>" + "\n";
- _d += "<script src='js/External/U.CD.Config.js' type='text/javascript'></script>";
- _d += "<!--uform.css所有的UI的样式整个1473的模型样式-->" + "\n";
- _d += "<link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' />" + "\n";
- _d += "</head>" + "\n";
- _d += "<body>" + "\n";
- _d += "<!-- html元素写在下面 -->" + "\n";
- _d += "</body>" + "\n";
- _d += "</html>" + "\n";
- // var j = "<link href='http://www.1473.cn/uform.css' rel='stylesheet' type='text/css' />";
- // var j = j + "\n" + "<script src='http://www.1473.cn/uform.js' type='text/javascript'></script>";
- // j = j + "\n" + "<script src='js/External/U.CD.Config.js' type='text/javascript'></script>";
- 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 && 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 && 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 == '<br>') { $$("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];
- //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。
- 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; //设置行号滚动窗口
- }
- //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个,但徐嘉伟那边可以有多个,代码难度很大。解决历史遗留问题。
- 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, "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>"); //合并输出到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() == "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>") {
- // U.CD.CD.AlertDomain();
- // return true;
- // }
- // }
- // return false;
- //}
- //当出现错误时在视图页面填充错误信息以及用户提醒。
- //U.CD.CD.FillErrorInfo = function () {
- // 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>";
- // 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;
- //}
|