2012-06-05 18 views
6

Mam absolutnie najdziwniejszy błąd, jaki kiedykolwiek spotkałem, a na tym kończę dowcip. Każdy, kto ma pomysły na debugowanie tego (lub jakikolwiek sprytny sposób obejścia tego problemu) będzie niesamowity.Kursor Firefox jest niewidoczny, staje się widoczny po kliknięciu czegokolwiek innego.

Problem:

Robię prosty edytor WYSIWYG w Firefoksie za pomocą contenteditable. Problem pojawia się, gdy ładuję tekst do edycji przez ajax. Przed załadowaniem kursor wydaje się być w porządku (przez ułamek sekundy), a po załadowaniu tekstu znika. Nadal można wprowadzać tekst, a kursor jest zdecydowanie "tam" (okno statusu pokazuje bieżącą linię/col, ale nie jest widoczna, a nakładka wyboru nie pojawia się.

Oto, co czyni to naprawdę dziwnym: kliknięcie GDZIEKOLWIEK, na dowolnym elemencie domowym, na firebugie, nawet w innym oknie - powoduje powrót kursora i zachowanie się jak zwykle. W rzeczywistości jedyną sytuacją, w której kursor ma jakiekolwiek problemy, jest na samym początku, podczas początkowego ładowania strony lub odświeżania. Kliknięcie w dowolnym miejscu wewnątrz elementu contentedtiable div go nie naprawia - musisz kliknąć na zewnątrz, aby odświeżyć.

W tej chwili potrzebuję obejścia. Wypróbowałem 500 smaków $ (someelement) .click lub $ (somelement) .focus, ale nie w pełni replikują "rzeczywiste" kliknięcia od użytkownika.

Czy ktoś widział coś takiego wcześniej? Dzięki.

+0

Firefox miał i niewątpliwie nadal ma ogromne problemy z znikającym kursem w różnych okolicznościach. Najlepszym, na co możesz liczyć, to próba i błąd, aby znaleźć obejście tego konkretnego przypadku. –

Odpowiedz

6

Nie udało mi się ustalić, co jest przyczyną problemu, ale znalazłem szybką i brudną poprawkę. Dodaję znacznik zakotwiczenia do DOM, koncentruję go (używając jQuery .focus), a następnie usuwam.

Próbowałem .focus wiele razy wcześniej, ale zawsze próbowałem go na div lub li elementów, które nie dało rady. Musi to być znacznik zakotwiczenia. Podejrzewam, że tak jest, ponieważ znacznik zakotwiczenia ma faktycznie jakiś widoczny komponent, który resetuje coś w wewnętrznym mechanizmie wyświetlania kursora firefox.

Tak czy inaczej, jeśli próbujesz rozwiązać takie problemy, a to nie rozwiązuje problemu, spójrz na wyjaśnienie MorganTiley - które może dać ci dobre wskazówki.

+0

Fantastyczne. Od wieków szukam rozwiązania tego problemu. To działa dla mnie. Inne pytania i odpowiedzi próbują wybrać zakres tekstu, ale to nie zadziałało. Dzięki. – mkaj

2

Dzieje się tak, ponieważ po załadowaniu treści zmienia się struktura węzłów HTML i tym samym unieważnia zaznaczenie (kursor jest tylko zwiniętym zaznaczeniem). Zalecam spróbować zresetować go poprzez Rangy. Działa dobrze w połączeniu z jquery. Użyj jquery, aby uzyskać pierwszy element w obszarze contentEditable, np. pierwszy akapit, a następnie wprowadź nowy zakres i wybierz ten akapit (węzeł) i zwinąć, aby rozpocząć. Spowoduje to umieszczenie kursora na samym początku treści. Oto trochę przybliżony kod:

$(document).ready(function() { 
    //init rangy 
}); 

function ajaxLoaded { 
    var p = $(".contenteditablediv p:first")[0]; 
    var sel = rangy.getSelection(); 
    sel.collapse(p, 0); 
} 
+0

Niestety, Rangy nie rozwiązał mojego problemu, chociaż twoje wyjaśnienie dostarczyło cennego wglądu w selekcje. Dzięki. –

+0

co się stało? czy możesz podać więcej kontekstu? na przykład wszelkie inne skrypty uruchomione na stronie lub sposób konfiguracji html? Rangy powinien zdecydowanie umieć przesunąć kursor w dowolne miejsce. – MorganTiley

+0

Istnieje wiele innych skryptów uruchomionych na stronie, ale upewniłem się, że cały mój kod wyboru/zmiany (rangy kod, który wysłałeś) pojawia się po zakończeniu wszystkich pozostałych skryptów. Szczerze mówiąc, mój problem prawdopodobnie leży gdzieś głęboko w zewnętrznym javascript, który ładuję. Będę musiał jeszcze trochę kopać. Tak czy siak, mam wrażenie, że Firefox powinien być na tyle sprytny, aby móc zresetować mój kursor, więc być może jest to błąd, który powinienem zalogować. Doceniam jednak twój wkład. –