Natomiast wywołanie edytora w sekcji <body> albo na żądanie:
function Editor(O) { //odnośnik do instancji Editor var that = this; //Jeżeli plik jest niezaładowany, załaduj go if(!Editor.loaded) { include('plugins/editor/tiny_mce.js'); Editor.loaded = true; } //Funkcja inicjująca edytor var init = function() { if(!O.id) O.id = O.name; that.o = tinymce.add(new tinymce.Editor(O.id, { /* TinyMCE Settings */ })); that.o.render(); }; //Jeżeli cały dokument jest załadowany, od razu ładuj edytor if(Editor.DOM) init(); //W przeciwnym razie umieść ładowanie edytora jako zdarzenie else addEvent('load', function() { init(); Editor.DOM = true }) } Editor.loaded = Editor.DOM = false;
var e = new Editor(form.element);
W Firefoksie wszystko działa. Niestety, w IE występuje błąd Brak definicji 'tinymce'. Widocznie biblioteka nie zdążyła się załadować przed wywołaniem onload. Jak wyjść z tej sytuacji?
Kiedyś robiłem tak (fragment kodu, drugi argument wywoływany po załadowaniu pliku):
Wtedy pojawił się inny problem - nie zdążyły załadować się inne pliki (np. plik skórki) i edytor nie wyświetlał się we wszystkich przeglądarkach. Byłem zmuszony poczekać, aż załaduje się cały dokument.
include('plugins/editor/tiny_mce.js', function() { that.o = tinymce.add(new tinymce.Editor(O.id, { /* TinyMCE Settings */ })); that.o.render(); });
Można inaczej - ładować bibliotekę w sekcji <head>. Obawiam się jednak, że znów jakiś plik nie załaduje się, bo reszta jest ładowana dynamicznie. Wada: dłuższe ładowanie strony.
Jak sprawdzić, czy wszystkie skrypty są załadowane? Jest jakieś zdarzenie w IE, które to sprawdza?