handlerCreateElement.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import handleSelector from '../handleSelector';
  2. const positions = {
  3. after: 'beforeend',
  4. before: 'afterbegin',
  5. 'next-sibling': 'afterend',
  6. 'prev-sibling': 'beforebegin',
  7. };
  8. function createNode(tag, attrs = {}, content = '') {
  9. const element = document.createElement(tag);
  10. Object.keys(attrs).forEach((attr) => {
  11. element.setAttribute(attr, attrs[attr]);
  12. });
  13. element.innerHTML = content;
  14. return element;
  15. }
  16. async function createElement(block) {
  17. const targetElement = await handleSelector(block);
  18. if (!targetElement) throw new Error('element-not-found');
  19. const { data, id } = block;
  20. const baseId = `automa-${id}`;
  21. if (data.insertAt === 'replace') {
  22. const fragments = createNode('template', {}, data.html);
  23. targetElement.replaceWith(fragments.content);
  24. } else {
  25. targetElement.insertAdjacentHTML(positions[data.insertAt], data.html);
  26. }
  27. if (data.css) {
  28. const style = createNode('style', { id: `${baseId}-style` }, data.css);
  29. document.body.appendChild(style);
  30. }
  31. if (data.injectJS) {
  32. data.preloadScripts.forEach((item) => {
  33. const script = document.createElement(item.type);
  34. script.id = `${baseId}-script`;
  35. script.textContent = item.script;
  36. document.body.appendChild(script);
  37. });
  38. const script = document.createElement('script');
  39. script.id = `${baseId}-javascript`;
  40. script.textContent = `(() => { ${data.automaScript}\n${data.javascript} })()`;
  41. document.body.appendChild(script);
  42. }
  43. return true;
  44. }
  45. export default createElement;