js 公式编辑器 - 自定义匹配规则 - 带提示下拉框(2)
插入输入框
首先插入下拉框,当然留到后面插入也可以(你开心你说什么都是对的),但是这里有个点需要注意一下:为什么选择插入在body下?因为我们获取到的下拉框的位置是绝对定位坐标。
// 插入下拉框 _this.dropdown = $('<ul class="editTips" style="display:none;"></ul>'); // 获取到的弹出的下拉框的位置是绝对定位的坐标,所以得把弹出的层放到$("body").after(_this.dropdown); _this.dropdown.css({ 'width':opts.dropdownWidth, 'position':'absolute', }); _this.css({ 'position': 'relative', });
注意:这里我们提一下,要获取检索值,即 selectVal,我们需要知道事件触发时光标所在的位置,即 oldCurrentPos,以及光标当前位置 currentPos,有了这两个 下标,我们才能动态获取 selectVal
获取光标当前位置
关于获取输入框光标以及获取值等方法,不了解的朋友可以去看一下 range 方法,当然无数前辈已经做过无数归纳总结讲解(向前辈们敬礼~):
// 获取当前光标位置 currentPos var getStart =function() { var all_range = ''; if (navigator.userAgent.indexOf("MSIE") > -1) { //IE if( _this.get(0).tagName == "TEXTAREA" ){ // 根据body创建textRange all_range = document.body.createTextRange(); // 让textRange范围包含元素里所有内容 all_range.moveToElementText(_this.get(0)); } else { // 根据当前输入元素类型创建textRange all_range = _this.get(0).createTextRange(); } // 输入元素获取焦点 _this.focus(); // 获取当前的textRange,如果当前的textRange是一个具体位置而不是范围,textRange的范围从currentPos到end.此时currentPos等于end var cur_range = document.selection.createRange(); // 将当前的textRange的end向前移"选中的文本.length"个单位.保证currentPos=end cur_range.moveEnd('character',-cur_range.text.length) // 将当前textRange的currentPos移动到之前创建的textRange的currentPos处, 此时当前textRange范围变为整个内容的currentPos处到当前范围end处 cur_range.setEndPoint("StartToStart",all_range); // 此时当前textRange的Start到End的长度,就是光标的位置 currentPos = cur_range.text.length; } else { // 文本框获取焦点 _this.focus(); // 获取当前元素光标位置 currentPos = _this.get(0).selectionStart; //console.log("光标当前位置:"+currentPos); } // 返回光标位置 return currentPos; };
获取检索值开始位置
检索开始位置,即事件触发时光标所在位置,直白来说,就是把事件触发时光标所在位置 currentPos 赋值给 oldCurrentPos 储存起来,然后与新的 currentPos 组