123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- Namespace.register("U.CD.Tip");
- //一个包含提示值得数组
- U.CD.Tip.d = ["getElementById", "getElementsByTagName", "toString", "valueOf", "appendChild", "apply", "call", "removeChild", "style", "getElementsByTagName", "getElementsByTagName", "getElementsByTagName"];
- U.CD.Tip.d.style = ["width", "height", "top", "left", "backgroundColor", "color", "", "", ""];
- //代码提示时响应此函数。
- U.CD.Tip.Init = function () {
- //创建tips菜单在document.body中
- var _TBOX = $$("div", { "id": "UCD_TP_TB", "style": { "display": "none"} }, document.body); //document.body
- for (var i = 0; i < U.CD.Tip.d.length; i++) {//循环提示值数组
- var _ct = $$("div", { "className": "UCD_TP_TB_N" }, _TBOX); //追加变量图标
- $$("div", { "className": "UCD_TP_TB_N_T", "innerHTML": "☆" }, _ct); //追加变量图标
- $$("div", { "className": "UCD_TP_TB_N_D", "innerHTML": U.CD.Tip.d[i], "onmouseover": [U.CD.Tip.Active, ([i])], "onmousedown": [U.CD.Tip.SI, ([U.CD.Tip.d[i]])] }, _ct); //追加文件值和事件
- }
- }
- //显示提示框函数
- U.CD.Tip.Show = function () {
- var _T = $("#UCD_TP_TB")[0]; //提示框最大外框
- //var _R = U.D.E.GetSelectionRange(window, $("#UCD_CT_Code_CT")[0], { "TF": "UCD_CODE", "CB": U.CD.R.Wrap }); //获取光标位置。必须重新获取光标位置,奇怪,以后研究
- var _R = U.CD.TipR; //从全局变量获取
- var _G = _R.GetPStyle(); //获取当前光标选中的字符包含的div。
- var _GWZ = _R.GetGBWZ(_G); //返回光标位于div行第几个的字符位置
- var _if = U.M.GetElementInfo(_G); //获取div的各种间距
- if (_T.style.display == "none") { //如果存在tips框
- _T.style.display = "block"; //不用创建直接显示
- //获取行的距离+字符间距约为10*字符序列 //高度要加上行高
- _T.style.left = _if.BCRL + U.CD.Tip.GetStrWidth(_GWZ) + "px"; //_T.style.left = _if.BCRL + _GWZ * 10 + "px";
- _T.style.top = _if.BCRT + 10 + "px"; _T.firstChild.style.backgroundColor = "silver"; _T.firstChild.focus(); //聚集
- _T.onkeydown = U.M.apply(this, [[U.CD.Tip.KeyDown, ([_R])]]); //赋予键盘事件
- }
- }
- //计算提示框的垂直位置,因为有些地方会导致下面看不到,以后再搞了。
- U.CD.Tip.YPosition = function () { }
- //获取光标坐标位置的函数,其他地方没有的,需要封装在编辑器中。临时创建一个span,字体大小和字体设置得和编辑器一样,计算宽度,用完删除。
- U.CD.Tip.GetStrWidth = function (_GWZ) {
- var i, _re = ""; for (i = 0; i < _GWZ; i++) { _re += "a"; } //有些空格及特殊字符会导致问题,现在采用追加"aaaaaaaaaaaaaaa"试一下
- var _w, _a = $$("div", { "innerHTML": _re, "style": { "cssText": "font-family:Consolas; font-size:14px; position:absolute;top:5000px;left:0px;"} }, document.body);
- _w = _a.offsetWidth; document.body.removeChild(_a); return _w; //移除临时节点
- }
- //在body区域按下左键,隐藏提示框,还差一个在iframe区域如何判断是否按下左键。光标置于提示区域之外都要隐藏//提示框外壳//判断鼠标是否在提示框之外。
- U.CD.Tip.HidTip = function () { $("#UCD_TP_TB")[0].style.display = "none"; }
- //js实现hover;
- U.CD.Tip.Active = function (_index) {
- var _t = $("#UCD_TP_TB")[0], _z = _t.childNodes; //获取tips菜单框 //获取提示数组
- for (var i = 0; i < _z.length; i++) {
- if (i == _index) { _z[i].style.backgroundColor = "rgb(255,236,181)"; } //选中的索引数字
- else { _z[i].style.backgroundColor = ""; }
- }
- }
- //判断提示框的第几个元素被选中,也可做全局变量,暂时用局部变量。//循环选择返回选中的索引
- U.CD.Tip.CurPosition = function () {
- var _t = $("#UCD_TP_TB")[0], _z = _t.childNodes; //获取tips菜单框 //获取提示数组
- for (var i = 0; i < _z.length; i++) { if (_z[i].style.backgroundColor != "") return i; }
- return 0; //默认返回第一个。
- }
- //选择提示菜单单击时追加代码到代码区域.tipvalue 这是选中的值。_R为所选择的光标,参数r为选项的值。
- U.CD.Tip.SI = function (r) {
- var _R = U.CD.TipR; //从全局变量获取
- var _G = _R.Replace(r); //追加值到光标后面
- $("#UCD_TP_TB")[0].style.display = "none"; // //获取Tip菜单隐藏
- //U.M.StopBubble();此处会触发代码区域的回车键,如何阻止?
- }
- //键盘控制函数,一个程序只能有1个键盘控制函数,因此把此键盘函数注入到主程序键盘中。
- U.CD.Tip.KeyDown = function (_R) {
- var _k = event.keyCode, _i = 0, _t = $("#UCD_TP_TB")[0], _z = _t.childNodes.length, _d; //获取tips菜单框 ,_z为数组长度,_d为选中的提示符。//获取提示数组
- _i = U.CD.Tip.CurPosition(); //获取提示框的当前位置
- if (_t.style.display != "none") {
- if (_k == 38) { if (_i > 0) _i--; } //按下↑//初始>0//减一
- if (_k == 40) { if (_i < _z) { _i++; } else { _i = _z - 1; } } //按下↓//小于数组长度//加一//选择最后一个
- //按下回车键
- if (_k == 10 || _k == 13) {
- _R.Replace(""); _d = _t.childNodes[_i]; U.CD.Tip.SI(U.CD.Tip.d[_i], _R); U.M.StopDefault(); return;
- }
- if (_k == 8 || _k == 27) { U.CD.Tip.HidTip(); _R.Replace(""); } //按下了退格键,则隐藏提示框_k == 8 表示Backspace键盘 27代码esc键盘 //创建光标,使用空字符串
- U.CD.Tip.Active(_i);
- }
- }
- //判断是否该弹出提示框,条件为:从当前行往上找,没有找到script标签,则不弹出,如果找到script标签,则弹出。参数为当前行
- //以后的工作更加繁重,因为还有css样式的智能弹出。这个工作量比较大了
- U.CD.Tip.IsJs = function (h) {
- //如果上一行为</sciprt>跳出 如果上一行是否有"<script" 这几个字符,则弹出提示
- var _ch; //
- //判断本行元素,判断字符前面是否有变量,如何判断呢?.前面是否有字符作为判断,并且中间没有.号,如果有.号,可以显示字符串函数!如有改动,以后再说。
- //整个判断比较复杂,思路以后再理。
- var _R = U.CD.TipR; var _G = _R.GetPStyle(); var _GWZ = _R.GetGBWZ(_G);
- var _z = h.innerText.substr(0, _GWZ).trim(); //得到前面的字符。
- if (_z.length <= 0) { return false; } // <=1是因为有1个.号
- //判断上一行元素
- while (h.previousSibling != null) {
- h = h.previousSibling, _ch = h.innerText.trim();
- if (_ch.substr(0, 9).toLowerCase() == "</script>") break; //跳出循环。
- if (_ch.substr(0, 7).toLowerCase() == "<script") { return true; }
- }
- return false;
- }
- //判断提示框是否为css,包含了在html元素中的以及独立的css。
- U.CD.Tip.IsCss = function () { return false; }
|