请查看http://jsfiddle.net/amitbas/gyvNW/94/
上的工作演示现在 searchBackward函数,当按下shift + Tab时,向后搜索相对于光标位置的[]中定义的内容不起作用。我在searchBackward函数中放了各种警报语句 请注意,searchForward功能正在工作中 请建议。
jsfilldle代码如下
$(document).ready(function() {
$('textarea').live('keydown', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
if (e.shiftKey) {
var currentIndex = getCaret($(this).get(0));
searchBackward($(this), currentIndex);
return e.preventDefault()
} else {
var currentIndex = getCaret($(this).get(0));
searchForward($(this), currentIndex);
return e.preventDefault()
}
}
});
});
function searchForward(element, currentIndex) {
var rSearchTerm = /(\[.*?\]+)/;
var val = element.val();
var matchStartPos, matchEndPos;
var m = val.substr(currentIndex).match(rSearchTerm);
if (!m){
currentIndex = 0;
m = val.match(rSearchTerm);
}
console.log(m);
if (m) {
matchStartPos = m.index;
matchEndPos = matchStartPos + m[0].length;
} else {
currentIndex = 0;
matchStartPos = 0;
matchEndPos = 0;
}
var input = element.get(0);
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(matchStartPos + currentIndex, matchEndPos + currentIndex);
} else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', matchEndPos + 1 + currentIndex);
range.moveStart('character', matchStartPos + currentIndex);
range.select();
}
}
function searchBackward(element, currentIndex) {
// var rSearchTerm = /(\].*?\[+)/;
var rSearchTerm = /(\[.*?\]+)/;
var val = element.val();
// alert (val);
var matchStartPos, matchEndPos;
var m = val.substr(currentIndex).match(rSearchTerm);
// alert ('m is ' + m);
if (!m){
currentIndex = 0;
m = val.match(rSearchTerm);
// alert ('!m is ' + m);
}
// console.log(m);
if (m) {
matchStartPos = m.index;
// alert(matchStartPos + 'matchStartPos is');
matchEndPos = matchStartPos - m[0].length
// alert(matchEndPos + 'matchEndPos is');
} else {
currentIndex = 0;
matchStartPos = 0;
matchEndPos = 0;
}
var input = element.get(0);
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(matchStartPos + currentIndex, matchEndPos + currentIndex);
} else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', matchEndPos - 1 - currentIndex);
range.moveStart('character', matchStartPos - currentIndex);
range.select();
}
}
function getCaret(el) {
if (el.selectionEnd) {
return el.selectionEnd;
} else if (document.selection) {
el.focus();
var r = document.selection.createRange();
if (r == null) {
return 0;
}
var re = el.createTextRange(), rc = re.duplicate();
re.moveToBookmark(r.getBookmark());
rc.setEndPoint('EndToStart', re);
return rc.text.length;
}
return 0;
}
答案 0 :(得分:0)
代码似乎很有趣。所以我看了一下。
以下是我所做的更改:
该行:
var m = val.substr(currentIndex).match(rSearchTerm);
变为:
var m = val.substr(0,currentIndex).match(rSearchTerm);
从文字开头搜索。
该行:
matchEndPos = matchStartPos - m[0].length
应该与正向功能相同:
matchEndPos = matchStartPos + m[0].length
进行选择的行:
input.setSelectionRange(matchStartPos + currentIndex, matchEndPos + currentIndex);
应该是(从行开始):
input.setSelectionRange(matchStartPos , matchEndPos );
结果在这里:http://jsfiddle.net/Q62tX/
不......不太对劲。它应该采取匹配的最后一项。