don't call updatePreview twice for the same input event
This commit is contained in:
parent
68cc033942
commit
9cebf91e28
|
@ -618,14 +618,53 @@ onDOMscriptReady('/codemirror.js').then(() => {
|
||||||
const me = this instanceof Node ? this : $('#editor.livePreview');
|
const me = this instanceof Node ? this : $('#editor.livePreview');
|
||||||
const previewing = me.checked;
|
const previewing = me.checked;
|
||||||
editors.forEach(cm => cm[previewing ? 'on' : 'off']('changes', updatePreview));
|
editors.forEach(cm => cm[previewing ? 'on' : 'off']('changes', updatePreview));
|
||||||
const addRemove = previewing ? 'addEventListener' : 'removeEventListener';
|
const addRemove = EventTarget.prototype[previewing ? 'addEventListener' : 'removeEventListener'];
|
||||||
$('#enabled')[addRemove]('change', updatePreview);
|
addRemove.call($('#enabled'), 'change', updatePreview);
|
||||||
$('#sections')[addRemove]('input', updatePreview);
|
if (!editor) {
|
||||||
|
for (const el of $$('#sections .applies-to')) {
|
||||||
|
addRemove.call(el, 'input', updatePreview);
|
||||||
|
}
|
||||||
|
toggleLivePreviewSectionsObserver(previewing);
|
||||||
|
}
|
||||||
if (!previewing || document.body.classList.contains('dirty')) {
|
if (!previewing || document.body.classList.contains('dirty')) {
|
||||||
updatePreview(null, previewing);
|
updatePreview(null, previewing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Observes newly added section elements and sets an 'input' event listener on .applies-to inside.
|
||||||
|
* The goal is to avoid listening to 'input' on the entire #sections tree,
|
||||||
|
* which would trigger updatePreview() twice on any keystroke -
|
||||||
|
* both for the synthetic event from CodeMirror and the original event.
|
||||||
|
* Side effects:
|
||||||
|
* two expando properties on #sections
|
||||||
|
* 1. __livePreviewObserver
|
||||||
|
* 2. __livePreviewObserverEnabled
|
||||||
|
* @param {Boolean} enable
|
||||||
|
*/
|
||||||
|
function toggleLivePreviewSectionsObserver(enable) {
|
||||||
|
const sections = $('#sections');
|
||||||
|
const observing = sections.__livePreviewObserverEnabled;
|
||||||
|
let mo = sections.__livePreviewObserver;
|
||||||
|
if (enable && !mo) {
|
||||||
|
sections.__livePreviewObserver = mo = new MutationObserver(mutations => {
|
||||||
|
for (const {addedNodes} of mutations) {
|
||||||
|
for (const node of addedNodes) {
|
||||||
|
const el = node.children && $('.applies-to', node);
|
||||||
|
if (el) el.addEventListener('input', updatePreview);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (enable && !observing) {
|
||||||
|
mo.observe(sections, {childList: true});
|
||||||
|
sections.__livePreviewObserverEnabled = true;
|
||||||
|
} else if (!enable && observing) {
|
||||||
|
mo.disconnect();
|
||||||
|
sections.__livePreviewObserverEnabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function updatePreview(data, previewing) {
|
function updatePreview(data, previewing) {
|
||||||
if (previewing !== true && previewing !== false) {
|
if (previewing !== true && previewing !== false) {
|
||||||
if (data instanceof Event && !data.target.matches('.style-contributor')) return;
|
if (data instanceof Event && !data.target.matches('.style-contributor')) return;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user