【问题标题】:TamperMonkey EventListener on button not working按钮上的 TamperMonkey EventListener 不起作用
【发布时间】:2021-05-31 04:21:57
【问题描述】:

我创建了这个 sn-p:

function addClick(button, container) {
    console.log("In add click");
    const data = container.nextElementSibling.childNodes[0].innerHTML;
    button.addEventListener('click', ()=>{
        alert('clicked')
        console.log("Clicked");
    })
}

function createCopyButtons(array){
    array.forEach(element => {

        const container = document.createElement('div');
        const button = document.createElement('button');

        button.innerHTML = "Copy"
        
        styleContainer(container);
        styleButton(button, element);
        stylePrevious(element);
        
        container.innerHTML = element.outerHTML + button.outerHTML;

        element.parentNode.replaceChild(container, element);

        addClick(button, container); 

    });
}

现在这里的数组是我希望应用此属性的 DOM 元素数组,我调用 createCopyButtons() 函数并添加更多内容。现在的问题是这个事件监听器不适用或不起作用。我试图等到这些答案加载了文档,然后才应用我的 javascript sn-p 但事件侦听器似乎不起作用。

document.addEventListener("DOMContentLoaded", function(event) { 
  //do work
});

if (document.readyState == "complete") {
     // document is ready. Do your stuff here
   }

请帮忙。

【问题讨论】:

    标签: javascript dom event-listener tampermonkey


    【解决方案1】:

    更新:

    function addClick(button) {
        button.addEventListener('click', ()=>{
            console.log("Clicked");
        })
    }
    
    let p = document.querySelectorAll('p');
    
    // innerHTML not work
    let btn1 = document.createElement('button');
    btn1.innerHTML = "Not work";
    p[0].innerHTML = btn1.outerHTML;
    addClick(btn1)
    
    // work
    let btn2 = document.createElement('button');
    btn2.innerHTML = "work";
    p[1].appendChild(btn2);
    addClick(btn2)
    <p></p>
    <p></p>

    因为您使用字符串 (.innerHTML) 而不是 DOM 或使用 appendChild() 将按钮附加到容器

    container.innerHTML = element.outerHTML + button.outerHTML
    

    以下函数不会应用事件

    addClick(button, container);
    

    我不知道为什么你需要将目标元素和按钮包装在div 中,为什么不直接在目标元素之后使用或insertBefore()insertAdjacentHTML() 附加按钮,但下面是你的工作代码。

    它在container 中找到按钮,用作addClick() 参数

    function addClick(button, container) {
      console.log("In add click");
      const data = container.nextElementSibling.childNodes[0].innerHTML;
    
      button.addEventListener('click', () => {
        alert('clicked')
        console.log("Clicked");
      })
    }
    
    function createCopyButtons(array) {
      array.forEach(element => {
    
        const container = document.createElement('div');
        let button = document.createElement('button');
    
        button.innerHTML = "Copy"
    
        container.innerHTML = element.outerHTML + button.outerHTML;
    
        element.parentNode.replaceChild(container, element);
    
        let btn = container.querySelector('button'); // <== find the button
        addClick(btn, btn.parentNode);
    
      });
    }
    createCopyButtons(document.querySelectorAll('input'))
    <div>
      <input type="text">
      <p><span>test</span></p>
    </div>

    【讨论】:

    • 先生,这不像我在容器上添加了按钮,然后添加到 DOM,然后我已经引用了对象按钮,所以我获取该引用并设置属性 onclick?为什么错了?
    • 再次阅读我回答中的第一段,换句话说,您需要像 container.appendChild(button) 这样才能使 addClick(button, container); 工作
    • 对不起,我还是不明白。如果我把它作为一个内部 html 并绑定一个事件监听器那我做错了什么?
    • 如果你把它作为 innerHTML 它只复制元素的文本而不是事件侦听器。答案已更新,我在上面添加了示例
    • 啊,我明白了。谢谢先生。
    猜你喜欢
    • 2019-01-23
    • 2022-01-11
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2014-07-22
    • 2023-03-11
    相关资源
    最近更新 更多