JavaScript TinyMCE/jQuery-race condition bei firefox

Ich habe eine website mit einem Formular, das verwendet TinyMCE; unabhängig davon, nutze ich jQuery. Wenn ich laden Sie das Formular vom staging-server auf den Firefox 3 (MacOS X, Linux), TinyMCE nicht geladen wird. Es ist ein Fehler in der Firefox-Konsole, die sagen, dass t.getBody() zurückgegeben null. t.getBody(), soweit ich das verstanden habe von der TinyMCE-Doku ist eine Funktion, die zurückgibt, Dokument s body-element geprüft werden für einige Funktionen. Problem tritt nicht auf, wenn ich mit Safari, noch, wenn ich Firefox verwenden mit dem gleichen Ort ausgeführt wird, von localhost.

Ursprünglichen, fehlerhaften JavaScript-code sah so aus:

<script type="text/javascript" src="http://static.alfa.foo.pl/json2.js"></script>
<script type="text/javascript" src="http://static.alfa.foo.pl/jquery.js"></script>
<script type="text/javascript" src="http://static.alfa.foo.pl/jquery.ui.js"></script>
<script type="text/javascript" src="http://static.alfa.foo.pl/tiny_mce/tiny_mce.js"></script>
<script type="text/javascript">
  tinyMCE.init({ mode:"specific_textareas", editor_selector:"mce", theme:"simple", language:"pl" });
</script>
<script type="text/javascript" src="http://static.alfa.foo.pl/jquery.jeditable.js"></script>
<script type="text/javascript" src="http://static.alfa.foo.pl/jquery.tinymce.js"></script>
<script type="text/javascript" charset="utf-8" src="http://static.alfa.foo.pl/foo.js"></script>
<script type="text/javascript">
  $(document).ready(function(){
    /* jQuery initialization */ });
</script>

Ich versucht, die änderung Skript laden um, bewegte tinyMCE.init() call to the <script/> tag mit $(document).ready() nennen—vor, nach und innerhalb dieser Aufruf. Kein Ergebnis. Wenn tinyMCE.init() was called from within $(document).ready() handler, der browser hat hängen auf Anfrage—sieht aus wie es war zu spät, um die Funktion init aufrufen.

Then, after googling a bit about using TinyMCE together with jQuery, I changed tinyMCE.init() Aufruf:

tinyMCE.init({ mode:"none", theme:"simple", language:"pl" });

Hinzugefügt und folgenden jQuery-Aufruf, um die $(document).ready() handler:

$(".mce").each( function(i) { tinyMCE.execCommand("mceAddControl",true,this.id); });

Still the same error. But, and here's where things start to look like real voodoo, when I added alert(i); vor dem tinyMCE.execCommand() aufrufen, Warnungen gegeben wurden, und TinyMCE Texteingabefelder wurden korrekt initialisiert. Ich dachte, dies kann sein eine Angelegenheit der Verzögerung durch das warten der user entlassen die Warnung, so stellte ich eine zweite Verzögerung durch ändern der Anruf, dass Sie noch innerhalb der $(document).ready () - handler, der folgenden:

setTimeout('$(".mce").each( function(i) { tinyMCE.execCommand("mceAddControl",stimmt dies.id); });',1000); 

Mit dem timeout, TinyMCE Texteingabefelder richtig initialisiert, aber es ist duct Bandage um das eigentliche problem. Das problem sieht wie ein deutlicher race condition (vor allem wenn ich bedenke, dass auf den gleichen browser, aber, wenn der server auf localhost, problem nicht auftreten). Aber nicht die Ausführung von JavaScript single-threaded? Könnte jemand bitte mich aufklären, was ist denn hier Los, wo ist das eigentliche problem, und was kann ich tun, um es tatsächlich behoben?

Schreibe einen Kommentar