如何知道生成CKEditor WYSIWYG编辑器的javascripts何时完成执行?

时间:2012-11-22 21:55:29

标签: javascript drupal-7 ckeditor

我正在使用Drupal 7上的CKEditor 3.6.5.7647将我所有已过滤的HTML文本字段转换为WYSIWYG编辑器。 Drupal会自动执行此操作,但它会影响表单验证。实际上,drupal仍然正确地将error类应用于textarea,但textarea现在被隐藏并被WYSIWYG编辑器取代,阻止用户看到该类的效果(红色边框)。我认为通过添加一个查看所有WYSIWYG的脚本可以很容易地解决这个问题,并且如果关联的textarea设置了error类,则将它们的边框设置为红色,但我发现我的脚本正在执行之前WYSIWYGs已经建成,打破了它。我设法完成这项工作的唯一方法是:

jQuery.noConflict();
(function ($) {
    "use strict";

    function fixWYSIWYGHighlights() {
        $('span.cke_skin_kama').each(function() {
            if ($(this).prev().hasClass('error')) {
                $(this).css({ border: '1px solid #f00'});
            }
        });
    }

    $('document').ready(function () {
        var timeout = window.setTimeout(fixWYSIWYGHighlights, 1000);    // TODO Find a better way to launch the script only once the WYSIWYGs are constructed
    });
}(jQuery));

正如您所看到的,我正在使用超时来确保只有在构建WYSIWYGs的脚本终止后才会执行我的脚本,但我想知道是否有更好的方法来执行此操作。

解决

感谢oleq的回答,我用以下代码解决了我的问题:

jQuery.noConflict();
(function ($) {
    "use strict";

    $(document).ready(function () {
        CKEDITOR.on('instanceReady', function (event) {
            var textarea = $(event.editor.element.$)[0],
                element = $(event.editor.container.$)[0];
            if($(textarea).hasClass('error')) {
                $(element).css({ border: '1px solid #f00' });
            }
        });
    });
}(jQuery));

1 个答案:

答案 0 :(得分:2)

我想您应该观察instanceReady事件并在其回调中执行您的代码:

CKEDITOR.on( 'instanceReady', function( event ) {
    console.log( 'Me ready!', event, event.editor );
});