Uncaught SyntaxError: Unexpected token '{' at CanvasView.ts:590:12
that's interesting: defining a separate function and defining the component type as described in the docs works as designed. But it still sounds strange, that an inline function produces a syntax error in the exported HTML...
Read full answer below ↓Question
GrapesJS version
- I confirm to use the latest version of GrapesJS
What browser are you using?
Version 1.56.20 Chromium: 115.0.5790.171 (Offizieller Build) (arm64)
Reproducible demo link
none
Describe the bug
I have a component type with a script
Editor.DomComponents.addType('HTMLView',{
model: {
defaults: {
script () { console.log('Hi!'); runScript.call(this) },
...
When previewing a project using a component of this type, GrapesJS creates the following HTML
<div class="gjs-js-cont"><div data-id="ij6k"><script>
setTimeout(function() {
var item = document.getElementById('ij6k');
if (!item) return;
(function(){
script () {
console.log('Hi!'); runScript.call(this)
;}.bind(item))({})
}, 1);</script></div></div>
If you inspect this output carefully, you will see that the inner script () { is not properly closed.
I've already tried to find some workarounds but did not succeed yet. But I will try further as this problem turns out to be a blocker...
Code of Conduct
- I agree to follow this project's Code of Conduct
Answers (3)
that's interesting: defining a separate function
function script () { console.log('Hi!'); runScript.call(this) }
and defining the component type as described in the docs
Editor.DomComponents.addType('HTMLView',{
model: {
defaults: {
script,
...
works as designed.
But it still sounds strange, that an inline function produces a syntax error in the exported HTML...
@rozek good catch, will fix for the next release
Thanks for reporting this, @rozek.
The issue with Uncaught SyntaxError: Unexpected token '{' at CanvasView.ts:590:12 appears to be a race condition or state management timing problem. This typically happens when component lifecycle events and DOM modifications overlap, creating an inconsistent state.
What to try:
- Add a setTimeout wrapper to ensure the DOM has settled:
setTimeout(() => {
// your operation here
}, 0);
-
Check initialization order — make sure components are fully loaded before you interact with them
-
Use the editor's event system — listen to completion events:
editor.on('component:mount', (component) => {
// safe to interact with component here
});
Recommended next steps:
- Test with the latest GrapesJS version if you haven't
- Provide a minimal reproducible example (CodeSandbox) — this helps the team identify the root cause faster
- Include GrapesJS version, browser, and console errors in your report
Related Questions and Answers
Continue research with similar issue discussions.
Issue #5362
draggable/droppable property functions not called while dragging
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Version 1.56.20 Chromium: 115.0.5790.171 (...
Issue #5354
canvas.script entries do not respect an "import map"
GrapesJS version[X] I confirm to use the latest version of GrapesJSWhat browser are you using? Version 1.56.20 Chromium: 115.0.5790.171 (Of...
Issue #5353
canvas.script entries can not be JS modules
GrapesJS version[X] I confirm to use the latest version of GrapesJSWhat browser are you using? Version 1.56.20 Chromium: 115.0.5790.171 (Of...
Issue #5363
cannot "sort" elements of layer panel
GrapesJS version[X] I confirm to use the latest version of GrapesJSWhat browser are you using? Version 1.56.20 Chromium: 115.0.5790.171 (Of...
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
How to Build a Production GrapesJS Editor: The Complete Walkthrough of Brief, Preset, Plugins, and Services
A complete walkthrough of building a production GrapesJS editor: how to choose a preset, pick plugins, and scope setup services without burning a sprint.
Tutorial
Embed GrapesJS in Your SaaS: A Weekend Guide
Embed GrapesJS in your SaaS and ship a white-label page builder over a weekend. Honest tradeoffs, real code, and the plugins that close the UX gap.
Tutorial
Big Updates: TinyMCE 8 and Placeholder 2.0 for GrapesJS
In May we shipped major updates to two of our most popular GrapesJS plugins — TinyMCE Inline Text Editor and Placeholder.
Browse Plugin Categories
Jump directly to plugin category pages on the marketplace.