Я пытаюсь решить проблему, связанную с упорядочением событий при использовании CKEditor.
Похоже, что CKEditor намеренно ждет определенное время (200 мс), прежде чем вызвать событие blur. Насколько я понимаю, это сделано для предотвращения ошибочного blur, когда пользователь щелкает из поля редактирования на панель инструментов.
Однако результатом этого является то, что в некоторых браузерах, если пользователь щелкает элемент с прослушивателем событий click сразу после использования CKEditor, событие click срабатывает перед событием blur, и это проблема для меня, потому что мне нужно обрабатывать события в том порядке, в котором они произошли (с точки зрения пользователя).
Это поведение можно наблюдать ниже в IE или Edge, введя некоторый текст в CKEditor и щелкнув кнопку или флажок, не щелкая и не выходя из CKEditor. На моей машине консоль показывает промежуток примерно в 10-20 мс между двумя запускаемыми событиями, а иногда событие размытия даже срабатывает первым.
function timeStamp() { return new Date() % 1000000; }
CKEDITOR.disableAutoInline = true;
CKEDITOR.inline('myCkEditorBox', {
on: {
blur: function() {
console.log(timeStamp(), 'CKEDITOR blur.');
}
}
});
document.getElementById('myButton').addEventListener('click', function() {
console.log(timeStamp(), 'Button clicked.');
});
document.getElementById('myCheckbox').addEventListener('click', function() {
console.log(timeStamp(), 'Checkbox clicked.');
});
#myCkEditorBox {
border: 1px solid black;
width: 400px;
min-height: 200px;
margin-top: 5em;
}
<script src="https://cdn.ckeditor.com/4.7.3/standard/ckeditor.js"></script>
<input type="button" value="Do something" id="myButton" />
<input type="checkbox" id="myCheckbox" />
<div id="myCkEditorBox" contenteditable="true"></div>
Что я пробовал:
- Я попробовал следующий код из ссылки сообщение на форуме, которое фактически полностью отключает задержку размытия:
CKEDITOR.focusManager.prototype.orig_blur = CKEDITOR.focusManager.prototype.blur;
CKEDITOR.focusManager.prototype.blur = function() {
CKEDITOR.focusManager.prototype.orig_blur.call(this,true);
};
Это действительно приводит к немедленному запуску события размытия, но вызывает проблемы с панелью инструментов редактора, из-за чего раскрывающиеся списки на панели инструментов не раскрываются или заставляют стили, примененные через панель инструментов, мерцать, а затем исчезать.
- Я попытался уменьшить задержку размытия до 10 мс следующим образом:
CKEDITOR.focusManager._.blurDelay = 10;
Это также заставляет события срабатывать в желаемом порядке, но кажется плохой идеей вмешиваться во внутренние настройки CKEditor, которым, по-видимому, присваиваются определенные значения по какой-то причине (это верно и для другого подхода, который я тоже пробовал).
Так что я в некоторой растерянности относительно того, что делать. Если бы я знал, что событие размытия находится в пути от определенного элемента управления, я, вероятно, мог бы найти способ дождаться его завершения, прежде чем выполнять действия из других событий. На моей странице может быть одновременно несколько элементов управления CKEditor, поэтому я не думаю, что было бы хорошей идеей заранее активировать события размытия для всех из них и дождаться их завершения, прежде чем выполнять действия из других событий.
Итак, что я могу сделать, чтобы гарантировать, что я буду обрабатывать события размытия CKEditor до событий щелчка, даже если они фактически срабатывают в противоположном порядке?