8

カスタム プラグインをいくつか作成しましたが、キーボードのキー イベントをリッスンしているのは 1 つだけです。以下のコードでは、イベントを設定するためのセットアップを確認できます。(そしてそれはちょっと基本的なことです)

今、私は、instanceReadyリスナーでeditor.setDataを使用してデータを設定すると、.on関数が設定されないという次の問題があります。

contentDom を instanceReady イベントに置き換えようとしましたが、それも修正されません。

editor.document.getBody().setHtml(html) を使用して手動でデータを設定すると、問題はありません。すべてのイベントは問題なく添付されます..

CKEDITOR.plugins.add( 'myPlugin', {
    lang: '', // %REMOVE_LINE_CORE% 

    init: function( editor ) {

        //Bind events if the Dom is ready!
        editor.on( 'contentDom', function()
        {
                //keydown
                editor.document.on('keydown', function(e)
                {

なぜこれが起こっているのか誰にも分かりますか?setData 関数は html を設定するだけですか、それともエディターなどをリロードしますか?

このCkeditor Sourceを見てみましたが、 これは setData 関数と関係のあるコードではないと思います。

私は解決策を求めているわけではありません。なぜそれが起こっているのかを理解するのが好きです。

4

1 に答える 1

13

Editor#contentDom新しい内部ドキュメントが設定されるたびに発生します。フレーム化されたエディターでは、ドキュメント全体だけでなくドキュメント全体がeditor#setData()置き換えられるため、毎回発生します。body.innerHTMLcontentDom

したがって、コードはすべてに新しいリスナーを追加しますsetData()が、古いリスナーは削除しません。理由は不明ですが、これら 2 つのリスナーはいずれも起動されていませんkeydown。私はこれを最近知りましたが、この事実を説明することはできません。

とにかく、上のすべてのリスナーをデタッチする必要がありますeditor#contentDomUnload。幸いなことに、 を使用してこれを行う便利な方法がありますeditable#attachListener

editor.on( 'contentDom', function() {
    var editable = editor.editable();

    editable.attachListener( editor.document, 'keydown', function() {
        ...
    } );
} );

リスナーは next で自動的に切り離されcontentDomUnloadます。

于 2013-04-17T11:30:55.253 に答える