Napisałem kod, aby wykryć koniec selekcji przy użyciu javascript, i umieścić znacznik na pozycji końcowej. Zobacz ten jsfiddle: http://jsfiddle.net/vCwwN/Wykryj pozycję końcową wyboru przy użyciu javascript
Powyższy kod wykonaj następujące czynności:
- obsługuje wszystkie skrypty LTR (na przykład w języku angielskim) prawidłowo (widocznych znacznik na końcu poprawnie).
- Dla skryptów LTR (np. Angielski) Obsługuje to, czy wybór jest do przodu (od lewej/z góry do prawej/z dołu), czy do tyłu (od prawej/od dołu do lewej/od góry) właściwie pokazując znacznik, w którym zaznaczenie zostało zatrzymane (za pomocą myszy lub klawiatura).
- Używa
getClientRects
do znalezienia wszystkich granic prostokąta zaznaczenia i do włamania, aby wykryć kierunek wyboru (jeśli jest w porządku lub nie). W zależności od tych dwóch informacji umieszcza znacznik na końcu.
Możesz spróbować wybrać to, co opisano powyżej dla skryptu języka angielskiego bez problemu. Jedynym problemem jest próba obsługi skryptów RTL (np. Arabski), a następnie wyświetlanie znacznika na początku wybranego skryptu RTL, a nie na końcu (gdzie faktycznie zatrzymano mysz/klawiaturę). Te problemy powodują:
- Wybieranie początkowe w skrypcie RTL (arabskim) i kończenie wyboru wewnątrz skryptu RTL (arabski). To pokazuje znacznik na początku zaznaczenia.
- Wybór początkowy w skrypcie LTR (angielski) i kończący wybór w skrypcie RTL (arabskim). To pokazuje znacznik na początku wyboru skryptu RTL (a nie na końcu).
Zasadniczo wybór rozpoczynający się w dowolnym miejscu (LTR lub RTL) i kończący się w skrypcie RTL jest niepoprawny. Wszelkie inne przypadki są poprawnie obsługiwane (np. Zaczynają się od LTR lub RTL, a kończą na LTR, a nawet mijają po drodze skrypty RTL).
Problem polega na tym, że kierunek przepływu jest odwracany dla skryptów RTL, a zatem do tyłu jest do przodu, a do przodu jest do tyłu. Dlatego mój kod nie może poprawnie obsłużyć RTL, a wsteczny hack jest odwrócony.
Jedno z rozwiązań, o których myślałem, to wykrycie ostatniego znaku zaznaczenia i sprawdzenie, czy ma on skrypt RTL, czy nie, a następnie na podstawie tego odwrócić flagę wsteczną. Już umieściłem funkcję, aby wykryć, czy tekst kończy się znakiem RTL (jest on w tym samym jsfiddle nieużywanym). To może ci pomóc, pomóż mi go rozwiązać :)
Element wejściowy nie zachowuje się jak wejście RTL dla mnie. Brak 'dir = rtl'? – Halcyon
Nie, powinien pozostać bez zmian (tzn. LTR, ustawienie domyślne). Jeśli ustawisz dir = rtl, to wszystko zostanie odwrócone dla obu skryptów (RTL/LTR).Obsługiwałem (dir = rtl) w moim własnym kodzie, ale postanowiłem usunąć ten dodatkowy przypadek, aby uprościć kod i zwiększyć szansę na odpowiedź. – tria