/*代码显示窗口*/ 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.MS。很多地方要用到。 for (var j = 0; j < _ins.length; j++) { var _d = $$("div", { "className": "UCD_R_C_Line", "innerText": _ins[j].addPreSpace(_space) }); //带插入div内容,addPreSpace在字符串前面追加n个空格 _CA.insertBefore(_d, _codes[i + 1 + j]); //javascript只有插入前面的函数,插入位置需要计算。 U.CD.CD.DrawLine(_HH, _CA); //插入行号。 } return; //插入完毕后返回 } } } //---------------------------------------------------初始化时根据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.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]; //行号和代码区域 //数据库中保存的是所有的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.D.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) { //此函数响应不及时,原因还待分析,暂时这样。 var _last, _lines = _HH.childNodes.length - _CA.childNodes.length; for (var i = 0; i <= _lines; i++) { _last = _HH.lastElementChild || _HH.lastChild; //兼容写法,其实可以做成自己的函数,这里要做自己的函数!!! _HH.removeChild(_last); } } if (_k == 10 || _k == 13) { //如果代码输入提示框已经出现,则回车键作用于提示框 if (_T.style.display == "none") { //先检查是否在主域文件之上写了代码,如果写了,在Ie里面会识别不了下面的js,所以,不允许。//获取当前光标选中的字符包含的div。 if (!U.CD.CD.StrFilter(U.CD.TipR.GetPStyle())) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题,例如ie7使用!!会导致浏览器假死。。 U.CD.CD.DrawLine(_HH, _CA); //添加新行 //同时需要检测新行的颜色为绿色,则要变成默认的,编辑器比较复杂啊 //U.CD.CD.FushIframe(_CA); //根据代码窗口内容刷新小窗口iframe中立时显示的内容 } } if (_k == 0) { _T.style.display = "none"; U.CD.R.CErrF.style.backgroundColor = "white"; } //获取到编辑区域光标事件后,隐藏提示框,并重置代码窗口错误行的颜色 //如果是.号,显示代码提示窗口。/如果是鼠标获取到了光标,并按下了,则隐藏提示框。//如果是.和并且没有按住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"; //设置行号滚动窗口 } //嗯,原来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.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.trim(); //看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) { //这里为什么不原样获取数据库内容和RS.htm中的内容,然后原样输出呢?因为获取RS.htm里面的内容排版是混乱的。同时有些特殊标记,例如注释等需要特别解析。 //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": 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"; //设置行号滚动窗口 //U.CD.CD.FushIframe(_CA); //反馈到结果视图中。 } //绘制行号 U.CD.CD.DrawLine = function (_HH,_CA) { var _line = _HH.getElementsByTagName("div").length + 1; //增加一个行号 $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": _line }, _HH); //绘制行号 _HH.style.height = _CA.scrollHeight+"px"; //设置行号滚动窗口 } //初始化代码区域,不传递 U.CD.CD.InitCode = function () { return U.CD.CL.LangArr[U.CD.CL.Lang(U.CD.USLang)][0]; //初始化默认返回每种语言的第一位。 //var _d = "#include \nvoid main(){\n printf(\"hello world\");\n}\n"; //if (s) _d += s + "\n"; //如果传递了参数,则把参数加在body里面,否则执行初始化代码 //_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"; //return _d; } //在字符串前面追加n个空格,参数s为待插入字符,n为在第几个字符位置插入,以后还可以继续改写 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;}); //返回元素位于父亲节点的索引位置,返回-1表示错误。因为有可能为0,不能返回false. U.M.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.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.M.IndexOfParent(_C); } //添加注释函数,还没完成,以后继续。主要用户按下回车键获取当前行的判断 U.CD.CD.FilterComments = function (s) { //如果是//,则表示注释,标记为绿色。怎么标记?插入span标签? var _G = U.CD.TipR.GetPStyle(),_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.M.Setprototype(String, "lTrim", function () { return this.replace(/(^\s*)/g, ""); }); //去掉左边空格 U.CD.CD.AllFilComments = function (s, _CA) { //这里是复杂条件,该如何做?暂时如此,因为以后还会添加 var _fz = false; if (s.indexOf("") >= 0) { _fz = true; } //html注释。 if (s.lTrim().substr(0, 2) == "//") { _fz = true; } // //注释。 //实际添加条目。 if (_fz) { $$("div", { "style": { "color": "green" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); } else { $$("div", { "className": "UCD_R_C_Line", "innerText": s }, _CA); } //如果没有内容,则追加一行div,以后的新行都会是div,否则是p标签。 } U.M.Setprototype(String, "RemoveNBSP", function () { return this.replace(/ /ig, ""); }); //去掉所有的 标签 //去掉运行结果或者错误结果中每行字符的右边空格以及目录标识。 U.CD.CD.ExecLangBack = function (s) { //如果用户在ide中输入的是数字,则s.replace会出错。需要转换为字符串 if (typeof (s) == "number") s = s.toString(); //截取掉以./userfiles/开始的+32位guid字符,. / 在正则表达式中必须加转义字符反斜杠\,有些编译型的格式为/output/userfiles,解释型的为./output //s = s.replace(/\.\/userfiles\/\w{32}/g, "test"); s = s.replace(/(\.\/output|\.|)\/userfiles\/\w{32}/g, "test"); //(\.\/output|\.|)表示或者.或者./output或者什么都没有(在nodejs中会什么什么都没有), 所有转义前面加反斜杠\ 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.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].Rtrim(); //Python居然用空格作为标识来运行程序,晕了!只能排出掉Python语言 if(U.CD.USLang!="Python") z[i] = z[i].lTrim(); //Chrome浏览器必须要截取掉左边的空格,奇怪了 s += z[i] + "\n"; //添加换行符 //昨天遇到样式表前面留空格,在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦,有了思路再看。因为此处是运行时,所以其实不需要前面的if判断,所有空格全部清除。 } //return z.join(""); //这是把字符串数组转为字符串的函数,但会去掉回车符号,不能使用。 return s; } //--------------------------------------暂时无用的函数------------------------------------------------------------------------- //绘制运行窗口的代码!初始化时会运行,从数据库中获取代码后也会运行。在代码窗口输入内容时不执行。 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.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(); } } //检查是否为htm U.UP.IsHTML = function () {} //是否删除了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; //} //重新刷新iframe的新方法。。看起来无刷新,参数为代码区域的div...这句会到处调用,,这样可以做立时显示了,效果更好。 U.CD.CD.FushIframe = function (_CA) { //下面用try catch做功能,。 try { U.CD.CD.ExecIF(_CA); } catch (e) { U.CD.CD.AlertDomain(); } } //独立出这个函数是为了加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.CI.getBrowser().browser != "rv") newDoc.close(); //rv是firefox的标记,奇怪了 newDoc.close(); } U.M.Setprototype(String, "Rtrim", function () { return this.replace(/(\s*$)/g, ""); }); //去掉右边空格 //传入代码窗口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.CI.getBrowser().browser == "chrome") { s = U.CD.CD.ExecIFCompChrome(s); } if (U.CI.getBrowser().browser == "firefox") { s = U.CD.CD.ExecIFCompChrome(s); } if (U.CI.getBrowser().browser == "rv") { s = U.CD.CD.ExecIFCompChrome(s); } //rv也是firefox的 //强制追加一行,不管有没有。只是做执行时追加,以前想得太复杂。 s = s + "\n" + ""; s = s + "\n" + ""; return s; } //判断是否有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; } //大于7行,则插入到head中插入比较复杂,暂时不理会这个函数 if (_t.length > 7) { _t.splice(5, 0, ""); //合并输出到s。此功能暂未实现。 } //小于4行,则视为乱码,另外初始化代码区域,把内容追加到body中。 if (_t.length < 4) { s = U.CD.CD.InitCode(s); //追加s到初始化代码的body中。 } return s; }