U.CD.Tips.js 6.8 KB

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