从summernote文本区域中提取编辑后的文本

33
我在数据库中有一系列预设电子邮件,例如 “感谢成为会员”、“谢谢您的购买,商品已经寄出”等等。我使用 Bootstrap 模态框来编辑这些电子邮件。当我单击编辑按钮时,模态框下拉,并用来自数据库的数据填充:电子邮件名称、主题和正文。我使用传递数据到 bootstrap modal 来完成这个过程。效果很好。现在我使用 summernote 作为我的富文本编辑器。
这是显示未编辑数据的文本区域:
<textarea class="summernote input-block-level" id="content" name="content" rows="18"></textarea>

summernote类是将数据传递到输出文本区域以进行编辑的方式。一旦数据被编辑,我点击提交,数据应该通过以下代码传递到JavaScript。

    $(document).ready(function()
        {
          $('button[id=editEmail]').on('click', function()
          {

var $email_edbody_array = $('textarea[name="content"]').html($('#summernote').code());
var $email_edbody = $email_edbody_array.html();
console.log("edited email" + $email_edbody);

有趣的是,如果summernote文本区域为空,即我正在创建新电子邮件而不是编辑电子邮件时,这将正常工作。

console.log应该输出已编辑的电子邮件正文,但它没有。它输出原始电子邮件正文。我不知道为什么。

我缺少什么来将编辑后的电子邮件放入我的JavaScript中?以下是我认为与此问题相关的主要代码部分。

此部分是页面输出和编辑按钮的数据重定向。

          <?php while ($datarow_emails = pg_fetch_assoc($results_emails))
          {
           echo " 
            <tr>
                <td>".$datarow_emails['internal_name']."</td> 
                <td>".$datarow_emails['email_subject']."</td>
                <td>".$datarow_emails['type']."</td>
                <td>
                        <span class='btn btn-info btn-small open-editEmailModal' data-toggle='modal' 
                            href='#editEmail' data-inm='".$datarow_emails['internal_name']."'
                            data-es='".$datarow_emails['email_subject']."'
                            data-bdy='".$datarow_emails['email_body']."'
                            data-ty=".$datarow_emails['type']."
                            data-ces=".$datarow_emails['canned_email_sid'].">
                        <i class='icon-edit icon-white'></i> Edit</span>

                        <span class='btn btn-danger btn-small open-delEmailModal' data-toggle='modal'href='#deleteWarning' data-ces=".$datarow_emails['canned_email_sid'].">
                        <i class='icon-remove icon-white'></i> Delete</span>
                </td>
            </tr>";
          } 
          ?>

下面是将数据重定向到模态框的jQuery代码。 .note-editable 用于重定向电子邮件正文。

<script>
$(document).on("click", ".open-editEmailModal", function()
{
  var internalName = $(this).data('inm');
  var emailSubject = $(this).data('es');
  var emailBody = $(this).data('bdy');
  var type = $(this).data('ty');
  var cannedEmSid = $(this).data('ces');

  $(".modal-body #canEmSid").val(cannedEmSid);
  $(".modal-body #interName").val(internalName);
  $(".modal-body #emailSub").val(emailSubject);
  $(".modal-body #emailBdy").val(emailBody);
  $(".modal-body .note-editable").html(emailBody);
  $(".modal-body #tYpe").val(type);
});
</script>

这里是模态框:

        <div id="editEmail" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="emailActivityLabel" aria-hidden="true">
          <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h3 id="myModalLabel">Edit Canned Response</h3>
            </div>
            <div class="modal-body">
        <form class="form-horizontal">
                    <div class="control-group" style="margin-bottom:8px;">
                        <label class="control-label" for="inputInternalName">Internal Name</label>
                        <div class="controls">
                        <input type="text" id="interName" name="interName" placeholder="Internal Name" />
                        <input type="hidden" id="canEmSid" name="canEmSid"/>
                      </div>
                    </div>
                    <div class="control-group" style="margin-bottom:8px;">
                        <label class="control-label" for="inputInternalName">Type</label>
                        <div class="controls">
                  <select id="tYpe" name="tYpe">
                    <?php

                    while ($datearow_typeDD2 = pg_fetch_assoc($results_typesDD2))
                    {
                    echo "<option value='".$datearow_typeDD2['buyer_seller_sid']."'>".$datearow_typeDD2['buyer_seller_type']."</option>\n";
                    }
                    ?>
                  </select>
                        </div>
                    </div>
                    <div class="control-group" style="margin-bottom:8px;">
                        <label class="control-label" for="inputSubject">Email Subject</label>
                        <div class="controls">
                        <input type="text" id="emailSub" name="emailSub" placeholder="Email Subject">
                        </div>
                    </div>
              </form>
                        <!-- <div class="text-editor"></div> -->
                    <!-- <div  class="summernote"></div> -->
                <div id="emailEditor">
                    <div class="controls">
                    <textarea class="summernote input-block-level" id="content" name="content" rows="18"></textarea>

                    </div>
                </div>
            </div>

            <div class="modal-footer">
                <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
                <button class="btn btn-success" id="editEmail">Save</button>
            </div>
        </div>

<script type="text/javascript">

$(document).ready(function() 
{
  $('.summernote').summernote({  
    });

          $('button[id=editEmail]').on('click', function()
          {

var $email_edbody_array = $('textarea[name="content"]').html($('#summernote').code());
var $email_edbody = $email_edbody_array.html();

以下内容只是其他变量和 AJAX 脚本。


你找到答案了吗?我正在寻找一种通过ajax发送Summernote编辑后的文本的方法,但我不知道如何找到这个文本。 - Farid Rn
6个回答

79

TomPHP的解决方案不适用于更新版本的summernote。 如果有人偶然发现了这篇文章,这里有一个当前的解决方案。

var textareaValue = $('#summernote').summernote('code');

谢谢您发布这个! - Daniel H.

32

你可以使用summernote的code()函数,而不是获取字段的值。

var textareaValue = $("#summernote").code();

为您的代码:

var textareaValue = $("#content").code();

8
  • 0.7.0版本之前:
$('#summernote').code()
  • 版本0.7.0及以上:
$('#summernote').summernote('code')

1
谢谢 - 直到我看到这篇小文章,我才明白为什么它不起作用。 - user1946891

1

使用方法如下: $('.summernote').summernote('code')


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
你好,请不要只在回答中提交代码,还需要加入一些细节说明为什么你认为这是最优解决方案。 - Destroy666

1
如果您有很多Summernote对象,那么可以使用此脚本在表单中自动创建“隐藏”的输入元素,并将summernote值更新到每个元素中。这非常适合我的需求。
$(function(){

        // Reference each summernote object
        var summernoteObjects = [
            'summernote_id1',
            'summernote_id2',
            'summernote_id3',
            'summernote_id4',
            'summernote_id5',
            'summernote_id6',
            'summernote_id7',
            'summernote_id8',
        ];

        // Create hidden values for each summernote
        for(var i=0; i<summernoteObjects.length; i++){
            var objectPointerName = summernoteObjects[i];

            $("#" + objectPointerName).summernote();
            $("#formId").append("<input type='hidden' name='"+objectPointerName+"'>");
        }

        // Update hidden values on form submit
        $("#formId").submit(function(){
            for(var i=0; i<summernoteObjects.length; i++){
                var objectPointerName = summernoteObjects[i];
                var summernoteValue = $("#" + objectPointerName).summernote('code');

                $("#formId input[name='"+objectPointerName+"']").val(summernoteValue);
            }
        });

    });

你为什么要创建元素?如果 Summernote 被正确初始化,它会隐藏相关的输入框。使用类选择器或者 Summernote 都可以派上用场。 - PowerMan2015

0
如果有人像我一样在 Ajax 中设置 summernote 数据时遇到困难,请注意下面的“data.note”中的note是来自数据库的列。
$.ajax({success: function(replied){data = JSON.parse(replied);$('#yourSummerID').summernote('code', data.note);}});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接