9

さまざまな要素からすべてのブラウザ内でキャレットの位置や選択を取得するための総合的なソリューションはありますか?mGetCaretPosition(iControl)witchがその要素内のcaret位置を返すように実行できるソリューションwitchを探しています。

私はたくさんの機能を試しました:

  • selection (window/document) [document=IE, window=Opera]
  • getSelection (window/document) [document=Firefox, document=Chrome, document=Safari]
  • selectionStart (input/textarea) [All]
  • craeteRange (selection)
  • createTextRange (selection)


document.selection.createRange()。textのようなメソッドを呼び出しても、選択範囲がないため、キャレット位置は返されません。tRange.moveStart('character'、-X)を設定する場合、Xは既知の値ではありません。これをdiv内で使用し、caretが中央にある場合、divの前にコードが必要です。

4

1 に答える 1

3

私は今日これを作りました。それはあなたの応答アレックスとグーグル内の他のすべての結果の組み合わせです。私は、PCのブラウザIE9、Chrome、Opera、Safari、Firefoxの内部でテストしました。また、デフォルトのブラウザであるFirefox、Chrome、Operaを搭載したAndroidのHTCSensationでもテストしました。

モバイルデバイス上のOperaだけがいくつかの問題を抱えていました。

私の解決策:

// Control
var BSControl = function(iControl)
{
    // Variable
    var tControl = (typeof iControl == 'string' ? document.getElementById(iControl) : iControl);

    // Get Caret
    this.mGetCaret = function()
    {
        // Resultaat aanmaken
        var tResult = -1;

        // SelectionStart
        // *) Input & Textarea
        if(tResult == -1 && (tControl.selectionStart || tControl.selectionStart == '0'))
        {
            tResult = tControl.selectionStart;
        }

        // ContentWindow.GetSelection
        // *) IFrame
        if(tResult == -1 && (tControl.contentWindow && tControl.contentWindow.getSelection))
        {
            var tRange= tControl.contentWindow.getSelection().getRangeAt(0); 
            tResult = tRange.startOffset;
        }

        // GetSelection
        // *) Div
        if(tResult == -1 && (window.getSelection))
        {
            var tRange= window.getSelection().getRangeAt(0); 
            tResult = tRange.startOffset;
        }

        // Resultaat teruggeven
        return tResult;
    }

    // Set Caret
    this.mSetCaret = function(iPosition)
    {
        // SelectionStart
        // *) Input & Textarea
        if(tControl.selectionStart || tControl.selectionStart == '0')
        {
            tControl.selectionStart = iPosition;
            tControl.selectionEnd = iPosition;
            return;
        }

        // ContentWindow.GetSelection
        // *) IFrame
        if(tControl.contentWindow && tControl.contentWindow.getSelection)
        {
            var tRange = tControl.contentDocument.createRange();
            tRange.setStart(tControl.contentDocument.body.firstChild, iPosition);
            tRange.setEnd(tControl.contentDocument.body.firstChild, iPosition);

            var tSelection = tControl.contentWindow.getSelection();
            tSelection.removeAllRanges();
            tSelection.addRange(tRange);

            return;
        }

        // GetSelection
        // *) Div
        if(window.getSelection)
        {
            var tSelection = window.getSelection();
            var tRange= tSelection.getRangeAt(0); 

            tRange.setStart(tControl.firstChild, iPosition);
            tRange.setEnd(tControl.firstChild, iPosition);

            tSelection.removeAllRanges();
            tSelection.addRange(tRange);

            return;
        }
    }

    // Get Selection
    this.mGetSelection = function()
    {
        // Resultaat aanmaken
        var tResult = null;

        // SelectionStart
        // *) Input & Textarea
        if(tResult == null && (tControl.selectionStart || tControl.selectionStart == '0'))
        {
            tResult = this.mGet().substring(tControl.selectionStart, tControl.selectionEnd);
        }

        // ContentWindow.GetSelection
        // *) IFrame
        if(tResult == null && (tControl.contentWindow && tControl.contentWindow.getSelection))
        {
            var tSelection = tControl.contentWindow.getSelection() 
            tResult = tSelection.toString();
        }

        // GetSelection
        // *) Div
        if(tResult == null && (window.getSelection))
        {
            var tSelection = window.getSelection() 
            tResult = tSelection.toString();
        }

        // Resultaat teruggeven
        return tResult;
    }

    // Set Selection
    this.mSetSelection = function(iFrom, iUntil)
    {
        // SelectionStart
        // *) Input & Textarea
        if(tControl.selectionStart || tControl.selectionStart == '0')
        {
            tControl.selectionStart = iFrom;
            tControl.selectionEnd = iUntil;
            return;
        }

        // ContentWindow.GetSelection
        // *) IFrame
        if(tControl.contentWindow && tControl.contentWindow.getSelection)
        {
            var tRange = tControl.contentDocument.createRange();
            tRange.setStart(tControl.contentDocument.body.firstChild, iFrom);
            tRange.setEnd(tControl.contentDocument.body.firstChild, iUntil);

            var tSelection = tControl.contentWindow.getSelection();
            tSelection.removeAllRanges();
            tSelection.addRange(tRange);

            return;
        }

        // GetSelection
        // *) Div
        if(window.getSelection)
        {
            var tSelection = window.getSelection();
            var tRange= tSelection.getRangeAt(0); 

            tRange.setStart(tControl.firstChild, iFrom);
            tRange.setEnd(tControl.firstChild, iUntil);

            tSelection.removeAllRanges();
            tSelection.addRange(tRange);

            return;
        }
    }

    // Set
    this.mSet = function(iValue)
    {
        // Afhankelijk van aanwezige property waarde instellen
        if('value' in tControl)
        {
            tControl.value = iValue;
        }else if('innerText' in tControl)
        {
            tControl.innerText = iValue;
        }else if('textContent' in tControl)
        {
            tControl.textContent = iValue;
        }else if('innerHTML' in tControl)
        {
            tControl.innerHTML = iValue;
        }
    }

    // Get
    this.mGet = function()
    {
        // Resultaat aanmaken
        var tResult = null;

        // Afhankelijk van aanwezige property waarde instellen
        if('value' in tControl)
        {
            tResult = tControl.value;
        }else if('innerText' in tControl)
        {
            tResult = tControl.innerText;
        }else if('textContent' in tControl)
        {
            tResult = tControl.textContent;
        }else if('innerHTML' in tControl)
        {
            tResult = tControl.innerHTML;
        }

        // Resultaat teruggeven
        return tResult;
    }
}
于 2012-10-23T10:28:50.777 に答える