关于动态Bootstrap模态的Summernote

时间:2014-11-11 18:51:25

标签: jquery twitter-bootstrap summernote

我不太确定这是我的代码问题还是Summernote中的错误。以为我会在这里发帖,看看是否有其他人遇到这个问题......

我有一个用于编辑表单的Bootstrap模式。当模态被激活时,它从mySQL中提取内容并填充模态中的表单字段。如果我更改textarea中的文本并单击Submit,它将按预期工作:将新的更新文本发送到服务器。但是,如果我将Summernote添加到该textarea并单击提交OLD,原始文本将发送到服务器而不是新的更新文本。

这是将Summernote附加到动态模态的代码。 Summernote编辑器确实出现在模态中,我没有收到任何javascript错误。

$('#modal-edit-post').on('shown.bs.modal', function() {
    if($('.summernote-edit').length > 0){
        $('.summernote-edit').summernote({
            toolbar: [
                ['style', ['bold', 'italic', 'underline', 'strike']],
                ['para', ['ul', 'ol']],
            ],
            styleWithSpan: false,
            onpaste: function(e) {
                var thisNote = $(this);
                var updatePastedText = function(someNote){
                    var original = someNote.code();
                    var cleaned = CleanPastedHTML(original);
                    someNote.code('').html(cleaned);
                };
                setTimeout(function () {
                    //this kinda sucks, but if you don't do a setTimeout, 
                    //the function is called before the text is really pasted.
                    updatePastedText(thisNote);
                }, 10);
            }
        });
    }
});

这是我用来处理提交的内容

$('#form-edit-post').submit(function(e) {

    var form = $(this);
    var formdata = false;
    if(window.FormData){
        formdata = new FormData(form[0]);
    }

    var id = 'edit-post';
    var formAction = form.attr('action');

    // testing to see the changes...
    var dd = form.serialize();alert(dd);return false;

    if($(this).valid()) {

        $('#form-edit-post :input').attr('disabled', true);
        $.ajax({
            type        : 'POST',
            url         : '/assets/ajax/post.php',
            cache       : false,
            data        : formdata ? formdata : form.serialize(),
            contentType : false,
            processData : false,
            dataType    : 'json',
            success: function(response) {
                if(response.status == 'success') {
                    modalSuccessMessage(id,'Your changes were saved');
                } else {
                    modalErrorMessage(id,response.message);
                }
                $('#form-edit-post :input').attr('disabled', false);
            },
        });
    }
    e.preventDefault();
});

不确定这是否相关,但这就是我提取动态内容的方式。

$('.edit-post').click(function(e) {

    var id   = $(this).data('id');
    var data = 'id=' + id;

    $.get('/assets/ajax/get-post-edit.php?id=',data, function(response) {
        if(response != 'fail') {
            $('#content-edit-post').html(response);
            $('#modal-edit-post').modal('show');
        }
    });

    e.preventDefault();
});

2 个答案:

答案 0 :(得分:1)

Summernote创建了一个新的div,用于存储Summernote编辑器中的内容。提交表单时,您需要从Summernote实例请求数据,然后在序列化表单数据之前插入到textarea中。假设' summernote-edit'是你的textarea的类:

$('#form-edit-post').submit(function(e) {

   var form = $(this);
   var formdata = false;
   if(window.FormData){
       formdata = new FormData(form[0]);
   }

   var id = 'edit-post';
   var formAction = form.attr('action');

   // Get content from Summernote
   var content = $(".summernote-editor").code();

   // Add content from summernote to textarea
   $("textarea.summernote-editor").html( content );

   // testing to see the changes...
   var dd = form.serialize();alert(dd);return false;

   if($(this).valid()) {

       $('#form-edit-post :input').attr('disabled', true);
       $.ajax({
           type        : 'POST',
           url         : '/assets/ajax/post.php',
           cache       : false,
           data        : formdata ? formdata : form.serialize(),
           contentType : false,
           processData : false,
           dataType    : 'json',
           success: function(response) {
               if(response.status == 'success') {
                   modalSuccessMessage(id,'Your changes were saved');
               } else {
                   modalErrorMessage(id,response.message);
               }
               $('#form-edit-post :input').attr('disabled', false);
           },
       });
    }
    e.preventDefault();
});

答案 1 :(得分:0)

我认为您应该在输入中添加onchange监听器,因此您将始终收到正确的文本。

<textarea class="summernote" name="content"></textarea>

如果是textarea:

$('.summernote').summernote({
    height: 300
}).on('summernote.change', function(we, contents, $editable) {
    $(this).html(contents);
});

如果是输入字段:

$('.summernote').summernote({
    height: 300
}).on('summernote.change', function(we, contents, $editable) {
    $(this).val(contents);
});