U.CD.Tips.js 6.9 KB

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