TinyMCE с вкладками ajax

Я использую компонент вкладок JQuery UI 1.8 и загружаю содержимое вкладок через ajax (html-контент). На одной из этих вкладок я использую компонент tinyMCE, и когда я загружаю эту вкладку в первый раз, крошечный инициализируется правильно, но если я перехожу на другую вкладку и снова вспоминаю вкладку, крошечный ломается.

Это происходит, когда импорт tiny_mce.js выходит за пределы содержимого вкладок. Когда я перемещаю импорт в вызов вкладки, крошечный не загружается, потому что кажется, что он не инициализирован.

Вопрос в том, как инициализировать крошечный на вкладке ajax?

Заранее спасибо.


person doctore    schedule 28.09.2011    source источник
comment
Вам нужно вызвать .tinyMCE() или что-то еще (я сам его не использую) для элемента в вашей функции завершения/успеха AJAX.   -  person Bojangles    schedule 28.09.2011
comment
Если я инициализирую крошечный в содержимом ajax, а импорт tiny_mce.js находится в родительском документе (содержащем вкладки), он отлично работает только в первый раз. Если импорт .js находится в содержимом ajax, не работает никогда.   -  person doctore    schedule 28.09.2011


Ответы (5)


Когда у меня были похожие проблемы с TinyMCE и переключением между вкладками, загруженными ajax, я нашел этот замечательный фрагмент кода по адресу Ready4State, поэтому я решил поделиться, надеюсь, это поможет другим.

Это удалит все экземпляры TinyMCE на странице.

var i, t = tinyMCE.editors;
for (i in t){
  if (t.hasOwnProperty(i)){
    t[i].remove();
  }
}    

Затем вы можете безопасно повторно инициализировать TinyMCE.

Лично я выполняю приведенный выше код перед использованием оператора switch для обработки каждого ui.index, и у меня есть функция, которая выполняет инициализацию для TinyMCE. Поэтому я просто вызываю эту функцию в каждом из соответствующих операторов case.

Надеюсь, это поможет кому-то еще.

person DigiDamsel    schedule 23.03.2012
comment
Это сработало для меня. Вероятно, потому что у меня есть несколько экземпляров tinymce на одной вкладке. - person Rooster242; 29.10.2013

Возможно, стоит повторно инициализировать крошечный MCE каждый раз, когда вы переключаетесь обратно на вкладку с открытым редактором. Вы можете использовать событие «выбрать» для объекта вкладки.

$( ".selector" ).tabs({
  select: function(event, ui) { 
    // initialise Tiny MCE here
  }
});

Возможно, вам придется уничтожить все предыдущие экземпляры / ссылок на редактор перед повторной инициализацией.

person Dan Higham    schedule 28.09.2011
comment
Спасибо за ваш ответ, но текстовое поле, содержимое которого tinymce загружает через ajax, по этой причине, когда я это делаю, вы говорите (или эквивалентный код), что работает нормально только в первый раз. Я попытался удалить редакторы: [для (edId в tinyMCE.editors) tinyMCE.editors[edId].remove();] но не работает. - person doctore; 28.09.2011
comment
Затем перезагрузите текстовое поле через ajax и в этот момент, когда это будет завершено, используйте обратный вызов и затем повторно запустите tinyMCE. - person Dan Higham; 28.09.2011
comment
Повторная инициализация не работает, по этой причине я сказал, что работает нормально только в первый раз. Если я перезапускаю крошечный, когда я пытаюсь использовать его во второй раз, компонент возвращает ошибку: неперехваченное исключение: [Исключение... Компонент вернул код ошибки: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand] nsresult: 0x80004005 (NS_ERROR_FAILURE ) местоположение: кадр JS :: /tiny_mce/tiny_mce.js :: Q :: данные строки 1: нет] - person doctore; 28.09.2011

Вам нужно закрыть свои экземпляры tinymce, прежде чем переключаться на другую вкладку, иначе элемент редактора с этим идентификатором будет заблокирован.

