![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Mam problem z dynamicznym tworzeniem edytorów TinyMCE w Google Chrome. Wyświetlą się tylko przy pierwszym wyświetleniu strony, a potem już nie (nie ma błędów w konsoli!) albo na odwrót.
Edytory mogą ładować się na 2 sposoby: 1. Na żądanie - podczas ładowania strony (wywołane w <body>) 2. Na żądanie - po załadowaniu strony (np. po kliknięciu przycisku) Proces ładowania edytorów: 1. W sekcji <head> dołączam tradycyjnie plik ładujący loader.js 2. Plik loader.js wygląda tak:
3. Natomiast instancje obiektu Editor są tworzone w sekcji <body> za formularzem: Bawiłem się w Firebugu do Firefoksa. Jeżeli strona jest już załadowana, dynamiczne wczytanie głównej biblioteki i dodanie nowego edytora nie działa. Czyżby wina TinyMCE? Przykład:
Funkcja addEvent (chyba) działa prawidłowo, ale gdyby ktoś miał wątpliwości:
Jedynym wyjściem jest ładowanie głównej biblioteki podczas ładowania strony (przed zdarzeniem window.onload)? Jak załadować bibliotekę TinyMCE na żądanie, a następnie wyświetlić edytor tak, aby działał w każdej przeglądarce? Jak sprawdzić, czy wszystkie pliki TinyMCE są załadowane, czyli - czy można już odpalić edytor? Ten post edytował WebCM 11.12.2010, 16:55:04 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
To stary sposób wstawiania i usuwania edytorów. Nowe wersje TinyMCE mają do tego celu API. Szukałem w Google innych sposobów, ale nie ma nic ciekawego. Pobawiłem się w Firebugu i wynika, że...
Po załadowaniu głównej biblioteki tiny_mce.js wystarczy wywołać Występował inny problem opisany tu: http://tinymce.moxiecode.com/punbb/viewtopic.php?pid=83564 Jak widać, 4 dni temu pojawiła się solucja, którą za chwilę przetestuję. W skrócie: 1. Nie ładuj biblioteki tiny_mce.js wielokrotnie! 2. Używaj opcji strict_loading_mode Przestroga: tinyMCE jest skrótem do obiektu tinymce.EditorManager - to nie to samo co tinymce! Problem w Chrome powraca. Edytory TinyMCE wyświetlą się tylko po odświeżeniu strony. W przeciwnym przypadku widać, że plik tiny_mce.js ładuje się i nic. Zbadałem przyczynę. Okazuje się, że zdarzenie HTMLScriptElement.onload nie zawsze występuje! Funkcja include() wygląda tak: Dla pewności zbadałem, że WebKit NIE ma własności readyState. Podejrzewam, że nie da się zrobić nic więcej. Sami przetestujcie na własnych skryptach, czy to błąd, czy funkcja (bug or feature) (IMG:style_emoticons/default/tongue.gif) Na pewno programiści zgłaszali błąd zarówno do Google i do Apple i nic. AKTUALIZACJA Moje pierwsze spostrzeżenia były błędne. Zdarzenie HTMLScriptElement.onload wywołuje się zawsze. To ewidentnie wina TinyMCE, tylko dlaczego w innych przeglądarkach problem nie występuje? Mimo wszystko wierzę, że window.onload w Chrome wywołuje się za wcześnie i stąd metoda tinyMCE.init() nie działa. AKTUALIZACJA 2 Znalazłem przyczynę. Klasa tinymce.dom.EventUtils działa nieprawidłowo na silniku WebKit. Funkcja add: Kod if (n == 'init') t.inits.push(cb); to ostatnia ważna operacja. Potem nic się nie dzieje. Wywołanie:{ if (t.domLoaded) { console.log('DOM loaded - callback will be called'); cb(); } else { console.log('DOM not ready - put callback onto stack'); t.inits.push(cb); } return cb; } Kod Event.add(document, 'init', function() { Są tylko 2 miejsca, gdzie własność .domLoaded jest ustawiana na TRUE: _pageInit and _wait. Inny ważny kod: Kod else if (doc.addEventListener) { orazt._add(win, 'DOMContentLoaded', function() { t._pageInit(win); }); } Kod Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); Oba zdarzenia DOMContentLoaded i onload nie wykonują się, czyli musiały zostać wywołane wcześniej.// Dispatch DOM content loaded event for IE and Safari Event._wait(window); Jednak .domLoaded ma wartość TRUE - który fragment kodu go ustawia, jeżeli _pageInit() nie jest wywoływana? Szukam rozwiązania. Może ktoś już wpadł i nie będę musiał spędzić kolejnego dnia na to (IMG:style_emoticons/default/cool.gif) Ten post edytował WebCM 23.12.2010, 12:50:51 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 06:21 |