+
95
-

回答

这样

800_auto

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/grapes.0.21.1.css">
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/grapes.0.21.1.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/grapesjs-preset-webpage.1.0.2.js"></script>
  <style>
    body, html {
      height: 100%;
      margin: 0;
    }
    #gjs {
      border: 3px solid #444;
    }
  </style>
</head>
<body>
  <div id="gjs" style="height:100%;"></div>

  <script>
    document.addEventListener('DOMContentLoaded', function () {
      const editor = grapesjs.init({
        container: '#gjs',
        fromElement: true,
        height: '100%',
        width: 'auto',
        plugins: ['gjs-preset-webpage'],
        pluginsOpts: {
          'gjs-preset-webpage': {}
        }
      });

      // Initial content
      editor.setComponents(`
        <div>
          <p id="selectable-link">Click here to select a link</p>
        </div>
      `);

      const links = [
        { label: 'Google', value: 'https://www.google.com' },
        { label: 'Facebook', value: 'https://www.facebook.com' },
        { label: 'Twitter', value: 'https://www.twitter.com' }
      ];

      // Extend the Component Manager to add a custom trait for href
      editor.Components.addType('link', {
        model: {
          defaults: {
            traits: [
              // Replace href trait with a dropdown
              {
                type: 'select',
                label: 'Href',
                name: 'href',
                options: links.map(link => ({ value: link.value, name: link.label }))
              }
            ]
          }
        }
      });

      // Apply the custom link component type to <a> elements
      editor.DomComponents.addType('link', {
        isComponent: el => el.tagName === 'A',
        model: {
          defaults: {
            tagName: 'a',
            draggable: true,
            droppable: true,
            traits: [
              {
                type: 'select',
                label: 'Href',
                name: 'href',
                options: links.map(link => ({ value: link.value, name: link.label }))
              }
            ]
          }
        }
      });

      // Convert the initial text element to a link component when selected
      editor.on('component:selected', (component) => {
        if (component.getAttributes().id === 'selectable-link') {
          component.set({ tagName: 'a', draggable: true, droppable: true });
          component.addTraits([
            {
              type: 'select',
              label: 'Href',
              name: 'href',
              options: links.map(link => ({ value: link.value, name: link.label }))
            }
          ]);
        }
      });
    });
  </script>
</body>
</html>

网友回复

我知道答案,我要回答