Удалите элемент управления, прежде чем переключать вкладку с помощью

// the_editor_id equals the id of the underliing textarea
tinyMCE.execCommand('mceRemoveControl', false, the_editor_id);
person Thariama    schedule 28.09.2011
comment
Сначала я попытался перейти по следующему URL-адресу: stackoverflow.com/questions/6928883/. Но безуспешно. - person doctore; 28.09.2011
comment
что произойдет, если вы используете removecontrol? - person Thariama; 28.09.2011
comment
Я нашел решение и опубликовал пост с ним. Спасибо за Ваш ответ. - person doctore; 28.09.2011

Я нашел решение своей проблемы. Инициализация tinymce должна происходить в событии load вкладки jquery, например:

$("div#tabs").tabs ({collapsible: false
                    ,selected:    -1
                    ,fx: {opacity: 'toggle'}
                    ,load: function (event, ui) {

                       // Tab with tinyMCE
                       if (ui.index == 0) {
                          tinyMCE.init({mode: "none",
                                        theme: "advanced",
                                        theme_advanced_toolbar_location: "top",
                                        theme_advanced_toolbar_align: "left"
                                       });
                          tinyMCE.execCommand ('mceAddControl', false, 'text_area_id');
                       }
                       else {
                         tinyMCE.triggerSave();
                         tinyMCE.execCommand('mceFocus', false, 'text_area_id');
                         tinyMCE.execCommand('mceRemoveControl', false, 'text_area_id');
                       }
                     }
              });

Надеюсь, это поможет другим. Кроме того, если содержимое текстовой области загружается через ajax, команда:

tinyMCE.triggerSave();

не требуется.

person doctore    schedule 28.09.2011

Ну, сегодня потратил 3 часа на ту же проблему... с Jquery UI 1.10 и TinyMCE 4.

Проблема в том, что при невыборе содержимое панели ajax не удаляется из DOM, а просто скрывается. Это означает, что текстовая область может быть более 1 раза в DOM (навигация по панелям). => Смерть крошечного MCE...

В Jquery 1.10 нет события для захвата «невыбранной панели». Вы должны иметь дело с событием перед загрузкой.

Таким образом, идея состоит в том, чтобы очистить каждую панель с «загрузкой ajax» перед загрузкой панели. Код :

$( "#list_onglet_lecteur" ).tabs({
    beforeLoad: 
        function( event, ui ) {
            $("#list_onglet_lecteur div[role=tabpanel]").each(function(){
                if($(this).attr("id") != "list_onglet_lecteur-accueil")$(this).empty();
            });

            $(ui.panel).html('<div style="width:100%;text-align:center"><img src="/images/ajax_loader_big.gif" alt=""></img><br />Chargement de l\'onglet</div>');
            ui.jqXHR.error(function() {
                ui.panel.html("Echec du chargement de l'onglet. Merci d'actualiser la page.");
            });
    } 
})

Обратите внимание, что я не нашел способа сделать разницу между "панелями, загруженными ajax" и "предварительно загруженными панелями"... Это позор, потому что вам нужно добавить идентификаторы каждой "предварительно загруженной панели" в код...

Во всяком случае, это решает крошечную проблему MCE. Нет необходимости инициализировать событие загрузки и использовать команды mceRemoveControl/mceAddControl. Просто запустите редактирование tinyMCE в представлении «панель вкладок с загрузкой ajax»:

 $(function() {   
    tinyMCE.init({
        height : 300,
        mode : "specific_textareas",
        editor_selector : "mceEditor",
        theme : "modern",
        language : 'fr_FR',
        plugins: [
            "advlist autolink lists link image charmap print preview anchor",
            "searchreplace visualblocks code fullscreen",
            "insertdatetime media contextmenu paste moxiemanager"
        ],
        toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image"
    }); 
});
person Lyrad    schedule 12.06.2013
comment
Почти два года спустя, но +1 за ваш ответ - person doctore; 30.06.2013