TinyMCE: как привязать событие после его инициализации
Я уже много искал, но по google-fu ' ing не дают мне никаких результатов : (
у меня уже инициализирован tinyMCE
редактор, процесс инициализации которого я не могу контролировать, поэтому код вроде следующего не работает вообще:
tinyMCE.init({
...
setup : function(ed) {
ed.onChange.add(function(ed, l) {
console.debug('Editor contents was modified. Contents: ' + l.content);
});
}
});
код, как показано ниже, не работает, так как плагин jQuery tinymce не определен:
$('textarea').tinymce({
setup: function(ed) {
ed.onClick.add(function(ed, e) {
alert('Editor was clicked: ' + e.target.nodeName);
});
}
});
Я имею в виду, он должен использовать tinymce.something
синтаксис.
как я могу привязать функция обратного вызова для любого события tinyMCE после того, как tinyMCE уже инициализирован?
5 ответов
после взлома объекта tinymce с помощью консоли.log (), я нашел рабочее решение:
setTimeout(function () {
for (var i = 0; i < tinymce.editors.length; i++) {
tinymce.editors[i].onChange.add(function (ed, e) {
// Update HTML view textarea (that is the one used to send the data to server).
ed.save();
});
}
}, 1000);
внутри этой функции обратного вызова можно установить привязку любого события, которое вы хотите.
на setTimeout
вызов, чтобы преодолеть состояние гонки tinymce
и jQuery
, С тех пор, как вызов tinymce.editors[i].onChange.add()
сделано tinymce еще не был инициализирован.
хотя этот пост старый, но я думаю, что другим людям понадобится этот ответ. У меня была такая же проблема и исправить это, я сделал это:
tinyMCE.init({
...
init_instance_callback : "myCustomInitInstance"
});
на основе http://www.tinymce.com/wiki.php/Configuration3x:init_instance_callback
EDIT: oops - я думал, что это еще один вопрос, на который я смотрел, который был специфичен для WordPress + TinyMCE, думаю, нет. Хотя я оставлю ответ здесь, поскольку он может быть полезен другим.
правильный способ сделать это-добавить в TinyMCE init с фильтром WordPress. Например:
PHP (в функции.php или другое место, которое запускается при загрузке страницы редактирования):
add_action( 'init', 'register_scripts' );
function register_scripts(){
if ( is_admin() ) {
wp_register_script(
'admin-script',
get_stylesheet_directory_uri() . "/js/admin/admin.js",
array('jquery'),
false,
true
);
}
}
add_action( 'admin_enqueue_scripts', 'print_admin_scripts' );
function print_admin_scripts() {
wp_enqueue_script('admin-script');
}
add_filter( 'tiny_mce_before_init', 'my_tinymce_setup_function' );
function my_tinymce_setup_function( $initArray ) {
$initArray['setup'] = 'function(ed){
ed.onChange.add(function(ed, l) {
tinyOnChange(ed,l);
});
}';
return $initArray;
}
в JavaScript (/js / admin / admin.в JS)
(function($){
window.tinyOnChange = function(ed, l){
console.log('Editor contents was modified. Contents: ' + l.content);
}
}(jQuery);
это протестировано и работает в WordPress 3.9 (хотя я просто получаю вывод консоли:
Deprecated TinyMCE API call: <target>.onChange.add(..)
но это связано с кодом TinyMCE, который вы пытаетесь использовать. Этот метод по - прежнему работает для изменения любого из параметров инициализации tinyMCE-в настоящее время я использую его для init_instance_callback
и он отлично работает.
-Томас
вот мое решение для привязки событий к одному или нескольким текстовым областям в любое время, учитывая, что этот код добавляется после включения файла javascript tinymce в вашу страницу. (Другими словами, единственное, что требуется для этого, - это существование переменной 'tinymce')
// Loop already initialised editors
for(id in tinymce.editors){
if(id.trim()){
elementReady(id);
}
}
// Wait for non-initialised editors to initialise
tinymce.on('AddEditor', function (e) {
elementReady(e.editor.id);
});
// function to call when tinymce-editor has initialised
function elementReady(editor_id){
// get tinymce editor based on instance-id
var _editor = tinymce.editors[editor_id];
// bind the following event(s)
_editor.on("change", function(e){
// execute code
});
}
обратите внимание, что событие "change"не обязательно всегда срабатывает сразу после изменения. согласно документации, его "увольняют при изменении внутри редактор, вызывающий добавление уровня отмены.- Что, по моему опыту, не всегда случается, когда ты этого ожидаешь.
один из способов преодолеть это-привязка нескольких событий, таких как "изменение ввода", однако, будет некоторое перекрытие, которое затем должно быть отфильтровано.
в TinyMCE 4 onChange не существует. Вы должны использовать:
tinymce.get('myeditorname').on("change", function() { alert("stuff"); });