TinyMCE を使用するフォームを含む Web サイトがあります。独立して、私はjQueryを使用しています。Firefox 3 (MacOS X、Linux) でステージング サーバーからフォームをロードすると、TinyMCE のロードが完了しません。がt.getBody()
返されたというエラーが Firefox コンソールに表示されますnull
。 t.getBody()
TinyMCE docs から理解できる限り、ドキュメントの body 要素を返し、いくつかの機能について検査する関数です。Safari を使用している場合や、localhost から実行されている同じサイトで Firefox を使用している場合は、問題は発生しません。
元の失敗した JavaScript 関連のコードは次のようになります。
<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>
スクリプトの読み込み順、移動を変えてみたtinyMCE.init()
call to the
<script/>
tag containing $(document).ready()
call—before, after, and inside this call. No result. When tinyMCE.init()
was called from within
$(document).ready()
handler, the browser did hang on request—looks like it was too late to call the init function.
Then, after googling a bit about using TinyMCE together with jQuery, I changed tinyMCE.init()
call to:
tinyMCE.init({ mode:"none", theme:"simple", language:"pl" });
and added following jQuery call to the $(document).ready()
handler:
$(".mce").each( function(i) { tinyMCE.execCommand("mceAddControl",true,this.id); });
呼び出し、アラートが発生し、TinyMCE テキストエリアが正しく初期化されました。これは、ユーザーがアラートを閉じるのを待つことによって生じる遅延の問題である可能性があると考えたので、呼び出しを $(document).ready() ハンドラー内で次のように変更することで、1 秒の遅延を導入しました。Still the same error. But, and here's where things start to look like real voodoo, when I added alert(i);
before the tinyMCE.execCommand()
setTimeout('$(".mce").each( function(i) { tinyMCE.execCommand("mceAddControl",true,this.id); });',1000);
タイムアウトにより、TinyMCE テキストエリアは正しく初期化されますが、実際の問題はダクトテープで囲んでいます。問題は明らかな競合状態のように見えます (特に、同じブラウザーで考えた場合、サーバーが localhost にある場合、問題は発生しません)。しかし、JavaScript の実行はシングルスレッドではありませんか? ここで何が起こっているのか、実際の問題はどこにあるのか、実際に修正するにはどうすればよいのか、誰か教えてください。