TinyMCEエディターをページに追加して削除し、再度追加しようとしていますが、エラーが発生しています。
パートAを実行してからパートBを実行すると、パートAよりもエラーが発生します。
Error: g.win.document is null
Source File: tiny_mce/tiny_mce.js Line: 1
パートA
js += " tinyMCE.init({ ";
js += " 'mode' : 'exact', \n";
js += " 'elements' : '" + ctrl.ID + "Editor', \n";
js += " 'plugins' : 'insertdatetime,TVCMSLink,TVCMSImage',\n";
js += " 'theme' : 'advanced',\n";
js += " 'theme_advanced_layout_manager' : 'SimpleLayout',\n";
js += " 'theme_advanced_buttons1' : 'backcolor, forecolor, |, bold, underline, strikethrough, |, numlist, bullist, charmap, |, undo, redo, |, anchor, link, tvlink, unlink',\n";
js += " 'theme_advanced_buttons2' : '',\n";
js += " 'theme_advanced_buttons3' : ''\n";
js += " });\n";
パートB
js += " tinyMCE.getInstanceById('" + ctrl.ID + "Editor').remove();\n";
編集:
上記はJavaScriptを作成するバックエンドスピネットです...以下は完全なJavaScript関数です。最初にダイアログを開いて動作すると、コンテンツはエディターにあり、エラーはありません。閉じるボタンをクリックすると、ダイアログが閉じます。関数を再度実行すると、ダイアログが表示されますが、エディターは空であり、上記のエラーがあります。
function show_HP1B0() {
$('.EditLink').hide();
$.ajax({
type: 'post',
url: 'genericHandler.ashx',
data: 'cmd=select&tableName=ExtraBlocks&id=4',
dataType: 'json',
success: function(data) {
$('#HP1B0Editor').html(data['rows'][0]['Content']);
alert($('#HP1B0Editor').html());
tinyMCE.init({ 'mode' : 'exact',
'elements' : 'HP1B0Editor',
'plugins' : 'insertdatetime,Link,Image',
'theme' : 'advanced',
'theme_advanced_layout_manager' : 'SimpleLayout',
'theme_advanced_buttons1' : 'backcolor, forecolor, |, bold, underline, strikethrough, |, numlist, bullist, charmap, |, undo, redo, |, anchor, link, tvlink, unlink',
'theme_advanced_buttons2' : '',
'theme_advanced_buttons3' : ''
});
var dlg = $('#ctl00_EXTRA_HTML_0_HP1B0Editor').dialog({
modal: false,
draggable: false,
position: 'center',
zIndex: 99999, // Above the overlay
width: 370,
title: 'Content Block Editor',
closeText: '',
open: function () {
$('body').css('overflow', 'hidden');
if ($.browser.msie) { $('html').css('overflow', 'hidden'); } $('<div>').attr('id', 'loader').appendTo('body').show();
},
close: function () { $('body').css('overflow', 'auto'); if ($.browser.msie) { $('html').css('overflow', 'auto'); } $('#loader').remove(); },
buttons: {
'Save': function () {
tinyMCE.getInstanceById('HP1B0Editor').remove();
$('.EditLink').show();
$(this).dialog('close');
},
'Cancel': function () {
alert('HP1B0Editor');
tinyMCE.getInstanceById('HP1B0Editor').remove();
$('.EditLink').show();
$(this).dialog('close');
}
}
}).parent();
dlg.appendTo(jQuery('form:first'));
},
error: function(data) {
$('.EditLink').show();
$('#HP1B0Editor').html('Error');
}
});
}
エディターインスタンスを完全に削除してエラーを回避するには、次を使用します。
tinymce.EditorManager.execCommand('mceRemoveControl',true, editor_id);
インスタンスを再初期化するには:
tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
DOMでTinyMCEエディターを移動する場合は、removeControl
とaddControl
も必要です。そうしないと、JSエラーが発生することに注意してください。
TinyMCE 4現在、インスタンスを削除して再初期化するメソッドは...
エディターインスタンスを完全に削除してエラーを回避するには、次を使用します。
tinymce.EditorManager.execCommand('mceRemoveEditor',true, editor_id);
インスタンスを再初期化するには:
tinymce.EditorManager.execCommand('mceAddEditor',true, editor_id);
パーティーに遅れたが、それは誰かの頭痛を救うかもしれない。バージョン4.2.4(2015-08-17)でうまくいったのは次のとおりです。
tinymce.EditorManager.editors = [];
その後、同じ動的に作成されたdivでエディターを再初期化できます
tinymce.init({selector:"#text"});
これは私のために働く:
if (typeof(tinyMCE) != "undefined") {
if (tinyMCE.activeEditor == null || tinyMCE.activeEditor.isHidden() != false) {
tinyMCE.editors=[]; // remove any existing references
}
}
今やることが可能になりました
tinymce.remove("#id .class or tag");
異なる設定のエディターがさらにある場合、これは設定を保持して再起動する方法です。
tinymce.EditorManager.editors.forEach(function(editor) {
// code injection
var old_global_settings = tinymce.settings;
tinymce.settings = editor.settings;
tinymce.EditorManager.execCommand('mceRemoveEditor', false, editor.id);
tinymce.EditorManager.execCommand('mceAddEditor', false, editor.id);
tinymce.settings = old_global_settings;
});
OK。注意の言葉。
たとえば、tinymceインスタンスを追加/削除したい合計5つのテキストエリアがある場合。
[〜#〜] and [〜#〜]
特定のページでこれを複数回行いたい場合は、要件に合った代替ソリューションを探す方が良いでしょう。
なぜでしょうか?。すべてがうまくいくとしても、tinymceのすべてのデタッチと再アタッチには、実行にmuch時間がかかるからです。ブラウザは、スクリプトを停止するかどうかを提案します。
source:異なるtextareasを別々の非表示divに保持して、必要に応じてユーザーに表示しようとした私自身の経験。
これを試して:
tinymce.remove();
setTimeout(function () {
tinymce.init(
{
selector: 'textarea',
menubar: false,
height: "300",
plugins: [
'advlist autolink lists link image charmap print preview anchor textcolor ksfm',
'searchreplace visualblocks code fullscreen',
'insertdatetime media table contextmenu paste code help'
],
toolbar: 'undo redo | fontselect fontsizeselect styleselect | alignleft aligncenter alignright alignjustify | bold italic underline strikethrough | link table | ksfm'
}
);
}, 1);
既存のtinymceエディターを削除し、tinymce.EditorManager.editors配列の新しいニーズクリアランスを追加します。このソリューションは、両方の場合に機能します。1.エディターが1つだけで、それを再度削除して追加する場合。 2.複数のエディターがあり、特別なエディターを削除して再度追加する場合。
console.log(tinymce.EditorManager.editors);
これにより、削除したいエディターの配列と正確なインデックスが表示されます。たとえば、上記のコンソールの出力例の1つは次のとおりです。
Array[2]
0:B
1:B
length:2
textarea-1:B
textarea-2:B
_proto_Array[0]
これは、textareasに2つのtinymceエディターがある場合のコンソールの出力です。#textarea-1と#textarea-2#textarea-2を削除して再追加したい場合は、次のように実行できます。
tinymce.EditorManager.editors.splice(1, 1);//removing second element in array.
delete tinymce.EditorManager.editors['textarea-2'];//deleting respective textarea id from array
その後、initを使用して簡単に再度追加できます。
tinymce.init({
selector:'#ts-textarea-2'
});
Tinymceエディターに関連付けられたtextareaが1つしかない場合、#textarea-1を指定して、削除して再初期化する場合は、tinymce.EditorManager.editorsを空にするだけです。
tinymce.EditorManager.editors = [];
そして、上記で説明したように、initコマンドを使用して追加できます。エラーなしで私のために働いた。
それが役に立てば幸いです
エディターのコンテンツをリセットするためにこれを見ている場合、それを破壊して再度初期化する代わりに、このようなコンテンツを単に変更することができます
var editor = tinymce.get('editor_id'); //the id of your textarea
editor.setContent(content); //any html as string
これを試して:
var default_value_1 = 'test';
var default_value_2 = 'test';
tinyMCE.remove();
tinyMCE.init({
selector: '#id_element_1',
plugins: 'print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists textcolor wordcount imagetools contextmenu colorpicker textpattern help code',
toolbar: "code formatselect | bold italic strikethrough forecolor backcolor | link | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat"
}).then(function(editors){
editors[0].setContent(default_value_1 || '');
});
tinyMCE.init({
selector: '#id_element_2',
plugins: 'print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template codesample table charmap hr pagebreak nonbreaking anchor toc insertdatetime advlist lists textcolor wordcount imagetools contextmenu colorpicker textpattern help code',
toolbar: "code formatselect | bold italic strikethrough forecolor backcolor | link | alignleft aligncenter alignright alignjustify | numlist bullist outdent indent | removeformat"
}).then(function(editors){
editors[0].setContent(default_value_2 || '');
});
最初に使用したもの:
tinymce.execCommand('mceRemoveEditor', true, id);
tinymce.execCommand('mceAddEditor', true, id);
ただし、これらのコマンドは非同期で実行されるため、addコマンドは失敗することがよくあります。回避策として、私は:
tinymce.execCommand('mceRemoveEditor', true, id);
setTimeout(function() {
tinymce.execCommand('mceAddEditor', true, id);
}, 500);
しかし、私はこの解決策が嫌いでした。なぜなら、ユーザーにとっては遅いように見えたからです。コンピューターが遅い場合でも500ミリ秒で十分であるとは言えませんでした。
今私は使用しています:
tinymce.remove(id);
tinymce.init({
selector: id
});
なぜこれが機能するのかはわかりませんが、機能します。このコードには、私が使っていた古いコードにあった非同期の問題はありません。
ここで試してください: https://jsfiddle.net/g0u059au/
上記のすべての解決策は私にとってはうまくいきませんでした...これは私のポップアップ終了イベントでうまくいきました
var editor = tinyMCE.get('txtMailingText');
if (editor!=null) {
editor.destroy();
}
// Remove all editors bound to divs
tinymce.remove('div');
// Remove all editors bound to textareas
tinymce.remove('textarea');
// Remove all editors
tinymce.remove();
// Remove specific instance by id
tinymce.remove('#id');
その価値のために、私はこれをやった:
エディターを追加すると次のようになります。
$(function() {
tinymce.EditorManager.execCommand('mceRemoveEditor',true, 'fred');
#{tinymce_javascript(:simple_editor, {height: 150, :selector => 'fred'})}
});
$(document).on('click', '.tinyMCE-save', function(event) {
tinyMCE.triggerSave();
return true;
});
明示的なクリックでエディターが削除されました。
<a href="#" class="tinyMCE-save cool-js-click-handler">Cancel</a>