0

スニペットをhtmlテキストエリアに実装しようとしています。特定の単語を書くと、Key Valueオブジェクトを調べて、テキストが存在する場合はそれを展開します。これが私がしたことです:

var textarea = document.getElementById("whatever");
var snippets = {
    'hello': 'Hello and welcome to my great site'
}
var prepend = "";

var checkCaps = function(e){
  if (e.keyCode != 9) return;
  e.preventDefault();
  var string = "";
  var pos = textarea.selectionStart;
  var text = textarea.value.split("");
  while (pos) {
    char = text.pop(pos);
    prepend =  (char == " ") ? " ": ""; 
    if (char == " ") break;
    string += char 
    pos -= 1;
  }
  if (snippets[string.reverse()]) {
      textarea.value = text.join("")
      textarea.value += prepend + snippets[string.reverse()]
  }
}


textarea.addEventListener("keydown", checkCaps, false);

String.prototype.reverse=function(){return this.split("").reverse().join("");}

http://jsfiddle.net/JjTmd/

問題は、スニペットがテキストエリアの最後の単語でのみ機能するvalueことであり、問​​題がどこにあるかを特定できないようです。

4

1 に答える 1

1

Array.popパラメータを受け入れません。配列から最後の項目を削除して返します。splice特定のインデックスのアイテムを削除するために使用します。

次のように関数を変更しましたが、目的の動作をしているようです。

var checkCaps = function(e){
  if (e.keyCode != 9) return;
  e.preventDefault();
  var string = "";
  var pos = textarea.selectionStart;
  var text = textarea.value.split("");
  while (pos) {
    char = text.splice(pos-1,1);
    prepend =  (char == " ") ? " ": ""; 
    if (char == " ") break;
    string += char 
    pos -= 1;
  }
  if (snippets[string.reverse()]) {
      var start = text.splice(0, pos);
      var end = text.splice(pos + string.length);

      textarea.value = start.join("") + snippets[string.reverse()] + prepend + text.join("") + end.join("");
  }
}

http://jsfiddle.net/JjTmd/1/

また、おそらく改行文字もチェックする必要があります。

while (pos) {
    char = text.splice(pos-1,1);

      if (char == " " || char == "\n") {
          prepend = char;
          break;
      }
    string += char 
    pos -= 1;
}

http://jsfiddle.net/JjTmd/2/

于 2012-10-02T20:40:30.173 に答える