Problem when dragging component composed by image and link
Hi! I've tested your solution. It does change the image correctly with the image locked inside the main component and you can move it around. The src attribute is changed in the model, but when you move the component he goes back to the placeholder image. If you change the image and then open the View Code modal you w...
Read full answer below βQuestion
GrapesJS version
- I confirm to use the latest version of GrapesJS
What browser are you using?
Brave last version
Reproducible demo link
https://jsfiddle.net/rp7oc96v/1/
Describe the bug
Hi Arthur!
I'm creating a new component, an image inside a link, like the mj-image component, but i'm stuck in one configuration or it's a bug...
How to reproduce the bug?
- drop the block "Link na Imagem"
- when you try to drag the new component from image, grapesjs select the image and not the component root tag (<a>)
- If i need to drag the whole componet, i need to use the icon from toolbar.
What is the expected behavior?
- That children component don't mode without the parent element.
What is the current behavior?
- If the children img element dont' have the attribute
data-gjs-selectable="false"we will move only the image instead of moving the whole component.
Other problems i found In my component, i have configured this:
model:{defaults:{...
resizable: {
ratioDefault: 1
}
...
So, when i drop my new component, the resizer shows up, but, if i click again, with the resizer visible, it hides...
If i put data-gjs-locked="true" or data-gjs-editabble="false" to block everything from image, i can't change it's src with assets manager.
If I put the style pointer-events:none, the event dblclick from component don't fires, the grapesjs keeps clicking on the image π
Also, tried the things we found in these issues: https://github.com/GrapesJS/grapesjs/issues/3014 https://github.com/GrapesJS/grapesjs/issues/2103
Code of Conduct
- I agree to follow this project's Code of Conduct
Answers (4)
Hi!
I've tested your solution. It does change the image correctly with the image locked inside the main component and you can move it around. The src attribute is changed in the model, but when you move the component he goes back to the placeholder image. If you change the image and then open the View Code modal you will see that the src attribute didn't change like in the model. I believe that this is happening because grapes is not setting an id for the image in the exported code.
Check the prints:
Without setting an image when component is dropped:

Changing the image:

Then the view code:

Adding a column and moving the component into:

Here is the updated jsFiddle: https://jsfiddle.net/5er1kmg4/7/
But if you check the image model right after selecting the new image it has the new src value. This is happening with the standard asset manager. Me and @ronaldohoch were able to solve our problem because we use a custom asset manager. But i thought that this could be some bug and was worth to inform you. I hope that this can help.
@gustavohleal my bad, you have to update the src property directly instead of the attribute image.set({ src: asset.getSrc() });
Use the data-gjs-locked="true" property to ignore the image and update properly your custom component
// Remove runCommand("open-assets"); as it doesn't make sense to run it on the model side
// you can activate the component via blocks (https://grapesjs.com/docs/api/block.html#properties)
// by using `activate` property
init(){
editor.runCommand("open-assets");
}
// Handle assets update in the view
view: {
events: {
dblclick: 'onActive',
},
onActive() {
const { model } = this;
editor.Assets.open({
select(asset, complete) {
const image = model.findType('image')[0];
if (image) {
image.addAttributes({ src: asset.getSrc() });
complete && editor.Assets.close();
}
}
});
}
}
Thanks for reporting this, @ronaldohoch.
Great question about Problem when dragging component composed by image and link. 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 #5263
Deleting a component without deleting its corresponding style, will adding new components later cause style conflicts?
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? latest version of Chrome Reproducible demo...
Issue #4897
component:styleUpdate / component:styleUpdate:propertyName not fired
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Edge 109.0.1518.70 Reproducible demo link...
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 #3972
can't drop img inside noscript tag
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Brave VersΓ£o 1.32.106 Chromium: 96.0.4664....
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
Find the Right GrapesJS Plugin in Seconds: Smarter Discovery Is Live
We're shipping a set of discovery upgrades. New label filters, a proper compatibility switch for GrapesJS vs Studio, one-click and a smarter sort bar.
Tutorial
GrapesJS vs Webflow vs Tilda: What to Choose for Your Business in 2026
Choosing the right website platform in 2026 is no longer just about building a site
Tutorial
GJS Market 2.0 - Donations, Tracking, Labels and Better Product Discovery
Weβve rolled out a new set of GrapesJS marketplace updates across GJS Market, focused on improving how creators distribute products
Browse Plugin Categories
Jump directly to plugin category pages on the marketplace.