2012-01-19 12 views
3

私は別の質問でこれを見つけた:それは8番目の文字と12文字の間にテキスト領域からテキストを選択する必要がありsetSelectionRangeはブラウザ間で同じように動作しませんか?

setCaretToPos = function(input, selectionStart, selectionEnd){ 
     if(input.setSelectionRange){ 
     input.focus(); 
     input.setSelectionRange(selectionStart, selectionEnd); 

     }else if(input.createTextRange){ 
     var range = input.createTextRange(); 
     range.collapse(true); 
     range.moveEnd('character', selectionEnd); 
     range.moveStart('character', selectionStart); 
     range.select(); 
     } 
    }; 

setCaretToPos(8, 12); 

FirefoxとChromeでは動作しますが、Operaでは誤った選択をします。オフセットが2文字遅れる

何が問題なのですか?


テキストに改行文字が含まれていない場合は、選択が正しいため、新しい行: \nと関係があるようです。

+0

方法は、あなたがあなたの関数の入力パラメータが欠落していることです。これは引数リストにありますが、関数に渡すことはありません。これをチェックしてください:http://jsfiddle.net/7Tsx6/そしてdocument.getElementById部分を削除して、両方の場合を試してみてください。 –

+0

いいえ、私の質問では間違いでしたが、入力引数を追加するのを忘れてしまいました。問題は、textareaに新しい行がある場合に表示されます。 – Alex

+1

上記のコメントに基づいて、jQueryオブジェクトまたは実際の要素を渡していますか? – Seth

答えて

6

改行は、OperaとIEのテキストエリアに2文字(CRLF、または\r\n)、他のブラウザには1文字(\n)です。あなたはそれを調整する必要があります。ここには、すべてのブラウザで改行を1文字として扱う機能があります。

ライブデモ:http://jsfiddle.net/DqtVK/1/

コード:私はそれを参照してください

function adjustOffset(el, offset) { 
    var val = el.value, newOffset = offset; 
    if (val.indexOf("\r\n") > -1) { 
     var matches = val.replace(/\r\n/g, "\n").slice(0, offset).match(/\n/g); 
     newOffset += matches ? matches.length : 0; 
    } 
    return newOffset; 
} 

var setCaretToPos = function(input, selectionStart, selectionEnd){ 
    input.focus(); 
    if(input.setSelectionRange){ 
    selectionStart = adjustOffset(input, selectionStart); 
    selectionEnd = adjustOffset(input, selectionEnd); 
    input.setSelectionRange(selectionStart, selectionEnd); 

    }else if(input.createTextRange){ 
    var range = input.createTextRange(); 
    range.collapse(true); 
    range.moveEnd('character', selectionEnd); 
    range.moveStart('character', selectionStart); 
    range.select(); 
    } 
}; 
+0

ありがとう、完璧に動作します:D – Alex

関連する問題