javascript - 使用 vanilla JS 的 chrome ext 中的 Accordion

标签 javascript html google-chrome-extension

我希望在 chrome ext 中创建一个简单的 Accordion 来显示数据。我正在使用following JS tutorial但我似乎很难注册点击。

我使用以下方法返回了一些数据:

//background.js

...

 // Looping through object's key value pair to place into divs
  for (const [key, value] of Object.entries(params)) {
    queryParams += `
      <div class="text-sm my-1">
        <span class="font-bold uppercase mr-1">${key}: </span><span class="font-normal font-mono capitalizev c-word-wrap">${value}</span>
      </div>
    `;
  }

return (completeData += `
    <div class="element my-3">

      <div id="click-parent" class="question flex justify-between px-6 py-4 bg-purple-500">
        <span class="text-base text-white font-bold">${pixelType}</span>
        <button id="click-btn">
          <i class="fas fa-plus-circle"></i>
        </button>
      </div>

<!-- OR -->
<div  class="question flex justify-between px-6 py-4 bg-purple-500">
        <span class="text-base text-white font-bold">${pixelType}</span>
        <button id="click-parent">
          <i id="click-btn" class="click-btn fas fa-plus-circle"></i>
        </button>
      </div>
<!-- end of other example -->

      <div class="answer hideText">
        <span id="pixel-url" class="c-word-wrap text-sm font-mono">${pixelUrl}</span>
          <span id="query-params">${queryParams}</span>
      </div>

    </div>
 
  `);
...

然后我将逻辑放在一个单独的文件中

//popup.js

document.addEventListener('DOMContentLoaded', function () {
  // get data
  document.getElementById('getCurrentURL').addEventListener('click', function () {
    chrome.runtime.sendMessage({}, function (response) {
      document.getElementById('data').innerHTML = response;
    });
  });

  // accordion code
  const elements = document.querySelectorAll('.element');

  elements.forEach((element) => {
    let btn = element.querySelector('.question button');
    let icon = element.querySelector('.question button i');
    var answer = element.lastElementChild;
    var answers = document.querySelectorAll('.element .answer');

    btn.addEventListener('click', () => {
      alert('clicked ');
      console.log('clicked');

      answers.forEach((ans) => {
        let ansIcon = ans.parentElement.querySelector('button i');
        if (answer !== ans) {
          ans.classList.add('hideText');
          ansIcon.className = 'fas fa-plus-circle';
        }
      });

      answer.classList.toggle('hideText');
      icon.className === 'fas fa-plus-circle'
        ? (icon.className = 'fas fa-minus-circle')
        : (icon.className = 'fas fa-plus-circle');
    });
  });
});

我正在像这样加载我的脚本......

popup.html

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="../main.css"/>

    <!-- TailWind CSS -->
    <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
  </head>
  <body class="flex flex-col min-h-screen">

    <main class="main flex-grow">

        <h1 class="text-center py-2 text-xl font-bold">HCP365 Debugger</h1>

        <section>
          <div id="data" class=""></div>
        </section>

    </main>

    <footer class="mb-4">
      <div class="flex justify-center">
        <button id="getCurrentURL" type="button" class="text-center text-base py-4 px-14 text-white font-bold drop-shadow bg-purple-500 capitalize outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150 hover:bg-purple-800">get url</button>
      </div>
    </footer>

    <!-- Scripts -->
    <script src="popup.js"></script>
    <script src="../background.js"></script>
    <!-- Accordion -->
    <script src="../fa.js"></script>
    <script src="../accordion.js"></script> 
  </body>
</html>

如果有人能指导我哪里出错了,那就太好了。我还尝试在 chrome ext 之外复制该教程,效果非常好

文件结构

.
├── README.md
├── accordion.js
├── background.js
├── fa.js
├── images
│   ├── icon_128.png
│   ├── icon_16.png
│   ├── icon_32.png
│   └── icon_48.png
├── main.css
├── manifest.json
└── popup
    ├── popup.html
    └── popup.js

更新

我找到了一个存储库,其中有人创建了一个简单的计算。在他们的 popup.js 中,他们有类似的东西

document.getElementById('clickBtn').addEventListener('click', () => {
    document.getElementById('textChange').innerHTML = 'hello i was clicked';
  });

我在 popup.html 中有一个 div 以及按钮。当我点击它时效果很好。

我继续像这样添加它......

document.addEventListener('DOMContentLoaded', function () {
  document.getElementById('getCurrentURL').addEventListener('click', function () {
    chrome.runtime.sendMessage({}, function (response) {
      document.getElementById('data').innerHTML = response;
    });
  });

  // new code here --------------------------------
  document.getElementById('btn').addEventListener('click', () => {
    document.getElementById('textChange').innerHTML = 'hello i was clicked';
  });
  // end ---
});

使用动态按钮...但不起作用!现在这令人沮丧......至少我们知道这是动态内容的问题。

最佳答案

仅在 DOMContent 完全加载后,您可能需要将监听器添加到文档中。对于动态元素,您可能必须在元素的容器上添加 onClick 监听器

参见下面的示例:

// wait for the DOM to be loaded
document.addEventListener('DOMContentLoaded', function() {

  var checkPageButton = document.getElementById('checkPage');

  // add listener only after DOM loaded
  checkPageButton.addEventListener('click', function() {
    alert('clicked');
  }, false);
}, false);
<!doctype html>
<html>

<head>
  <title>Tester</title>
  <script src="popup.js"></script>
</head>

<body>
  <h1>Tester</h1>
  <button id="checkPage">Test this now!</button>
</body>

</html>

关于javascript - 使用 vanilla JS 的 chrome ext 中的 Accordion ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70189751/

相关文章:

javascript - 来自 JS 事件的 AngularDart CustomEvent 监听器

javascript - 我如何编写一个时钟来显示一天还剩多少时间?

java - Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有元素

javascript - 带有 chrome 扩展的 Google 表格 API,如何使用?

javascript - 通过 chrome 选项卡发送鼠标移动

javascript - 页面底部的粘性页脚问题

javascript - 如何防止线条的边缘像素半透明?

javascript - React Router V4 - 路由更改的初始状态

html - 在不中断文本流的情况下清除 IE7 中的 float

css - 是否有浏览器扩展来获取应用于 DOM 元素的所有 CSS?