Froala Editor: Insert Into Caret Position When Clicking A Div
Solution 1:
It looks like you are loosing the context of caret. I had the same problem (Even in V3) where in i had to click an external button which would open a popup and in the popup user would select a html template which had to be inserted into the last known caret postilion.
What i did was save the caret position using selection save, open popup, get the text and restore the selection and then do html.insert
1) First save the selection
// Call this before doing any kind of insert operation
editor.selection.save();
2) Restore the selection and then insert html
// Restore the selection
editor.selection.restore();
editor.html.insert(data.Body);
Hope this helps
Solution 2:
It looks you have an external button there. For that the editor has a built-in mechanism, highlighted in a demo. In your case it would be something like this:
$('#template_editor')
.on('froalaEditor.initialized', function (e, editor) {
editor.events.bindClick($('body'), 'div.variable', function (ev) {
var that = ev.originalEvent && ev.originalEvent.originalTarget;
editor.html.insert($(that).data('value'));
});
})
.froalaEditor()
Solution 3:
I had the same problem. My scenario was: click inside the editor -> click on a toolbar button -> modify editor content inside a dialog -> save modified content into the editor. The editor was loosing context while working in the dialog. I fixed it by placing a marker at the beginning of work .froalaEditor('html.insert', '{MARKER}') and use the marker afterwards to know the last caret position.
Or you can use selection.save and selection.restore methods: https://www.froala.com/wysiwyg-editor/examples/selection
Solution 4:
In case someone is looking information about Froala v3 and with React I had this exactly some problem and couldn't get it work how I wanted. Froala always creates newline before inserting html. My problem is probably related to opening a custom modal through plugin method so then Froala loses context. Here are some fixes I tried:
Inside custom plugin save the cursor position using: this.selection.save();
Then try first if this solves your problem, if not please follow along. Before inserting the HTML restore selection insert html and undoSavestep to get Froala update.
this.selection.restore();
this.html.insert(html);
this.undo.saveStep();
Full example in React:
Froala.RegisterCommand('customcommand', {
title: mytitle,
focus: true,
undo: true,
refreshAfterCallback: true,
callback(_, val) {
this.selection.save();
returndisplayDialog((removeDialog) => ({
children: (
<DialogComponentremoveDialog={removeDialog}submit={(html) => {
removeDialog();
this.selection.restore();
this.html.insert(html);
}}
/>
),
}));
},
If this doesn't help then you can try putting it inside promise example of callback:
callback: function () {
this.selection.save();
let result = newPromise((resolve) => {
displayDialog((removeDialog => ({
children: (
<DialogComponentremoveDialog={removeDialog}submit={(html) => {
removeDialog();
resolve(html);
}}
/>
),
})));
});
result.then((html) => {
this.selection.restore();
this.html.insert(html);
this.undo.saveStep(); // Make froala update https://github.com/froala/wysiwyg-editor/issues/1578
});
This is the closest thing I have got so far. This appends the element almost to the correct position. I just don't understand why the caret position doesn't stay in place and Froala always appends to the bottom of the editor. If anyone else has better ideas I am looking for answer as well.
Post a Comment for "Froala Editor: Insert Into Caret Position When Clicking A Div"