如何在JS中创建带有引导下拉菜单的shadowDOM

问题描述 投票:0回答:1

我正在创建一个 chrome 扩展,我需要将 bootstrap 提供的分割按钮添加为 ShadowDOM。但我找不到任何明确的文档。有人可以告诉我如何创建一个 ShadowDOM 来注入 bootstrap css、js 和 popper js 文件吗?

我已经尝试过如下,但按钮不可见。

const shadowHost = document.getElementById('my-shadow-host');
const shadowRoot = shadowHost.attachShadow({ mode: 'open' });

  // Bootstrap button and dropdown menu HTML
const bootstrapButtonAndDropdown = `
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <div class="btn-group">
    <button type="button" class="btn btn-primary">Bootstrap Button</button>
    <button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
      <span class="sr-only">Toggle Dropdown</span>
    </button>
    <div class="dropdown-menu">
      <a class="dropdown-item" href="#">Action</a>
      <a class="dropdown-item" href="#">Another action</a>
      <a class="dropdown-item" href="#">Something else here</a>
      <div class="dropdown-divider"></div>
      <a class="dropdown-item" href="#">Separated link</a>
    </div>
  </div>
`;

  // Append Bootstrap components to the shadow root
  shadowRoot.innerHTML = bootstrapButtonAndDropdown;

  // Add an event listener to the button inside the Shadow DOM
  const buttonInsideShadowDom = shadowRoot.querySelector('.btn-primary');
  buttonInsideShadowDom.addEventListener('click', () => {
    alert('Button inside Shadow DOM clicked!');
  });

class SplitButton extends HTMLElement {
  constructor() {
    super();
    this.render();
  }

  render() {
    this.attachShadow({ mode: "open" });
    this.shadowRoot.innerHTML += template;
  }
}

window.customElements.define("split-button", SplitButton);

调用分割按钮

const button = document.createElement('split-button');

但是按钮返回 null。

javascript css twitter-bootstrap bootstrap-4 shadow-dom
1个回答
0
投票

我重构了你的代码;应该是不言自明的 请注意,您不会添加多个监听器,因此不需要

addEventListener

<split-button></split-button>
<script>
  customElements.define("split-button", class extends HTMLElement {
    constructor() {
      super().attachShadow({
        mode: "open"
      }).innerHTML = `<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <div class="btn-group">
    <button type="button" class="btn btn-primary">Bootstrap Button</button>
    <button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
      <span class="sr-only">Toggle Dropdown</span>
    </button>
    <div class="dropdown-menu">
      <a class="dropdown-item" href="#">Action</a>
      <a class="dropdown-item" href="#">Another action</a>
      <a class="dropdown-item" href="#">Something else here</a>
      <div class="dropdown-divider"></div>
      <a class="dropdown-item" href="#">Separated link</a>
    </div>
  </div>`;
      this.shadowRoot.querySelector('.btn-primary').onclick = () => alert('Button inside Shadow DOM clicked!');
    }
  });

</script>

© www.soinside.com 2019 - 2024. All rights reserved.