【问题标题】:ck editor - cant catch submit;ckeditor - 无法提交;
【发布时间】:2011-04-11 08:31:34
【问题描述】:

我正在尝试使用 jquery 捕获通过在 ck 编辑器中按保存提交的表单提交。

我的javascript代码是

$(function() {
    var config = {
        skin : 'office2003',
        toolbar :[
            ['Save','Preview'],
            ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print'],
            ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
            ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
            ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
            ['Link','Unlink'],
            ['Image','Table','HorizontalRule','SpecialChar','Iframe'],
            ['Format','Font','FontSize'],
            ['TextColor','BGColor', 'Bold','Italic','Underline','Strike','-','Subscript','Superscript']
        ]
    };
    $('#cont').ckeditor(config);

    $('form').submit(function() {
        var form = $(this);
        var name = form.children('#name').val();
        var desc = form.children('#desc').val();
        var cont = form.children('#cont').val();
        var id = form.children('#id').val();

        $.ajax({
            url: basePath + 'admin/ajax/pages/edit',
            type: 'POST',
            data: {
                name: name,
                desc: desc,
                cont: cont,
                id:   id
            },
            success: function(data) {
                if (data.response)
                    $('#ajaxSuccess').show('fast').delay(10000).hide('fast');
                else
                    $('#ajaxError').show('fast').delay(10000).hide('fast');

            },
            error: function(data) {
                $('#ajaxError').show('fast').delay(10000).hide('fast');
            }
        });
        return false;

    });

});

但由于某种原因,提交处理程序似乎甚至没有被调用(通过alert('called'); 作为第一行进行测试),而是正常提交​​了表单。

我做错了什么?


根据下面的答案,我已将我的代码更新为
$(function() {
    var saveCmd = {
        modes : { wysiwyg:1, source:1 },
        exec : function( editor ){
            jQuery($form = editor.element.$.form).submit();
        }
    };

    var pluginName = 'safesave';

    // Register a plugin named "save".
    CKEDITOR.plugins.add(pluginName, {
        init : function( editor ){
            var command = editor.addCommand( pluginName, saveCmd );
            command.modes = { wysiwyg : !!( editor.element.$.form ) };

            editor.ui.addButton( 'SafeSave',{
                label     : editor.lang.save,
                command   : pluginName,
                className : 'cke_button_save'
            });
        }
    });


    var config = {
        skin : 'office2003',
        toolbar :[
            ['SafeSave','Preview'],
    ...

但是现在我没有保存按钮,怎么了?

【问题讨论】:

  • $('form').submit(function() { alert('hello'); }) 检查提交是否被调用。
  • @experimentX - CKEditor 使用 javascript form.submit() 调用提交,这是 jQuery 或任何其他方式无法捕获的。

标签: jquery forms post ckeditor


【解决方案1】:

是的,你不能。您需要一个不同的保存模块。我写这篇文章正是为了这个目的:

(function(){
    var saveCmd = {
        modes : { wysiwyg:1, source:1 },
        exec : function( editor ){
            jQuery($form = editor.element.$.form).submit();
        }
    };

    var pluginName = 'safesave';

    // Register a plugin named "save".
    CKEDITOR.plugins.add(pluginName, {
        init : function( editor ){
            var command = editor.addCommand( pluginName, saveCmd );
            command.modes = { wysiwyg : !!( editor.element.$.form ) };

            editor.ui.addButton( 'SafeSave',{
                label     : editor.lang.save,
                command   : pluginName,
                className : 'cke_button_save'
            });
        }
    });
})();

现在只需将您的命令从 save 更改为 SafeSave。不知道为什么我叫它SafeSave,也许我像现在一样累了:)

请注意,这取决于 jQuery。如果您不使用 jQuery,请更改 exec 函数。

【讨论】:

  • 抱歉,工具栏中的字符串应该是SafeSave,而不是safesave。错字。
  • 哦,还有extraPlugins : 'safesave'config 对象中。抱歉,我有一段时间没用过这个了:)(是的,那个应该是小写的)
【解决方案2】:

你可以使用beforeCommandExec事件&cancel()方法:

<script type="text/javascript">
$(document).ready(function () {

    $('.ckeditoriz').ckeditor(/* config */);

    $('.ckeditoriz').each(function () {
        var id = $(this).attr('id'),
            form = this.form;

        CKEDITOR.instances[id].on('beforeCommandExec', function (event) {
            if (event.data.name === 'save') {
                event.cancel();
                $(form).submit();
            }
        });

    });

    $('.ajaxForm').submit(function (event) {
        event.preventDefault();
        var $this = $(this);
        $.ajax({
            type: $this.attr('method'),
            url: $this.attr('action'),
            data: $this.serialize()
        });
    });

});
</script>

<form action="url" method="post" class="ajaxForm">
  <!-- Your textarea must have an ID! -->
  <textarea id="textarea1" name="textarea1" class="ckeditoriz"></textarea>
</form>

更新:

这在 CKEditor 版本 4.04.14.2 中不起作用,但是从版本 4.3 起它再次起作用强>.

从 CKEditor 版本 4.2 开始,您可以将save 事件与cancel() 方法一起使用:

CKEDITOR.instances[id].on('save', function (event) {
    event.cancel();
    $(form).submit();
});

【讨论】:

    【解决方案3】:

    您可以使用 javascript 伪协议捕获提交:

    <script type="text/javascript">
        function Save() {
            // called when the save button is pressed
        }
    </script>
    

    ...

    <form action="javascript:Save()">...</form>
    

    【讨论】:

      【解决方案4】:

      如果您需要更新元素 onchange ckeditor 使用此代码:

      for (var i in CKEDITOR.instances) {
          CKEDITOR.instances[i].on('change', function() { 
          CKEDITOR.instances[i].updateElement() });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2012-12-03
        • 1970-01-01
        • 2021-12-22
        • 2011-04-11
        相关资源
        最近更新 更多