3

現在のtinyMCEバージョン(3.5.2)。

やあ、

カスタムフォーマットを追加および削除するカスタムプラグインに取り組んでいます。

現在の選択にフォーマットを追加するのは簡単ですが、複数のフォーマットを削除するための適切な解決策を見つけることができませんでした。

私が見つけたのは、RemoveFormatコマンドでした。

tinymce.activeEditor.execCommand('RemoveFormat');
// which is the same as 
tinymce.activeEditor.formatter.remove('removeformat');

この関数は、現在選択されているフォーマットをすべて削除します。これは、一部のフォーマットのみを削除したいので、間違いなく同じです。

removeだから私はすべてのフォーマットのメソッドを呼び出そうとしました

tinymce.activeEditor.formatter.remove('format_1');
tinymce.activeEditor.formatter.remove('format_2');
...

ただし、ネストされたフォーマットが削除されないため、これも成功しませんでした。次の段落を選択して呼び出すtinymce.activeEditor.formatter.remove('format_2');と、段落はこの形式自体を使用しないため、形式は削除されません。

<p class="format_1">abcd<span class="format_2>ef</span>g</p>

要素のフォーマットと、 RemoveFormatのようなそのすべての子のフォーマットを削除する方法はありますか?


更新(@Thariama)

私のフォーマットはすべて、次の構造のカスタムフォーマットです。

  "demo_format_1" : { 
      "classes" : "demo_format_1",
      "deep" : true,
      "exact" : false,
      "inline" : "span",
      "selector" : "*",
      "title" : "Demo Format"
   }}

アップデート:

これを再度実装した後、私はさらにケースを見つけました。これが私の頭に浮かんだすべての特別なケースの例です:

フォーマットを削除する前のテキスト:

<p>abc<span class=demo_format_1>def</span></p>

ケース1(ジェフリー・トゥでカバー)

段落全体を選択すると、次の結果が得られます。

 <p>abcdef</p>

ケース2

fのみを選択すると、次の結果が得られます。

<p>abc<span class=demo_format_1>de</span>f</p>

ケース3

cdのみを選択すると、次の結果が得られます。

<p>abcd<span class=demo_format_1>ef</span></p>
4

2 に答える 2

4

tinymce.Formatter.removeは特定のノードで呼び出すことができるため、次のようになります。

var selection = ed.selection.getSel(),
    ancestor = ed.selection.getNode(),
    els = ancestor.getElementsByTagName('span'),
    l = els.length,
    i = 0;
if (selection.containsNode(ancestor, true) && ancestor.nodeName.toLowerCase() === 'span') {
    ed.formatter.remove('demo_format_2', null, ancestor);
}
for ( ; i < l; i++) {
    if (selection.containsNode(els[i], true)) {
        ed.formatter.remove('demo_format_2', null, els[i]);
    }
}

デモ


更新:問題の原因は、とを「混合」(インライン+ブロックレベル)としてマークする形式に含めることであることが判明しましinlineselector。のみでフォーマットを定義する場合inline

demo_format_1: {
    inline: "span",
    classes: "demo_format_1"
}

その後、formatter.remove('demo_format_1')期待どおりに機能します(デモ)。

于 2012-06-21T16:42:01.093 に答える
1

次のことを行う必要があります。

  1. ユーザーの選択によってすべてのパラグラフに触れさせる
  2. それらの段落の下にあるすべてのノードを取得します
  3. ノードが選択範囲に触れているかどうかを確認します
  4. そうである場合:そのクラス要素から「不要な」クラスを削除します

このためのコードは後で提供します。

于 2012-06-18T11:26:49.917 に答える