Issue #2508💬 AnsweredOpened January 14, 2020by alexiswbr1 reactions

Draggable property added in the final HTML text components

快速解答by artf1

Ok I'll try to check this out

Read full answer below ↓

Question

This bug is also on the online demo : https://grapesjs.com/demo.html

  1. Add a Text Block to the page, start typing and hiting enter to make several break lines.
  2. Unselect the block.
  3. Double click on the block to start editing again.

Now if you click on the "view code" button, you will see that the HTML nodes inside the Text Block have some draggable="true attributes. This always occure at step three. The first time you edit the text and add break lines, everything is fine, as long as you do not want to edit the block again later.

The problem is, in the final HTML displayed on a website, these attributes are still there. You can not select anything because the navigator interpreting the draggable attributes. And yes I am saving in database both of the html and components separately

It seems like a bug to me, or I misunderstood something else

draggable-html-bug-1 draggable-html-bug-2

Answers (3)

artfJanuary 18, 2020

Ok I'll try to check this out

pouyamiralayiJanuary 14, 2020

@alexiswbr using the below snippet, the div's will become br's as the expected behaviour:

var iframeBody = editor.Canvas.getBody();
	$(iframeBody).on("keydown", "[contenteditable]", e => {
		// trap the return key being pressed
		if (e.keyCode === 13) {
				e.preventDefault();
				// insert 2 br tags (if only one br tag is inserted the cursor won't go to the next line)
				e.target.ownerDocument.execCommand("insertHTML", false, "<br><br>");
				// prevent the default behaviour of return key pressed
				return false;
		}
	});
obrazkowJanuary 14, 2020

I use such way to prevent transformation to component and keep original html. Just override component that you need, for example text or create new.

Maybe it's not good solution, but it works :)

export default (editor, type) => {
    const comps = editor.DomComponents;

    const typeToExtend = comps.getType(type);
    const modelToExtend = typeToExtend.model;

    comps.addType(type, {
        model: modelToExtend.extend({
            init() {
                if (modelToExtend.prototype.init) {
                    modelToExtend.prototype.init.apply(this, arguments);
                }

                const models = this.components().models;
                if (models.length) {
                    const elem = models.reduce((content, component) => {
                        content.append(component.get('rawContent') || component.get('content'));
                        return content;
                    }, document.createElement('div'));

                    for (let i = models.length; i !== 0; i--) {
                        models[i - 1].remove();
                    }

                    this.set({content: elem.innerHTML});
                }
            }
        }, {
            isComponent(el) {
                if (el && el.parentElement && el.parentElement.dataset && el.parentElement.dataset.gjsType === type) {
                    return {
                        type: type,
                        content: el,
                        rawContent: el,
                        tagName: 'raw_html'
                    };
                }

                return false;
            }
        }),

        view: typeToExtend.view
    });
}

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.