Parser ignores `parser.optionsHtml.keepEmptyTextNodes` option
Thanks for reporting this, @nanto. Great question about parser ignores parser.optionsHtml.keepEmptyTextNodes option. The recommended approach with StyleManager is to use the event-driven API. Start here: Check the GrapesJS documentation for your specific module Look for the on() event listener method Most operations c...
Read full answer below βQuestion
GrapesJS version
- I confirm to use the latest version of GrapesJS
What browser are you using?
Chrom v140.0.7307.0 (canary)
Reproducible demo link
https://jsfiddle.net/y3gr69s4/
Describe the bug
How to reproduce the bug?
- Create editor instance with
parser.optionsHtml.keepEmptyTextNodesoption settrue.const editor = grapesjs.init({ parser: { optionsHtml: { keepEmptyTextNodes: true, }, }, }); - Load HTML code that contains newlines between elements.
editor.setComponents('<body>\n<p>foo</p>\n<p>bar</p>\n</body>'); - Get HTML code.
const result = editor.getHtml();
What is the expected behavior? The resulting HTML code still contains newlines between elements.
<body>
<p>foo</p>
<p>bar</p>
</body>
What is the current behavior? Newlines between elements are stripped from the resulting HTML code.
<body><p>foo</p><p>bar</p></body>
We get the expected result if we set parser.keepEmptyTextNodes option to true but it causes TypeScript type error. I think that keepEmptyTextNodes should be a property of optionsHtml since it is irrelevant to CSS parser.
const editor = grapesjs.init({
parser: {
// Error: 'keepEmptyTextNodes' does not exist on type 'ParserConfig'
keepEmptyTextNodes: true,
},
});
Code of Conduct
- I agree to follow this project's Code of Conduct
Answers (1)
Thanks for reporting this, @nanto.
Great question about parser ignores parser.optionsHtml.keepEmptyTextNodes option. The recommended approach with StyleManager is to use the event-driven API.
Start here:
- Check the GrapesJS documentation for your specific module
- Look for the
on()event listener method - Most operations can be achieved by listening to editor and component events
Common patterns:
// Listen for changes
editor.on('change', () => console.log('something changed'));
// Component lifecycle
editor.on('component:mount', (c) => console.log('component ready', c));
editor.on('component:update', (c) => console.log('component updated', c));
If you're still stuck:
- Share a minimal CodeSandbox reproduction
- Include what you've already tried
- Mention your GrapesJS version
- The community is here to help!
Related Questions and Answers
Continue research with similar issue discussions.
Issue #4191
We are trying to store the data from grapesJS editor in Angular 10 application, getting CORS error, image attached below
GrapesJS version [x] I confirm to use the latest version of GrapesJS What browser are you using? Chrome 99.0.4844.5 Reproducible demo link...
Issue #6659
Symbol styles not synced
GrapesJS version [x] I confirm to use the latest version of GrapesJS What browser are you using? Firefox 145.0 (64-bit) Reproducible demo l...
Issue #5720
Propagating component defaults can break layers when child comments are introduced
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Chrome v122 Reproducible demo link https:/...
Issue #5425
When add a similar page just components ids will be changed
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? 117 Reproducible demo link https://jsfiddl...
Paid Plugins That Match This Issue
Curated by issue keywords and label relevance to help you ship faster.
Loading paid plugin recommendations...
Check the open-source GrapesJS plugins on GitHub or run a quick search in our free catalog.
Browse free plugins βPremium plugins ship with support, regular updates, and production-ready features β save days of integration work.
Browse premium plugins βRelated tutorials
In-depth guides on the same topic.
Tutorial
π Introducing the New GrapesJS Plugin Generator on GJS.Market
Weβre excited to announce a powerful new tool for GrapesJS developers β the GrapesJS Plugin Generator on GJS.Market!
Tutorial
Integrating GrapesJS into a Vue 3 App β Complete Guide for 2026
Build a Vue 3 landing page builder with GrapesJS and Vite. Custom blocks, composables, remote storage, TypeScript & production tips. Updated for 2026.
Tutorial
How to Build a Drag-and-Drop Page Builder in Angular Using GrapesJS (Step-by-Step Guide + Code)
Build a visual drag-and-drop page builder in Angular with GrapesJS. Learn setup, plugins, and backend saving in this full code guide.
Browse Plugin Categories
Jump directly to plugin category pages on the marketplace.