Изменить существующую логику перемещения для обратного направления

0

Посмотрите рабочую демонстрацию на 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;
}
Теги:

1 ответ

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/

Нет... не совсем правильно. Он должен взять последний элемент, который соответствует.

  • 0
    Однако, спасибо в примере Hi Press Tab First [this] является [an] примером. Тестирование [amit] снова [this] и [again] и [again] Итак, когда в этом случае при нажатии Shift + Tab фокус фокусируется только на [this], а не на обход. Shift + Tab должен вести себя как Tab, но только в обратном направлении
  • 0
    @diago_mb вот модифицированный jsfillde jsfiddle.net/amitbas/F7Lpa/1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню