2010-05-20 27 views
35

Stara wersja pytania znajduje się poniżej, po dalszych badaniach postanowiłem zmienić zdanie. Problem, jak wcześniej, muszę skupić contenteditable div bez podkreślania tekstu, dzięki czemu fokus podkreśla tekst w Chrome.jquery Ustawianie pozycji kursora w contenteditable div

Zdaję sobie sprawę, że ludzie rozwiązali ten problem w tekstach, resetując pozycję karetki w obszarze tekstowym. Jak mogę to zrobić za pomocą elementu contenteditable? Wszystkie wtyczki, które wypróbowałem, działają tylko z tekstami. Dzięki.

Old frazowania z pytaniem:

Mam contenteditable element, który chcę się skupić, ale tylko w zakresie aby umieścić kursor na przodzie pierwiastka, a wybierając wszystko.

elem.trigger('focus'); z jquery zaznacza cały tekst w całym elemencie w chrome. Firefox zachowuje się prawidłowo , ustawiając karetkę na przedniej stronie tekstu. Jak mogę uzyskać Chrome, aby zachowywało się tak, jak chcę, lub czy nie jest to, na co mogę się skupić dla .

Dzięki wszystkim.

+0

Ten [poprzednie pytanie] (http://stackoverflow.com/questions/499126/ jquery-set-cursor-position-in-text-area) może pomóc w pozycjonowaniu kursora. –

+0

Czy jesteś pewien, że działa się na contenteditable. Nie byłem w stanie ich zmusić do pracy. – Mark

+0

@ Mark: zaktualizowałem kod do najnowszego jquery i zmodyfikowałem wersję demonstracyjną, aby pracować z bogatą zawartością. –

Odpowiedz

19

demo: http://so.devilmaycode.it/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> 
+1

To interesujący pomysł, naprawdę świetny pomysł. Dziękuję Ci. Ale contenteditable to edytor WYSIWYG, więc nie mogę po prostu zastąpić pola tekstowego. – Mark

+0

zobacz aktualizacje! ;-) –

+1

To nie działa z textarea :-( –

2

Tak to się dzieje, ponieważ użyłeś

elem.trigger('focus'); 

spróbuj użyć klasy lub zidentyfikować element, na którym chcesz strzelać zdarzenia wyzwalającego.

+0

elem jest zmienną. – Mark

+2

użyłeś tego jako input.trigger ("focus"); ??? – Chirag

29

Może błędnie odczytuję pytanie, ale czy nie zrobiłbym tego (zakładając, że można edytować <div> z identyfikatorem "edytowalny")? Czasomierz jest tam, ponieważ w Chrome, zachowanie przeglądarka rodzimy że wybiera cały element, wydaje się wyzwolić po zdarzeniu focus, co nadrzędne efekt kodu wyboru chyba przełożone po zdarzeniu ostrości:

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(); 
+1

Awe !, to jest piękna rzecz! Dziękuję Tim. –

+1

Mój Boże, Tim, jak to zrobiłeś, dziękuję – pilau

+0

to jest świetne, ale jak ustawić koncentrację na końcu div zamiast na froncie? Http://jsfiddle.net/bq6 jQ/1/http://stackoverflow.com/questions/22599694/how-can-i-type-inside-the-parent-contenteditable-div – Squirrl

1

udało mi aby rozwiązać ten problem po trochę szturchania DOM.

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

To działa chyba tylko na przeglądarkach WebKit, ale ponieważ jest to jedyne źródło problemu, dodałem warunkową (jQuery)

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

nadzieję, że to rozwiąże problem.

+0

hmm, nie wiem dlaczego, to nie działa dla mnie. Jednak odpowiedź Tima Downa. – Mark

+0

Mam to do pracy w Chrome, ale nie Firefox. – Skitterm

0

Ustaw kursor w pozycji wstępnej lub div tagu:

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>

Źródło: https://social.msdn.microsoft.com/Forums/en-US/f91341cb-48b3-424b-9504-f2f569f4860f/getset-caretcursor-position-in-a-contenteditable-div?forum=winappswithhtml5

Powiązane problemy