2017-09-22 1 views
0

は私がmarkdownに変換するが、適切なキャレットを(JavaScriptで)設定する方法は?

<p class="session" contenteditable="true"> 
    Everything contained <b>**within**</b> this div is editable in browsers 
    that support <code>`HTML5`</code>. Go on, give it a try: click it and 
    start typing. 
</p> 

は私が入力中に、適切なHTMLタグを追加したい...、適切な解決策を考え出すことはできません。

もちろん、単純な正規表現の置き換えでは問題ありません。しかし、適切な場所にキャレットを置くのに問題があります。

上記の例では、「試し」という言葉を強調したいとします。 *を最初に入力し、次に左の星*を入力すると、テキストは<i>*try*</i>に変換されますが、キャレットの位置を保持したい(キャレットを左の*の後に設定します)。そして、その逆の場合は、右の*が最後に設定されます。

contained <b>**within**</b> this部分に下線を引いて設定するのがより困難です。 _contained <b>**within**</b> this_<u>_contained <b>**within**</b> this_</u>になります。だから私たちは同じノードにいません。

私は複雑な解決法を考えることができますが、私はこれらのテキスト変換テクニック(範囲、ウィンドウの選択など)に熟練していないので、それを実行するよく知られた方法があるのだろうかと思います。

+2

"右*最初と左の星*を入力している間に、テキストは * try *に変換されますが、キャレットの位置を保持したい(左後に*を設定します)そして、右の*が最後に設定されているところの逆もまた同様です。 " – Chetan

+0

2つの状況があります。ユーザは最初に '*'をタイプし、テキストを 'try'で書き込むか、または既存の単語' try'の後にカーソルをセットし、最後の '*'をタイプします。 ユーザは 'try'(または何でも)を書くことができ、最後の' * 'を最初に入力し、次に' try'の前に移動して最初の '*'をタイプすることができます。 この場合、カーソルはここで ' * try * 'になるはずです。カーソルは' * | try * 'になるはずです。 –

答えて

0

は、私が最初のステップとして、私はバックの位置にキャレットを置くしようとした第二段階では、キャレット位置を取得しようとしていFiddle

をチェックしてください。

$('.session').keyup(function(){ 
//alert("happening"); 
var sel = window.getSelection(); 
var offset=sel.anchorOffset; 
// you can change the text in div by uncommeting the line below and replace your text with mathcing regex . 
//$('.session').text($('.session').text().replace('/(\*.\*)+/','<i>$1<i>')); 
setCaret(offset); 
$('.session') 
}); 

function setCaret(offset) { 

    var el = $('.session'); 
    //alert(); 
    var range = document.createRange(); 
    var sel = window.getSelection(); 

    range.setStart(el[0].childNodes[0],offset); 
    range.collapse(true); 
    sel.removeAllRanges(); 
    sel.addRange(range); 
    el.focus(); 
} 

必要に応じて部門のテキストを変更する方法を理解する必要があります。 div内のテキストを置換する際にも、ソリューションが機能するように書式設定を維持します。

関連する問題