2013-10-03 2 views
5

テキストバーに入力した直後に縦棒(|)をDevanagari Danda(。 JavaScriptを使用して。テキストバーに入力した直後に、縦棒( "|")をDevanagari Danda( "。")に置き換えます。

最初に私はHow to change characters typed in Firefoxで与えられた解決策を試しました。しかし、それは最後に文字を追加します。

したがって、私はhttp://www.jsfiddle.net/EXH2k/6/で与えられた解答に従いました。これは、Tim DownがChanging the keypressshow different keyboard character from the typed one in google chromeで提案した解法に従いました。しかし、それは私のためには機能しません(FirefoxでもIE 10でも)。

コード:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link type="text/css" rel="stylesheet" href="stylesheet.css" /> 
    <script type="text/javascript"> 
     function transformTypedChar(charStr) { 
      return charStr == "|" ? "।" : charStr; 
     } 

     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 offsetToRangeCharacterMove(el, offset) { 
      return offset - (el.value.slice(0, offset).split("\r\n").length - 1); 
     } 

     function setInputSelection(el, startOffset, endOffset) { 
      el.focus(); 
      if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { 
       el.selectionStart = startOffset; 
       el.selectionEnd = endOffset; 
      } else { 
       var range = el.createTextRange(); 
       var startCharMove = offsetToRangeCharacterMove(el, startOffset); 
       range.collapse(true); 
       if (startOffset == endOffset) { 
        range.move("character", startCharMove); 
       } else { 
        range.moveEnd("character", offsetToRangeCharacterMove(el, endOffset)); 
        range.moveStart("character", startCharMove); 
       } 
       range.select(); 
      } 
     } 

     $("#inputTextArea").keypress(function (evt) { 
      if (evt.which) { 
       var charStr = String.fromCharCode(evt.which); 
       var transformedChar = transformTypedChar(charStr); 
       if (transformedChar != charStr) { 
        var sel = getInputSelection(this), val = this.value; 
        this.value = val.slice(0, sel.start) + transformedChar + val.slice(sel.end); 

        // Move the caret 
        setInputSelection(this, sel.start + 1, sel.start + 1); 
        return false; 
       } 
      } 
     }); 
    </script> 
</head> 
<body> 
    <textarea name="input" id="inputTextArea" rows="10"></textarea> 
</body> 
</html> 

答えて

5

非常に簡単です。などを扱う改行を使用してコードを捨て、ちょうどそれを行う:

$(document).ready(function() { 
    $('#my-input').on('input', function() { 
     var $input = $(this), 
      curVal = $input.val(); 
     var cursorPos = curVal.slice(0, this.selectionStart).length; 

     $input.val(curVal.replace(/[|]/g, '।')); 
     this.setSelectionRange(cursorPos, cursorPos); 
    }); 
}); 

の作業例:|(。)私は、垂直バーを交換したいJSFiddle

+0

はところで:私はクロームとFFでそれをテストしたので、私は、Linuxを実行していますよ。おそらくIEに問題があります: -/ – schlingel

+0

+1キャレットの位置を保持し、ペーストをサポートします。 –

+0

ありがとうございます。 Firefoxでは動作しますが、IEでは動作しません。でも、大丈夫です。 – jyotesh

1

()デーヴァナーガリー段田と、すぐに それはjavascriptを使用してtextareaに入力されるので。

あなたはできるだけ早くそれが入力されている文字を置き換えたいので、これは最も簡単なオプションがあります。

$('#inputTextArea').on("keyup", function(e) { 
    $(this).val($(this).val().replace(/[|]/g, "।")); 
}); 

私はあなたのjQueryをタグ付けしていないにもかかわらず、あなたはあなたの中にjQueryを使用していることに気づきましたコード。したがって、jQueryベースのソリューションです。

迅速フィドル:http://jsfiddle.net/THEre/

+0

+1私はあなたから/ [|]/gパターンをとったので+1します。しかし、あなたのコードはカーソルposを処理しません。 – schlingel

+1

@schlingelもちろん、私は彼に少なくとも彼に方向性を与えるために、迅速かつ汚れた解決策を打ち明けました。 Yoursはより完全なソリューションであり、私はすでにあなたに+1しています。 :) – Abhitalks

関連する問題