уже несколько часов бьюсь чтоб отловить событие onblur в TinyMCE)
Безрезультатно…
Все советы сводятся к:
- tinymce.dom.Event.add(doc, 'blur', function(e){...
работает только в FF. В IE9,Chrome, Opera, Safari не работает
- проверяем в handle_event_callback event.type=='blur'
ну не выдает он такого события 'blur', только 'key' и 'click' во всяком случае в IE9 и Chrome, другие уже смысла небыло проверять
- использовать события onDeactivate
не ловит. да и не должно… не то событие
стоит последняя версия 3.4.8
кто-то с этим сталкивался, как решили этот вопрос?
Ответ найден
поигравшись, поглубже сделал так:
Решение 1:
setup: function (ed) {
ed.onInit.add(function (ed) {
jQuery('body', ed.getDoc()).blur(function (ev) {
alert('blur');
});
});
}
все бы хорошо, да с IE Проблема, он вызывает это событие везде внутри iframe, при клике на кнопку, на пустом поле…
и при этом оба ev.target и ev.currentTarget всегда ссылаются на body, так что определить где кликнули, на какой-то элемент внутри фрейма, или вне не получается.
Придется искать более универсальное решение…
Конечное решение
Убираю из настроек 'setup' и 'onchange_callback'(этот при каждом клике на кнопки вызывается).
И после создания окна tinyMCE:
//сохраняем текущий текст
$('#ourTextarea').data('text',$('#ourTextarea').html());
//вешаем событие document.onclick, чтоб отловить потерю фокуса
jQuery(document).on('click.tinymce',myTinyBlur);
function myTinyBlur(ev) {
//проверяем не клацнули ли по какому-то объекту tinymce за пределами контейнера, например панели выбора цвета
//придется избегать в своем коде id и className начинающихся с mce... другого варианта не нашел
if ($(ev.target).closest("[id^='mce'],[class^='mce']").length > 0) return ;//это popup от tinymce
$(document).off('click.tinymce'); //убираем document.onclick;
var oldValue=$('#ourTextarea').data('text');
//если до этого текст был взят из элемента, то желательно перед сравнением со старым значением
//привести тэги в соотв. регистр, т.к. tinymce возвращает тэги в нижнем регистре. например так:
var newValue=$('<div/>').html($('#ourTextarea').html()).html();//var newValue=$('#ourTextarea').html();
if(oldValue != newValue) SAVE();
//уничтожаем редактор
}
А вообще странно, событие onchange_callback добавили, а onblur_ постеснялись…
под конец издевательств над tinymce, Visual Studio перешел к оскорблениям… Когда в дебагере набирая 'ev', случайно переключил раскладку на русский, он выдал: