Issue #6116✓ SolvedOpened September 3, 2024by SamMousa4 reactions

AsDocument not working as expected

Quick answerby SamMousa2

Thank you, but that's not really the point. I'm fully able to make a workaround, but that does not fix the bug. The bug is that an export via getProjectData() followed by an import via loadProjectData() should result in the same state. Furthermore the hack you propose actually writes directly to the canvas meaning tha...

Read full answer below ↓

Question

GrapesJS version

  • I confirm to use the latest version of GrapesJS

What browser are you using?

Chrome 128

Reproducible demo link

https://jsfiddle.net/sammousa/bxgsdc12/11/

Describe the bug

How to reproduce the bug?

  1. Load an HTML string with a non empty <head>, using the option {asDocument: true}.
  2. Export the data via editor.getProjectData(), see that it contains the <head> content
  3. Load the exported data from 2 via editor.loadProjectData()
  4. Export the data via editor.getProjectData(), see that it does NOT the <head> content

What is the expected behavior? I'd expect that this should always hold, maybe with the exception for some details like autogenerated ids.

const html1 = editor.getHtml();
const html2 = editor.loadProjectData(editor.getProjectData());
html1 === html2

What is the current behavior? The head content is not loaded when using loadProjectData().

Code of Conduct

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

Answers (4)

👍 Most helpfulSamMousaSeptember 4, 2024

Thank you, but that's not really the point. I'm fully able to make a workaround, but that does not fix the bug.

The bug is that an export via getProjectData() followed by an import via loadProjectData() should result in the same state.

Furthermore the hack you propose actually writes directly to the canvas meaning that there's no guarantee it will remain untouched. (For example there's a styles configuration in the editor that will inject styles to the canvas' head)

artfSeptember 4, 2024

The bug is that an export via getProjectData() followed by an import via loadProjectData() should result in the same state.

Yeah definitely not expected, we'll look into it.

Appreciate the easily reproducible steps on the demo 👍

artfSeptember 4, 2024

Thanks @SamMousa detailed bug reports are always welcome. If a direction is requested, we're happy to guide you 🙇‍♂️

ClaudeCodeMay 17, 2026

Thanks for reporting this, @SamMousa.

Great question about asDocument not working as expected. The recommended approach with ProseMirror 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.