TinyMCE не работает в запросе http - PullRequest
1 голос
/ 06 ноября 2011

Так что у меня есть страница, которая содержит ссылки, которые вызывают httpRequest.Запрос вызывает php-файл, который извлекает данные из mysql и предварительно заполняет форму, которая затем возвращается в браузер / веб-страницу.Моя проблема в том, что когда страница возвращается в браузер через httpRequest / ajax, текстовая область не отображает редактор tinymce, она просто отображает обычную текстовую область.Похоже, что мой запрос и ajax работает нормально, текстовая область просто не имеет редактора tinycme.

Когда я не использую AJAX, он работает нормально, но когда я помещаю его в отдельный файл и вызываю его с помощью AJAX, он не приводит к редактору tinymce.

Кто-нибудь знает, как решить эту проблему, чтобы моя страница, сгенерированная ajax, отображала текстовую область с редактором tinymce.Спасибо.

Ответы [ 4 ]

1 голос
/ 12 ноября 2011

Предположим, что ваш экземпляр thinyMCE инициализирован с кодом ниже

// initialize tinyMCE in page
tinyMCE.init({
    mode: "textareas",
    theme: "advanced"
});

и у вас есть какая-то кнопка где-то на странице.В целях этого совета я не буду давать ему никакого удостоверения личности, но вы можете.Теперь, используя jQuery, вы можете легко прикрепить обработчик событий к той кнопке, которая будет вызывать через AJAX ваш сервер и извлекать контент, который вы хотите поместить в tinyMCE редактор.Код, который будет выполнять такую ​​работу, будет выглядеть примерно так:

$(function() {

    $("button").bind("click", function() {
        var ed = tinyMCE.get('content');
        ed.setProgressState(1); // Show progress
        $.getJSON('/page/12.json', { /* your data */
        }, function(data) {
            ed.setProgressState(0); // Hide progress
            ed.setContent(data["body"]);

        }
        });
    });
});

Вы можете видеть, что на button.click ajax будет вызывать url /page/12.json, который будет возвращать JSON в качестве ответа.Минимальный минимум этого ответа может быть:

{
   title: "Page title",
   body: "<html><head><title>Page title</title>......</html>"
}

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

О JSON

JSON сокращает нотацию объектов JavaScript.Это код JavaScript !!!Так что не смущайтесь.Используя JSON, вы можете создать объект javascript, который может иметь атрибуты, которые вы можете использовать позже в своем коде для доступа к определенному миру данных, которые этот объект «держит».Вы можете рассматривать это как некую структуру данных, если вам это легче.

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

var data = new Object();
data.title = "Page title";
data.body = "<html....";

или

var data = {
    title: "page title",
    body: "<html...."
};

это очень одно и то же.

Если вы хотите узнать больше о JSON, укажите ваш браузер на http://json.org.

===== alternative =====

АльтернативаРешение json может быть простым плоским вызовом ajax на сервер, а ответ может быть простым HTML (из вашего вопроса я могу предположить, что у вас уже есть что-то подобное).Поэтому вместо вызова $.getJSON вы можете использовать $.get(url, callback);, чтобы сделать то же самое.Код в верхней части моего ответа кардинально не изменится.Вместо получения JSON в ответ вы получите строку HTML.

----------- НИЖНЯЯ ЛИНИЯ -------

Я предпочитаю JSON, так какпозже его можно легко расширить с помощью других атрибутов, так что в дальнейшем нет болезненных изменений кода;)

0 голосов
/ 29 декабря 2011

Я исправил эту проблему, вызвав функцию после вызова ajax.В этой части моего ajax:

if (xmlhttp.readyState==4 && xmlhttp.status==200)
     {
     document.getElementById("Content").innerHTML=xmlhttp.responseText;
     tinymce();

Теперь все работает нормально.

0 голосов
/ 08 ноября 2011

Странно, я столкнулся с этой проблемой вчера.Следующий код должен работать, но YMMV.Хитрость заключается в том, чтобы использовать правильные шаги в событиях ajax .Я использовал Regular TinyMCE и использовал уже включенную библиотеку jQuery.

Далее идет инициализация вашей крошечной MCE tinyMCE.init().Весь приведенный ниже блок должен находиться за пределами document.ready.

 myTinyInit = {
     //.......All essential keys/values ...........

      setup : function(ed) {
                 ed.onChange.add(function( ed ) {
                       tinyMCE.triggerSave();
                }) }
     //.....................

 };
 // Init the tinyMCE 
 tinyMCE.init(myTinyInit);

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

Обычно tinyMCE mceAddControl до поста ajax и mceRemoveControl после успеха ajax должны сработать.Но я обнаружил, что часто не работает.

Я использовал форму в качестве селектора jQuery в моем случае.

jQuery( '.myForm' )
.find( 'textarea#myTextArea' )
.ajaxStart(function() {
   // If you need to copy over the values, you can do it here.
   // If you are using jQuery form plugin you can bind to form-pre-serialize event instead.        
   // jQuery( this ).val( tinyMCE.get( jQuery( this ).attr( 'id' )).getContent() );

}).ajaxSend( function() {

    // ! - step 2 
    // My case was multiple editors.
    myEds = tinyMCE.editors;
    for( edd in myEds ) {
       myEds[ eds ].remove();
    } 

    // tinyMCE.get( 'myTextarea' ).remove(); 
    // strangely mceRemoveControl didnt work for me. 
    // tinyMCE.execCommand( 'mceRemoveControl', false, jQuery( this ).attr('id')); 

}).ajaxSuccess(function() {

    // Now we got the form again, Let's put up tinyMCE again.
    txtID = jQuery( this ).attr( 'id' );

    // ! - step 3 
    tinyMCE.execCommand( 'mceAddControl', false, txtID ); 


    // Restore the contents into TinyMCE. 
    tinyMCE.get( txtID ).setContent( jQuery( this ).val());

});

Проблемы, с которыми я столкнулся:

  1. Использование mceRemoveControl всегда давало мне ошибку r is undefined постоянно.
  2. Если вы получаете пустой редактор tinyMCE, проверьте DOM, заменен ли идентификатор текстовой области на что-то вроде mce_02, это означает, что TinyMCE инициализируется снова или что-то не так с порядком.Если это так, то tinyMCE дублируется при каждом сохранении.
  3. Если вы новичок в JS, я рекомендую использовать jQuery с плагином form , это может быть проще для вас.Но используйте обычный не-jquery tinyMCE, поскольку он хорошо задокументирован.
0 голосов
/ 07 ноября 2011

Проблема здесь будет в том, что когда вы возвращаете полную страницу и визуализируете ее, используя ответ ajax, ваш экземпляр tinymce ранее не выключался.Чтобы сделать это, вы можете вызвать этот небольшой фрагмент кода перед обработкой ответа ajax:

tinymce.execCommand('mceRemoveControl',true,'editor_id');

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

...