Firefox и TinyMCE 3.4.9 не будут хорошо играть вместе - PullRequest
3 голосов
/ 28 марта 2012

Я отправил сообщение об ошибке пользователям tinyMCE, но я надеюсь, что кто-то еще сталкивался с этим и нашел подходящее решение.

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

"Node cannot be used in a document other than the one in which it was created" 

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

В моих диалогах jquery у меня есть следующие скрипты в моем обработчике beforeClose:

if (typeof tinyMCE != 'undefined') {
                $(this).find(':tinymce').each(function () {
                    var theMce = $(this);

                    tinyMCE.execCommand('mceFocus', false, theMce.attr('id'));
                    tinyMCE.execCommand('mceRemoveControl', false, theMce.attr('id'));
                    $(this).remove();
                });
            }

и вот мой установочный скрипт tinyMCE:

$('#' + controlId).tinymce({
        script_url: v2ScriptPaths.TinyMCEPath,
        mode: "none",
        elements: controlId,
        theme: "advanced",
        plugins: "paste",
        paste_retain_style_properties: "*",
        theme_advanced_toolbar_location: "top",
        theme_advanced_buttons1: "bold, italic, underline, strikethrough, separator, justifyleft, justifycenter, justifyright, justifyfull, indent, outdent, separator, undo, redo, separator, numlist, bullist, hr, link, unlink,removeformat",
        theme_advanced_buttons2: "fontsizeselect, forecolor, backcolor, charmap, pastetext,pasteword,selectall, sub, sup",
        theme_advanced_buttons3: "",
        language: v2LocalizedSettings.languageCode,
        gecko_spellcheck : true,
        onchange_callback: function (editor) {
            tinyMCE.triggerSave();
        },
        setup: function (editor) {
            editor.onInit.add(function (editor, event) {
                if (typeof v2SetInitialContent == 'function') {
                    v2SetInitialContent();
                }
            })
        }
    });

Есть ли здесь что-нибудь очевидное? У меня есть все эти сложные вещи для удаления в тесном B / C Tinymce не нравится, когда его HTML удаляется без его удаления.

Функция setInitialContent () предназначена только для того, чтобы я мог предварительно загрузить ее своей подписью электронной почты, если она есть. он сломан с этим кодом или без него, так что это не проблема.

Я был вынужден обновить до 3.4.9 из-за этой проблемы:

http://www.tinymce.com/forum/viewtopic.php?id=28400

так что если кто-то может решить это, это поможет в этой ситуации. Я попытался внушить совет от безрезультатно.

РЕДАКТИРОВАТЬ: Первоначально я думал, что это касается только Firefox 11, но я скачал 10, и это также влияет.

РЕДАКТИРОВАТЬ: Хорошо, я обрезал все мои извилистые динамические формы и ссылки, которые приводят это к довольно простому примеру.

код для базовой страницы:

<a href="<%=Url.Action(MVC.Temp.GetRTEDialogContent)%>" id="TestSendEmailDialog">Get Dialog</a>
<div id="TestDialog"></div>
<script type="text/javascript">
    $('#TestSendEmailDialog').click(function (e) {
        e.preventDefault();

        var theDialog = buildADialog('Test', 500, 800, 'TestDialog');
        theDialog.dialog('open');
        theDialog.empty().load($(this).attr('href'), function () {

        });

    });

    function buildADialog(title, height, width, dialogId, maxHeight) {
        var customDialog = $('#' + dialogId);

        customDialog.dialog('destory');

        customDialog.dialog({
            title: title,
            autoOpen: false,
            height: height,
            modal: true,
            width: width,
            close: function (ev, ui) {

                $(this).dialog("destroy");
                $(this).empty();

            },
            beforeClose: function (event, ui) {

                if (typeof tinyMCE != 'undefined') {
                    $(this).find(':tinymce').each(function () {
                        var theMce = $(this);

                        tinyMCE.execCommand('mceFocus', false, theMce.attr('id'));
                        tinyMCE.execCommand('mceRemoveControl', false, theMce.attr('id'));
                        $(this).remove();
                    });
                }

            }
        });

        return customDialog;

    }

</script>

и код страницы, которая загружается в диалоговое окно:

<form id="SendAnEmailForm" name="SendAnEmailForm" enctype="multipart/form-data" method="post">
   <textarea cols="50" id="MessageBody" name="MessageBody" rows="10" style="width: 710px; height:200px;"></textarea>
</form>

<script type="text/javascript">

    $(function () {
        $('#MessageBody').tinymce({
            script_url: v2ScriptPaths.TinyMCEPath,
            mode: "exact",
            elements: 'MessageBody',
            theme: "advanced",
            plugins: "paste, preview",
            paste_retain_style_properties: "*",
            theme_advanced_toolbar_location: "top",
            theme_advanced_buttons1: "bold, italic, underline, strikethrough, separator, justifyleft, justifycenter, justifyright, justifyfull, indent, outdent, separator, undo, redo, separator, numlist, bullist, hr, link, unlink,removeformat",
            theme_advanced_buttons2: "fontsizeselect, forecolor, backcolor, charmap, pastetext,pasteword,selectall, sub, sup, preview",
            theme_advanced_buttons3: "",
            language: 'EN',
            gecko_spellcheck: true,
            onchange_callback: function (editor) {
                tinyMCE.triggerSave();
            }
        });
    });

</script>

очень интересная вещь, которую я заметил, если я переместил настройку tinyMCE в функцию обратного вызова load, она, похоже, работает. это не совсем решение, потому что, когда я загружаю диалоги, я не знаю в коде заранее, есть ли у него элементы управления tinyMCE или нет!

1 Ответ

0 голосов
/ 29 марта 2012

Я решил это, переместив настройку tinyMCE в функцию, а затем в моих вызовах load () проверил, существует ли эта функция, и затем вызвал ее.

не лучшее решение, но оно работает.

...