Oto, co próbuję osiągnąć: Gdy użytkownik korzysta z myszy, klawiatury lub przycisku dotykowego, aby wybrać tekst w "myDiv", chcę zdobyć trzy dyskretne fragmenty kodu HTML: kod HTML przed wyborem (do "lewego" z tego), HTML w selekcji i HTML po selekcji ("w prawo"). HTML powinien wyglądać tak, jak w przypadku myDiv.innerHTML.Jak uzyskać kod HTML przed, wewnątrz i po selekcji (nie w textarea)?
Wybór może rozpocząć się lub zakończyć w parze znaczników (tzn. Zaznaczony wybór niekoniecznie musi być prawidłowy HTML). Nie muszę zajmować się specjalnymi scenariuszami, takimi jak elementy pozycjonowane bezwzględnie w ramach selekcji; wszystkie wybrane opcje będą ograniczone do jednego elementu div zawierającego podstawowe tagi, takie jak strong, em, ul, ol, h1, image i table.
Najbliższy, do którego przyszedłem, używa rangy do zaczepienia zaznaczenia i wywołania selection.getRangeAt(0).cloneContents()
, aby uzyskać zaznaczony kod HTML. Działa to wystarczająco dobrze, dopóki nie dokonam selekcji, która jest nieważna w izolacji, a przeglądarka zmienia kod HTML fragmentu dokumentu, aby uczynić go prawidłowym znacznikiem.
Dodatkowe informacje: Oto dlaczego muszę to:
Tworzę system sprzężenia zwrotnego dokumentu, więc trzeba zapisać informacje wyboru do bazy danych w celu późniejszego odtwarzania i odtworzeniu. Normalnie zapisałbym zaznaczenie przy użyciu ścieżki DOM i zaznaczonego tekstu, ale tekst może się zmieniać między zapisaniem a odtworzeniem. Na przykład autor może przesuwać całe akapity, usuwać sekcje itd. Ścieżka DOM staje się wówczas bezużyteczna.
Tak więc moim (niedoskonałym) planem jest przechowywanie zaznaczenia jako [offset, długość, html_snippet]. To jest "pozycja". Będę również przechowywać fragmenty html, które pojawiły się bezpośrednio przed i po zaznaczonym tekście. To jest "kontekst".
Korzystając z kombinacji tych danych, powinienem być w stanie przenieść pierwotnie wybrany tekst przez większość czasu, nawet jeśli został przesunięty lub częściowo zmieniony. Gdy to się nie uda, interfejs użytkownika będzie w stanie go rozwiązać, ale chciałbym, aby wystąpił tak rzadko, jak to możliwe.
Superpuchowie!
To jest dużo tekstu. –
Tak, starałem się dostarczyć jak najwięcej informacji, a zamiast tego byłem nieprzyzwoicie gburowaty. Właśnie teraz trochę go pomiażłam. :) –
Żeby było jasne: czy potrzebne fragmenty kodu HTML muszą być dokładnie takie, jakie pojawiają się w źródle HTML wysyłanym do przeglądarki? –