11 votes

CKEditor 4 et jQuery UI sortable suppriment le contenu après le tri

J'ai rencontré un problème avec CKEditor 4 et la méthode sortable de jQuery UI. Si je trie un conteneur contenant une instance de CKEditor, la valeur est supprimée et l'erreur "Uncaught TypeError : Cannot call method 'getSelection' of undefined". Cela rend également l'éditeur non éditable. J'ai pu contourner ce problème dans CKEditor 3 avec l'une des astuces suivantes trouvées ici : CKEditor se bloque lors de la réorganisation de l'interface utilisateur de jQuery

En regardant l'inspecteur DOM de Chrome, il apparaît que le contenu de l'iframe est supprimé.

Vous trouverez ci-dessous un code de test rudimentaire :

    <html>
    <head>
        <title>test</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
        <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.24/jquery-ui.min.js"></script>
        <script src="ckeditor.js"></script>
        <script type="text/javascript">
        $(function(){

            var tmpStore = {};
            $('#sortable').sortable({
                cursor: 'move',

                // Hack that use to work on V3 but not on V4:
                // https://stackoverflow.com/questions/3379653/ckeditor-freezes-on-jquery-ui-reorder
                start:function (event,ui) {
                    $('textarea').each(function(){
                        var id = $(this).attr('id');
                        tmpStore\[id\] = CKEDITOR.instances\[id\].getData();
                    })
                 },
                stop: function(event, ui) { 
                    $('textarea').each(function(){
                        var id = $(this).attr('id');
                        CKEDITOR.instances\[id\].setData(tmpStore\[id\]);
                    })
                  }
            });
            $('textarea').each(function(){
                var ckId = $(this).attr('id');
                config = {};
                CKEDITOR.replace(ckId, config);
            })
        })

        li { padding: 10px; width: 800px; height: 300px; }

    </head>
    <body>
        <ul id="sortable">
            <li><textarea id="test1" name="test1">test1</textarea></li>
            <li><textarea id="test2" name="test1">test2</textarea></li>
            <li><textarea id="test3" name="test1">test3</textarea></li>
        </ul>
    </body>
    </html>

0voto

Joker Points 830

J'ai eu le même problème avec CKEDITOR, le code ci-dessous a fonctionné pour moi. Détruisez l'instance de Ckeditor et supprimez le Ckeditor, puis, lorsque le glissement se termine, remplacez la zone de texte actuelle par Ckeditor.

 $("#sortable").sortable({
        items: '.dynamic',
        start: function (event , ui) {

                var editorId = $(ui.item).find('.ckeditor').attr('id');// get the id of your Ckeditor
                editorInstance = CKEDITOR.instances[editorId]; // Get the Ckeditor Instance
                editorInstance.destroy(); // Destroy it
                CKEDITOR.remove(editorId);// Remove it

        },
        stop: function(event, ui) { 
                var editorId = $(ui.item).find('.ckeditor').attr('id');// Get the Id of your Ckeditor 
                CKEDITOR.replace(editorId);// Replace it
            }
        } 

    });
    $("#sortable").disableSelection();

Ici #sortable est le id de la DIV qui est triable y .dynamic' est la classe attribuée à la DIV qui est éligible au tri et à l'évaluation. '.ckeditor' est la classe du Textarea .

J'ai obtenu ma solution à partir de Ici J'espère que cela aidera quelqu'un à l'avenir.

-1voto

mAsT3RpEE Points 449

J'utilise simplement les fonctions ckeditorOff() et ckeditorOn() pour conserver les données et réinstaller les instances de ckeditor pendant les déplacements.

$('#sortable').sortable({
    cursor: 'move',
    start:function (event,ui) {
        if(typeof ckeditorOff=='function')ckeditorOff();
    },
    stop: function(event, ui) { 
        if(typeof ckeditorOn=='function')ckeditorOn();
    } 
});

J'ai mis le typeof ckeditorOff afin de rendre le code compatible avec les futures versions de ckeditor, au cas où celles-ci décideraient de supprimer ces deux fonctions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X