2017-02-06 6 views
1

テキスト入力のライブプレビューを試しています。jQueryでテキスト入力ボックス内の特定の場所を選択

現在のところ、ユーザーは入力時にテキストをプレビューすることができ、また、実際のプレビューテキストをクリックして入力フィールドを選択することもできます。私がしたいのは、ユーザーがライブプレビューテキストをクリックし、テキストフィールドのカーソルが、プレビューでクリックされたテキストとまったく同じ場所に表示されるようにすることです。 (任意のソリューションは、複数の入力フィールドで動作する必要があります)

以前の投稿は、範囲または特定の単語(下記参照)をハイライトする方法を示していますが、私がしようとしているJavascript/JQueryを見つけることができませんでした。どんな助言も役に立つでしょう!

関連スタックオーバーフローの質問:Selecting Part of String inside an Input Box with jQuery

$(document).ready(function() { 
 
    $('.liveInput').keyup(function(){ 
 
    var $this = $(this); 
 
    $('.'+$this.attr('id')+'').html($this.val()); 
 
    }); 
 

 
    $('.description').click(function(){ 
 
    $('#description').focus(); 
 
    }); 
 

 
    $(".description").hover(function() { 
 
    $(this).toggleClass("preview-hover"); 
 
    }); 
 
});
.preview-hover { 
 
    cursor:pointer; 
 
    opacity: 0.5; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<textarea id="description" class="liveInput" name="description" cols="80" rows="8" style="width:100%; resize:vertical;" placeholder="POST CONTENT"></textarea> \t \t \t \t 
 

 
<div> 
 
    <p class="description"></p>     
 
</div>

+0

段落フォーム入力/ TEXTAREAフィールドに位置をクリックしてではなく、検出することができます '$の.caret()'と呼ばれるプラグインjQueryがあります。これは助けますか? http://codepen.io/anon/pen/MJByEo –

答えて

0

私は、これはあなたが探しているものだと思います。

$('.liveInput').keyup(function(){ 
 
    var $this = $(this); 
 
    $('.'+$this.attr('id')+'').html($this.val()); 
 
}); 
 
    
 
$('.description').click(function(){ 
 
    s = window.getSelection(); 
 
     var range = s.getRangeAt(0); 
 
     var node = s.anchorNode; 
 

 
     $('.liveInput')[0].setSelectionRange(range.startOffset, range.startOffset); 
 

 
}); 
 
    
 
$(".description").hover(function() { 
 
    $(this).toggleClass("preview-hover"); 
 
});
.preview-hover { 
 
    cursor:text; 
 
    opacity: 0.5; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<textarea id="description" class="liveInput" name="description" cols="80" rows="8" style="width:100%; resize:vertical;" placeholder="POST CONTENT"></textarea> \t \t \t \t 
 

 
<div> 
 
    <p class="description"></p>     
 
</div>

+0

すごい、そんなにあなた! – Ron

+0

うれしかった –

0

ロジックは単純です:

  1. spanで各文字を包みます。
  2. .descriptionをクリックして正確にspanを取得し、jQueryの.index()を使用してそのインデックスを取得します。
  3. this答えのコードを使用して、そのインデックスにカーソルを移動します。

何かがわからない場合は教えてください。

また、私はある時点でこのコードが重くなるので、大きなテキストではこれを行わないことを推測しています。

$(document).ready(function() { 
 
    $('.liveInput').keyup(function(){ 
 
    var $this = $(this); 
 
    $('.'+$this.attr('id')+'').html(function() { 
 
     return $this.val().split('').map(function(char) { 
 
     return '<span>' + char + '</span>'; 
 
     }).join(''); 
 
    }); 
 
    }); 
 

 
    $('.description').click(function(e) { 
 
    var span = $(e.target); 
 
    var caretPos = $(this).find('span').index(span); 
 
    //var caretPos 
 
    var elem = $('#description')[0]; 
 
    if(elem.createTextRange) { 
 
     var range = elem.createTextRange(); 
 
     range.move('character', caretPos); 
 
     range.select(); 
 
    } 
 
    else { 
 
     if(elem.selectionStart) { 
 
     elem.focus(); 
 
     elem.setSelectionRange(caretPos, caretPos); 
 
     } 
 
     else 
 
     elem.focus(); 
 
    } 
 
    }); 
 

 
    $(".description").hover(function() { 
 
    $(this).toggleClass("preview-hover"); 
 
    }); 
 
});
.preview-hover { 
 
    cursor:pointer; 
 
    opacity: 0.5; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<textarea id="description" class="liveInput" name="description" cols="80" rows="8" style="width:100%; resize:vertical;" placeholder="POST CONTENT"></textarea> \t \t \t \t 
 

 
<div> 
 
    <p class="description"></p>     
 
</div>

+0

申し訳ありませんが、これは私のために働いていないようです(あなたの助けをありがとう!)別の男が何かを掲載しました。) – Ron

+0

プレビューをクリックすると何も起こりません)。私の答えではどういうことをしていませんか? –

関連する問題