Issue #5689πŸ’¬ AnsweredOpened February 20, 2024by mitcht0 reactions

<> is introduced at the beginning editor.getHtml()

Quick answerby mitcht

I whittled the json down a quite a bit, and noticed there is some possibly invalid JSON being generated as output? Its like the introduction of the escaped double quotes is off slightly. JSON.stringify and JSON.parse don't seem to care about it, but theres something going on.

Read full answer below ↓

Question

GrapesJS version

  • I confirm to use the latest version of GrapesJS

What browser are you using?

Chrome Version 121.0.6167.185 (Official Build) (64-bit)

Reproducible demo link

https://jsfiddle.net/ja50kzne/4/

Describe the bug

How to reproduce the bug?

  1. I had a webpage from a previous version of grapesJS that loads into grapes correctly. You can see this in the fiddle. The latest version of GrapesJS "created" the JSON seen in the fiddle. I did not manipulate it.
  2. Notice that grapesJS does load, no errors in the console.
  3. When performing editor.getHtml (for db storage), I see that there is an empty element <> being introduced
  4. Note the console.log

What is the expected behavior? I expect to not see <> at the start of the string from editor.getHtml()

What is the current behavior? I see <> upon using .editor.getHtml()

I want to reiterate that I have not messed with the JSON. If there is something in there, it was generated by a previous version of grapesJS.

If is necessary to execute some code in order to reproduce the bug, paste it here below:

See fiddle https://jsfiddle.net/ja50kzne/4/

Code of Conduct

  • I agree to follow this project's Code of Conduct

Answers (4)

mitchtβ€’ February 20, 2024

I whittled the json down a quite a bit, and noticed there is some possibly invalid JSON being generated as output?

"components":[
                     {
                        "name":"Row",
                        "droppable":".cell",
                        "resizable":{
                           "tl":0,
                           "tc":0,
                           "tr":0,
                           "cl":0,
                           "cr":0,
                           "bl":0,
                           "br":0,
                           "minDim":1
                        },
                        "classes":[
                           "row"
                        ],
                        "attributes":{
                           "id":"ik4zj"
                        }
                     },
                     {
                        "type":"text",
                        "content":"<p style=\\""text-align":"center;\\""><em>With special appreciation for our <a href=\\""https":" target=\\""_blank\\"">Major Sponsors</a>:</em></p>\\n",
                        "attributes":{
                           "id":"in5ko"
                        }
                     }
                  ]

Its like the introduction of the escaped double quotes is off slightly. JSON.stringify and JSON.parse don't seem to care about it, but theres something going on.

artfβ€’ February 21, 2024

The root component of the page should be a wrapper, in your case is a textnode (eg. this might break a lot of stuff), with an empty tagName (the reason behind <>) and for some reason content: "undefined"(?) <img width="377" alt="Screenshot 2024-02-22 at 00 44 33" src="https://github.com/GrapesJS/grapesjs/assets/11614725/0e76b02e-097b-463f-a921-33250850e3f2"> I wouldn't even expect it to load but the editor is making some slight enforcements on the root component but type and tagName are extendable so can not be enforced.

Can't really help here, I can only suggest updating the JSON manually or via script. This doesn't seem to be a behavior of any previous version, so might also be related to some custom code.

mitchtβ€’ February 21, 2024

This is what was coming out of Grapes 0.18.4, therefor it was generated by grapes. I would expect if content was "undefined", grapes would either strip it or ignore it. For now i'm just stripping the <> out on my end, but I thought I'd just share it with you.

ClaudeCodeβ€’ May 17, 2026

Thanks for reporting this, @mitcht.

Great question about <> is introduced at the beginning editor.getHtml(). The recommended approach with GrapesJS is to use the event-driven API.

Start here:

  1. Check the GrapesJS documentation for your specific module
  2. Look for the on() event listener method
  3. 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.

Paid Plugins That Match This Issue

Curated by issue keywords and label relevance to help you ship faster.

View all plugins

Loading paid plugin recommendations...

Free option

Check the open-source GrapesJS plugins on GitHub or run a quick search in our free catalog.

Browse free plugins β†’
Premium option

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.

All tutorials β†’

Browse Plugin Categories

Jump directly to plugin category pages on the marketplace.