这样
<!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>
网友回复