2010-10-19 2 views
12

Каков наилучший способ сделать это в jQuery? Это должно быть довольно распространенным случаем.Замена выделенного текста в текстовом поле

  1. Пользователь выбирает текст в текстовое поле
  2. Он нажимает на ссылку
  3. текст в ссылке заменяет выделенный текст в текстовое поле

Любой код будет высоко ценится - Я с некоторыми проблемами с частью 3.

+0

Свойства 'selectionStart' и' selectionEnd' вашего 'textarea' или' input' все, что вам нужно В наше время. Объедините это с методом 'slice' на значение входного элемента. – caw

ответ

16

Вот как вы можете это сделать, во всех основных браузерах. У меня также есть jQuery plug-in, который включает в себя эту функциональность. При том, что код будет

$("your_textarea_id").replaceSelectedText("NEW TEXT"); 

Вот полный автономное решение:

function getInputSelection(el) { 
    var start = 0, end = 0, normalizedValue, range, 
     textInputRange, len, endRange; 

    if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { 
     start = el.selectionStart; 
     end = el.selectionEnd; 
    } else { 
     range = document.selection.createRange(); 

     if (range && range.parentElement() == el) { 
      len = el.value.length; 
      normalizedValue = el.value.replace(/\r\n/g, "\n"); 

      // Create a working TextRange that lives only in the input 
      textInputRange = el.createTextRange(); 
      textInputRange.moveToBookmark(range.getBookmark()); 

      // Check if the start and end of the selection are at the very end 
      // of the input, since moveStart/moveEnd doesn't return what we want 
      // in those cases 
      endRange = el.createTextRange(); 
      endRange.collapse(false); 

      if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { 
       start = end = len; 
      } else { 
       start = -textInputRange.moveStart("character", -len); 
       start += normalizedValue.slice(0, start).split("\n").length - 1; 

       if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { 
        end = len; 
       } else { 
        end = -textInputRange.moveEnd("character", -len); 
        end += normalizedValue.slice(0, end).split("\n").length - 1; 
       } 
      } 
     } 
    } 

    return { 
     start: start, 
     end: end 
    }; 
} 

function replaceSelectedText(el, text) { 
    var sel = getInputSelection(el), val = el.value; 
    el.value = val.slice(0, sel.start) + text + val.slice(sel.end); 
} 

var el = document.getElementById("your_textarea"); 
replaceSelectedText(el, "[NEW TEXT]"); 
+0

Это будет удивительно полезный плагин. Спасибо огромное! Это странно, как этот вариант использования еще не накрыт. Я пробовал писать свои собственные, но попал во многие причуды браузера. ;) –

+0

replaceSelectedText - единственная проблема, с которой я вижу, это то, что в IE, когда ничего не выбрано, курсор переходит на передний план, а не в конец. во всяком случае, что можно исправить? –

+0

В коде, размещенном здесь или в плагине jQuery? Здесь код не делает попыток изменить выбор впоследствии, для краткости. Плагин jQuery должен иметь дело с этим. –

Смежные вопросы