dnv777
@dnv777

TinyMCE : как отловить onBlur

уже несколько часов бьюсь чтоб отловить событие onblur в TinyMCE)
Безрезультатно…
Все советы сводятся к:
  1. tinymce.dom.Event.add(doc, 'blur', function(e){...
    работает только в FF. В IE9,Chrome, Opera, Safari не работает
  2. проверяем в handle_event_callback event.type=='blur'
    ну не выдает он такого события 'blur', только 'key' и 'click' во всяком случае в IE9 и Chrome, другие уже смысла небыло проверять
  3. использовать события 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', случайно переключил раскладку на русский, он выдал:
image
  • Вопрос задан
  • 3818 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы