2013-03-01 13 views
9

contentaditable divのようにFacebookを実装しようとしています。 '$'と 'a'のような文字を入力すると、私のキャレットポジション近く。JavaScriptのキャレット位置の前に最後の文字を取得

IEのJavaScriptと他のブラウザのいずれかで、キャレット位置の前に最後の文字を見つける方法を知る必要があります。私はJqueryライブラリにアクセスできます。

(function($) { 
    $.fn.getCursorPosition = function() { 
     var input = this.get(0); 
     if (!input) return; // No (input) element found 
     if ('selectionStart' in input) { 
      // Standard-compliant browsers 
      return input.selectionStart; 
     } else if (document.selection) { 
      // IE 
      input.focus(); 
      var sel = document.selection.createRange(); 
      var selLen = document.selection.createRange().text.length; 
      sel.moveStart('character', -input.value.length); 
      return sel.text.length - selLen; 
     } 
    } 
})(jQuery); 

eg. 
var caretPosition = $("#contenteditablediv").getCursorPosition(); 
var lastchar = getchar(caretposition -1);??? 
+1

機能はIE以外のブラウザでのcontentEditable要素のために動作しません。それは入力とテキストエリア用です。 –

+0

はい私はそれが単なる例であることを知っています。キャレットの位置の前に最後の文字を見つけるために他の方法を教えてもらえますか? – Anoop

答えて

20

これを行う方法の例を示します。編集可能な要素の先頭から始まり、キャレットの直前で終了し、範囲のテキストを取得し、その範囲の最後の文字を返す範囲を作成します。

デモ:http://jsfiddle.net/MH5xX/

コード:

function getCharacterPrecedingCaret(containerEl) { 
    var precedingChar = "", sel, range, precedingRange; 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.rangeCount > 0) { 
      range = sel.getRangeAt(0).cloneRange(); 
      range.collapse(true); 
      range.setStart(containerEl, 0); 
      precedingChar = range.toString().slice(-1); 
     } 
    } else if ((sel = document.selection) && sel.type != "Control") { 
     range = sel.createRange(); 
     precedingRange = range.duplicate(); 
     precedingRange.moveToElementText(containerEl); 
     precedingRange.setEndPoint("EndToStart", range); 
     precedingChar = precedingRange.text.slice(-1); 
    } 
    return precedingChar; 
} 
+1

こんにちは、その魅力のような作品。ありがとう。私はもう一つ問題があります。私はInfragisticsのコンテンツエディタを使用しています。 IEではdivになりますが、Chromeではiframeになります。私はiframeで試してみましたが、動作していません。どうすればiframeで見つけることができますか?ありがとうございました – Anoop

+0

@Anoop: 'document'と' window'への参照を文書とウィンドウオブジェクトで置き換える必要がありますiframeあまりにも厳しくはありません。 –

+0

ありがとうございます。私のために働いています。Iframeを使用しているChromeでは、document.getElementById( 'iframe_id')、window.getSelectionではなくcontentDocument.getSelection()を使用しました。そして、私はrange.setStart(containerEl.contentDocument.body、0)を使用しました。 insead of range.setStart(containerEl、0);もう一度ありがとうございます。あなたがこのリンクのための解決策を提案することができます[コンテンツ編集可能divのキャレット位置の近くに自動提案divを表示する方法](http://stackoverflow.com/questions/15159692/how-to-show-an-auto -suggestion-div-near-the-content-in-a-content-editable) – Anoop

関連する問題