36

質問の古いバージョンは以下のとおりです。さらに調査した後、質問を言い換えることにしました。以前と同じように、テキストを強調表示せずにcontenteditable divにフォーカスする必要があります。フォーカスをまっすぐにすると、Chromeでテキストが強調表示されます。

テキストエリアのキャレット位置をリセットすることで、テキストエリアのこの問題が解決されたことを理解しています。contenteditable要素を使用してこれを行うにはどうすればよいですか?私が試したすべてのプラグインは、textareasでのみ機能します。ありがとう。

質問の古い言い回し:

フォーカスしたいコンテンツ編集可能な要素がありますが、すべてを選択するのではなく、要素の前にカーソルを置く場合に限ります。

elem.trigger('focus');jqueryを使用すると、要素全体のすべてのテキストがchromeで選択されます。Firefoxは正しく動作し、テキストの先頭にキャレットを設定します。Chromeを希望どおりに動作させるにはどうすればよいですか、または焦点が合っていない可能性があります。

皆さんありがとう。

4

5 に答える 5

30

たぶん私は質問を読み間違えていますが、次のことはしませんか(<div>IDが「編集可能」の編集可能であると仮定)?Chromeでは、要素全体を選択するネイティブブラウザの動作がfocusイベント後にトリガーされるように見えるため、タイマーがあります。これにより、フォーカスイベントが終了するまで延期されない限り、選択コードの効果が無効になります。

var div = document.getElementById("editable");

div.onfocus = function() {
    window.setTimeout(function() {
        var sel, range;
        if (window.getSelection && document.createRange) {
            range = document.createRange();
            range.selectNodeContents(div);
            range.collapse(true);
            sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (document.body.createTextRange) {
            range = document.body.createTextRange();
            range.moveToElementText(div);
            range.collapse(true);
            range.select();
        }
    }, 1);
};

div.focus();
于 2010-06-01T09:27:26.030 に答える
20

デモhttp ://so.lucafilosofi.com/jquery-setting-cursor-position-in-contenteditable-div/

      <div id="editable" contentEditable="true">
            <h2>Lorem</h2> <p>ipsum dolor <i>sit</i> 
               amet, consectetur <strong>adipiscing</strong> elit.</p> Aenean.
        </div>

    <script type="text/javascript">
        $(function () {
            $('[contentEditable="true"]').on('click', function (e) {
                if (!$(this).hasClass('editing')) {
                    var html = $(this).html();
                    if (html.length) {
                        var range = rangy.createRange();
                        $(this).toggleClass('editing').html('<span class="content-editable-wrapper">' + html + '</span>');
                        var $last = $(this).find('.content-editable-wrapper');
                        range.setStartAfter($last[0]);
                        range.collapse(false);
                        rangy.getSelection().setSingleRange(range);
                    }
                }
            }).on('blur', function () {
                $(this).toggleClass('editing').find('.content-editable-wrapper').children().last().unwrap();
            });
        });
    </script>
  • 注: rangy.jshttps://code.google.com/p/rangy/を利用してください
于 2010-05-27T10:08:35.583 に答える
3

はい、それはあなたが使用したために起こります

elem.trigger('focus'); 

クラスを使用するか、トリガーイベントを発生させる要素を特定してみてください。

于 2010-05-20T05:09:47.773 に答える
1

DOMを少し調べた後、なんとかその問題を解決できました。

elm.focus();
window.getSelection().setPosition(0);

おそらくWebKitブラウザーでのみ機能しますが、問題の唯一の原因であるため、条件付き(jQueryを使用)を追加しました

if(!$.browser.webkit) {
    elm.focus();
} else {
    elm.focus();
    window.getSelection().setPosition(0);
}

これで問題が解決することを願っています。

于 2010-06-09T17:26:22.700 に答える
0

preまたはdivタグにポインタ位置を設定します。

function setCursor(pos) {
    var el = document.getElementById("asd");
    var range = document.createRange();
    var sel = window.getSelection();
    range.setStart(el.childNodes[0], pos);
    range.collapse(true);
    sel.removeAllRanges();
    sel.addRange(range);
    el.focus();
}

$('button').click(function () {
    setCursor(5);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="asd" contenteditable="true" >
asd
two
</div>
<button>Set caret position</button>

ソース:https ://social.msdn.microsoft.com/Forums/en-US/f91341cb-48b3-424b-9504-f2f569f4860f/getset-caretcursor-position-in-a-contenteditable-div?forum = winappswithhtml5

于 2018-01-29T04:13:24.457 に答える