Keyboard shortcuts/Keymaps not working
You were right, it wasn't React or GrapesJS. Event propagation was being stopped by the rc-drawer component I was using. @artf thanks for your help, this has been an issue from day one.
Read full answer below ↓Question
Version: 0.17.22
Are you able to reproduce the bug from the demo?
- Yes
- No
I can't reproduce it in a demo however you can see it for yourself if log into Documint using the following credentials:
- Email: [email protected]
- PW: demo
then make a change to the template and try using ctrl+z
What is the expected behavior? Should be able to use mapped keyboard shortcuts (ie. ctrl+z) but they don't work.
What is the current behavior?
The keymaps are registered but they don't work. When I run keymaps.getAll() I get a list of all of the default keymaps. When I listen for a keymap to be emitted I get nothing. When I add a custom keymap (eg. alt+u) either through the config or adding it on init it doesn't fire either.
I'm really at a loss. Can anyone please help?
Are you able to attach screenshots, screencasts or a live demo?
- Yes (attach)
- No
Answers (4)
You were right, it wasn't React or GrapesJS. Event propagation was being stopped by the rc-drawer component I was using. @artf thanks for your help, this has been an issue from day one.
Hey @Joshmamroud we have this code that propagates keydown keyup keypress events to the parent document, this allows keymaps to work, ensure to not contain any code/component which prevents the propagation of those events.
Hey @artf, I believe it may be blocked by React. Any suggestions on how to re-bind these event listeners? Not even sure if that is the right solution or path.
Thanks for reporting this, @Joshmamroud.
The issue with Keyboard shortcuts/Keymaps not working 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 #3731
Text element not able to be selected twice after extended with events
Version: 0.17.25 Are you able to reproduce the bug from the demo?[ ] Yes[x] No What is the expected behavior? Update a existing component o...
Issue #4416
Can't parse trait values using Template literals(String Interpolation)
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Chrome v103.0.5060.53 Reproducible demo li...
Issue #6695
Prevent default not working for edge
GrapesJS version [x] I confirm to use the latest version of GrapesJS What browser are you using? Edge 144.0.3719.92 Reproducible demo link...
Issue #5159
Can't add placeholders drop down to text field drop down options with CKEditor enabled
GrapesJS version[X] I confirm to use the latest version of GrapesJSWhat browser are you using? ChromeReproducible demo link https://codepen...
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.
Browse Plugin Categories
Jump directly to plugin category pages on the marketplace.