Szukam ostatecznego rozwiązania w różnych przeglądarkach, aby ustawić pozycję kursora / karetki na ostatnią znaną pozycję, gdy contentEditable = 'on' <div> odzyska fokus. Wygląda na to, że domyślną funkcją edytowalnego elementu div jest przesuwanie kursora / kursora na początek tekstu w elemencie div za każdym kliknięciem, co jest niepożądane.
Uważam, że musiałbym zapisać w zmiennej bieżącą pozycję kursora, gdy opuszczają fokus elementu div, a następnie ustawić go ponownie, gdy mają ponownie fokus w środku, ale nie byłem w stanie złożyć razem ani znaleźć działającego przykładowy kod jeszcze.
Jeśli ktoś ma jakieś przemyślenia, działające fragmenty kodu lub próbki, z przyjemnością je zobaczę.
Nie mam jeszcze żadnego kodu, ale oto co mam:
<script type="text/javascript">
// jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
PS. Wypróbowałem ten zasób, ale wygląda na to, że nie działa dla <div>. Być może tylko dla obszaru tekstowego ( Jak przenieść kursor na koniec treści edytowalnej )
contentEditable
pracował w przeglądarkach innych niż IE-O_oOdpowiedzi:
Jest to zgodne z przeglądarkami opartymi na standardach, ale prawdopodobnie zawiedzie w IE. Podaję to jako punkt wyjścia. IE nie obsługuje zakresu DOM.
źródło
cursorStart.appendChild(document.createTextNode('\u0002'));
uważamy za rozsądny zamiennik. dla - char. Dzięki za kodTo rozwiązanie działa we wszystkich głównych przeglądarkach:
saveSelection()
jest dołączony do zdarzeńonmouseup
ionkeyup
elementu div i zapisuje wybór w zmiennejsavedRange
.restoreSelection()
jest dołączony doonfocus
zdarzenia div i ponownie wybiera zaznaczenie zapisane wsavedRange
.Działa to doskonale, chyba że chcesz, aby zaznaczenie zostało przywrócone, gdy użytkownik kliknie również element div (co jest trochę nieintuicyjne, ponieważ zwykle oczekujesz, że kursor znajdzie się w miejscu kliknięcia, ale kod zawiera kompletność)
Aby to osiągnąć, zdarzenia
onclick
ionmousedown
są anulowane przez funkcję,cancelEvent()
która jest funkcją cross browser do anulowania zdarzenia.cancelEvent()
Funkcja działa równieżrestoreSelection()
funkcję ponieważ jako zdarzenie click jest anulowane div nie odbiera ostrość i dlatego nic nie jest zaznaczone w ogóle, chyba że jest to uruchomić funkcje.Zmienna
isInFocus
przechowuje, czy jest fokus, i jest zmieniana na „false”onblur
i „true”onfocus
. Dzięki temu zdarzenia kliknięcia mogą być anulowane tylko wtedy, gdy element div nie jest aktywny (w przeciwnym razie nie można by w ogóle zmienić zaznaczenia).Jeśli chcesz, aby zaznaczenie
onclick
uległo zmianie, gdy element div jest skupiony przez kliknięcie, i nie chcesz go przywracać (i tylko wtedy, gdy fokus zostanie nadany elementowi programowo za pomocądocument.getElementById("area").focus();
lub podobnie, po prostu usuń zdarzeniaonclick
ionmousedown
.onblur
ZdarzenieonDivBlur()
icancelEvent()
funkcje i w takich okolicznościach można również bezpiecznie usunąć.Ten kod powinien działać, jeśli zostanie umieszczony bezpośrednio w treści strony html, jeśli chcesz go szybko przetestować:
źródło
if (window.getSelection)...
sprawdzisz nie tylko, czy przeglądarka obsługujegetSelection
, a nie, czy istnieje wybór?getSelection
interfejsu API, czy starszegodocument.selection
interfejsu API używanego przez starsze wersje IE. PóźniejszegetRangeAt (0)
wywołanie powróci,null
jeśli nie ma wyboru, co jest sprawdzane w funkcji przywracania.else if (document.createRange)
) jest tym, na co patrzę. Zostanie wywołany tylko wtedy,window.getSelection
gdy nie istnieje, ale używawindow.getSelection
window.getSelection
ale niedocument.createRange
- co oznacza, że drugi blok nigdy nie zostałby użyty ...Aktualizacja
Napisałem zakres i bibliotekę wyboru dla różnych przeglądarek o nazwie Rangy, która zawiera ulepszoną wersję kodu, który zamieściłem poniżej. Możesz użyć modułu zapisywania i przywracania wyboru dla tego konkretnego pytania, chociaż kusiłbym, aby użyć czegoś takiego jak odpowiedź @Nico Burns, jeśli nie robisz nic innego z zaznaczeniami w swoim projekcie i nie potrzebujesz większości biblioteka.
Poprzednia odpowiedź
Możesz użyć IERange ( http://code.google.com/p/ierange/ ), aby przekonwertować TextRange IE na coś takiego jak zakres DOM i użyć go w połączeniu z czymś w rodzaju punktu wyjścia bez powieki. Osobiście użyłbym tylko algorytmów z IERange, które dokonują konwersji Range <-> TextRange, zamiast używać całości. Obiekt selekcji IE nie ma właściwości focusNode i anchorNode, ale zamiast tego powinieneś być w stanie po prostu użyć Range / TextRange uzyskanego z zaznaczenia.Mogę coś zrobić, aby to zrobić, wrócę tutaj, jeśli i kiedy to zrobię.
EDYTOWAĆ:
Stworzyłem demo skryptu, który to robi. Działa we wszystkim, czego do tej pory próbowałem, z wyjątkiem błędu w Operze 9, którego nie miałem jeszcze czasu sprawdzić. Przeglądarki, w których działa, to IE 5.5, 6 i 7, Chrome 2, Firefox 2, 3 i 3.5 oraz Safari 4, wszystkie w systemie Windows.
http://www.timdown.co.uk/code/selections/
Zwróć uwagę, że w przeglądarkach zaznaczeń można dokonywać wstecz, tak aby węzeł fokusu znajdował się na początku zaznaczenia, a naciśnięcie prawego lub lewego klawisza kursora spowoduje przesunięcie kursora do pozycji względem początku zaznaczenia. Nie sądzę, aby można to powtórzyć podczas przywracania zaznaczenia, więc węzeł fokusu znajduje się zawsze na końcu zaznaczenia.
Wkrótce opiszę to w pełni.źródło
Miałem podobną sytuację, w której specjalnie potrzebowałem ustawić pozycję kursora na KONIEC elementu div, który można edytować. Nie chciałem używać pełnoprawnej biblioteki, takiej jak Rangy, a wiele rozwiązań było zdecydowanie zbyt ciężkich.
W końcu wymyśliłem tę prostą funkcję jQuery, aby ustawić pozycję w karatach na koniec edytowalnego elementu div:
Teoria jest prosta: dodaj rozpiętość do końca edytowalnego elementu, zaznacz ją, a następnie usuń rozpiętość - pozostawiając nam kursor na końcu elementu div. Możesz dostosować to rozwiązanie, aby wstawić rozpiętość w dowolnym miejscu, umieszczając w ten sposób kursor w określonym miejscu.
Użycie jest proste:
Otóż to!
źródło
<span>
, co przypadkowo złamie wbudowany stos cofania przeglądarki. Zobacz stackoverflow.com/a/4238971/96100Wziąłem odpowiedź Nico Burnsa i zrobiłem to za pomocą jQuery:
div contentEditable="true"
Będziesz potrzebować jQuery 1.6 lub nowszego:
Pokaż fragment kodu
źródło
Po zabawie zmodyfikowałem powyższą odpowiedź bez powiek i uczyniłem ją wtyczką jQuery, więc możesz zrobić jedną z tych rzeczy:
Przepraszam za długi kod, ale może komuś pomóc:
źródło
Możesz wykorzystać selectNodeContents, który jest obsługiwany przez nowoczesne przeglądarki.
źródło
W przeglądarce Firefox możesz mieć tekst elementu div w węźle potomnym (
o_div.childNodes[0]
)źródło