2013-03-07 17 views
5

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ć :)

+0

Element wejściowy nie zachowuje się jak wejście RTL dla mnie. Brak 'dir = rtl'? – Halcyon

+0

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

Odpowiedz

0

Sprawdź, czy jest to krok we właściwym kierunku.

Wykorzystuje następujący kod do Return HTML from a user selection zamieszczonych przez Tim Down:

function getSelectionHtml() { 
    var html = ""; 
    if (typeof window.getSelection != "undefined") { 
     var sel = window.getSelection(); 
     if (sel.rangeCount) { 
      var container = document.createElement("div"); 
      for (var i = 0, len = sel.rangeCount; i < len; ++i) { 
       container.appendChild(sel.getRangeAt(i).cloneContents()); 
      } 
      html = container.innerHTML; 
     } 
    } else if (typeof document.selection != "undefined") { 
     if (document.selection.type == "Text") { 
      html = document.selection.createRange().htmlText; 
     } 
    } 
    return html; 
} 

Raz, że jest zdefiniowana, można wywołać metodę lastCharTRL zdefiniowano by sprawdzić, czy był ostatni znak RTL i podjąć odpowiednie działania.

if (lastCharRTL(getSelectionHtml())) 
    $('#pointer').css({top: rects[n].top + 10, left: rects[n].left - 10}).show(); 
else if(backwards) 
    $('#pointer').css({top: rects[0].top + 10, left: rects[0].left - 10}).show(); 
else 
    $('#pointer').css({top: rects[n].top + 10, left: rects[n].right}).show(); 

DEMO

+0

Podczas gdy twoje rozwiązanie/demo mają pierwotny problem (końcowy wybór RTL wciąż jest odwrócony) prawdopodobnie z powodu innerHTML i if/else-if/else, myślę, że wpadł mi pomysł na uzyskanie tekstu wyboru. Wiem, że z 'getSelection' możesz wywołać' toString' i mieć tekst. Następnie sprawdź początek lub zakończenie (w zależności od kierunku wyboru), aby zobaczyć, czy jest znak RTL. Spróbuję to zrobić i zobaczę. Dziękuję Ci. – tria

Powiązane problemy