修改功能以替换文本并在按下按钮时添加克拉

Modify function to replace text as well as add at carat when button pressed

我编写了一些代码,根据按下哪个按钮将文本添加到文本区域框,如果您愿意,可以使用一个非常简单的编辑器。

目前代码只是在光标所在的位置插入选定的文本,但如果文本被突出显示,那么我希望它也将文本换行。

我在 http://jsfiddle.net/gffeab94/3/

有一个 jsfiddle

但为了清楚起见,函数是

jQuery("document").ready(function($){

  $('#bold').on('click', function () {
  _insertAtCaret($('#transcription-page-wikitext'), "'''bold text here'''");
});

$('#italic').on('click', function () {
  _insertAtCaret($('#transcription-page-wikitext'), "<del> </del>");
});

$('#strike').on('click', function () {
  _insertAtCaret($('#transcription-page-wikitext'), "{{Paul}}");
});

function _insertAtCaret(element, text) {
  var caretPos = element[0].selectionStart,
      currentValue = element.val();

  element.val(currentValue.substring(0, caretPos) + text + currentValue.substring(caretPos));
return false;
}

})

而 html 是

 <div>
      <!-- editor buttons -->
      <p>
        <button id ="bold" class="btn btn-small btn-info" type="button">Bold</button>
        <button id ="italic" class="btn btn-small btn-info" type="button">Italic</button>
        <button id ="strike" class="btn btn-small btn-info" type="button">Strikeout</button>
      </p>
      <!-- text area -->
      <textarea name="transcription-page-wikitext" id="transcription-page-wikitext" cols="76" rows="16">some text</textarea>        
</div>

如何更改函数以理想地换行或替换突出显示的文本,而不是仅仅在光标位置插入?

使用文本区域的 selectionEnd 属性 以及 selectionStart 和简单的字符串操作。

演示:http://jsfiddle.net/gffeab94/4/

代码:

function _insertAtCaret(element, text, textBefore, textAfter) {
    var el = element[0];
    var start = el.selectionStart;
    var end = el.selectionEnd;
    var newStart = start;
    var newEnd = end;
    var val = el.value;
    var beforeSel = val.slice(0, start);
    var afterSel = val.slice(end);
    if (start == end) {
        el.value = beforeSel + text + afterSel;
        newEnd += text.length;
    } else {
        el.value = beforeSel + textBefore + val.slice(start, end) +
                   textAfter + afterSel;
        newStart += textBefore.length;
        newEnd = newStart + end - start;
    }
    el.setSelectionRange(newStart, newEnd);
}