У меня есть веб-сайт с формой, которая использует TinyMCE; самостоятельно использую jQuery. Когда я загружаю форму с промежуточного сервера в Firefox 3 (MacOS X, Linux), TinyMCE не заканчивает загрузку. В консоли Firefox произошла ошибка, из-за которой t.getBody()
вернул null
. t.getBody()
Насколько я понимаю из документации TinyMCE, это функция, которая возвращает элемент тела документа для проверки на наличие некоторых функций. Проблема не возникает, когда я использую Safari, и когда я использую Firefox с тем же сайтом, работающим с localhost.
Исходный код ошибки 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()<code> call to the <code><script/>
, содержащий вызов $(document).ready()
- до, после и внутри этого вызова. Безрезультатно. Когда обработчик tinyMCE.init()<code> was called from within <code>$(document).ready()
, браузер зависал по запросу - похоже, было слишком поздно для вызова функции init.
Затем, немного погуглив об использовании TinyMCE вместе с jQuery, я изменил tinyMCE.init()
вызов на:
tinyMCE.init({ mode:"none", theme:"simple", language:"pl" });
и добавил следующий вызов jQuery к обработчику $(document).ready()
:
$(".mce").each( function(i) { tinyMCE.execCommand("mceAddControl",true,this.id); });
Все та же ошибка. Но именно здесь все начинает выглядеть как настоящее вуду, когда я добавил alert (i); перед вызовом tinyMCE.execCommand () , были выданы предупреждения и текстовые области TinyMCE были правильно инициализированы. Я подумал, что это может быть связано с задержкой, вызванной ожиданием отклонения оповещения пользователем, поэтому я ввел секунду задержки, изменив вызов, все еще находящийся в обработчике $ (document) .ready () , следующим образом:
setTimeout('$(".mce").each( function(i) { tinyMCE.execCommand("mceAddControl",true,this.id); });',1000);
</code>
С тайм-аутом текстовые области TinyMCE инициализируются правильно, но это настоящая проблема. Проблема выглядит как явное состояние гонки (особенно, если учесть, что в том же браузере, но когда сервер находится на локальном хосте, проблема не возникает). Но не является ли выполнение JavaScript однопоточным? Кто-нибудь может, пожалуйста, просветить меня о том, что здесь происходит, где настоящая проблема, и что я могу сделать, чтобы это на самом деле было решено?