在Chrome扩展选项页面中单击不起作用的事件

Click event not working in Chrome extension options page

本文关键字:单击 不起作用 事件 Chrome 扩展 选项      更新时间:2023-09-26

在我的选项页面中,我生成了一些带有输入数字和按钮的行,这些行与chrome存储中的条目有关。

问题是我为按钮创建的事件监听器根本不起作用。

options.html

<html>
<head>
    <title>Select the movie's Id</title>
    <style>
        body: { padding: 10px; }
        .style-1 input[type="number"] {
          padding: 10px;
          border: solid 1px #dcdcdc;
          transition: box-shadow 0.3s, border 0.3s;
          width: 5em;
        }
        .style-1 input[type="number"]:focus,
        .style-1 input[type="number"].focus {
          border: solid 1px #707070;
          box-shadow: 0 0 5px 1px #969696;
        }
    </style>
</head>
<body>
    <legend style="border-bottom: solid 1px">Insert</legend>
    <input type="number" name="id" id="id" value="">
    <button id="save">Insert</button>
    <br>
    <br>
    <legend style="border-bottom: solid 1px">Manage</legend>
    <div id="ghost" style="display: none">
        <input type="number" name="VAL">
        <button name="DEL" id="" >Delete</button>
        <br><br>
    </div>
    <script src="options.js"></script>
</body>

options.js

document.getElementById('save').addEventListener('click', save_options);
chrome.storage.sync.get('movieId', function(result){
    for (var i=0; i<result.movieId.length; i++){
       createRow(result.movieId[i]); 
    }
});
function save_options() {
    var id = document.getElementById('id').value;
    chrome.storage.sync.get('movieId', function(result){
        var ids = result.movieId;
        ids.push(id);
        chrome.storage.sync.set({
            'movieId': ids
        }, function() { 
        });
        location.reload();
    });    
}
function createRow(pos){
    var newRows= document.getElementById('ghost').cloneNode(true);
    newRows.id= '';
    newRows.style.display= 'block';
    var newRow= newRows.childNodes;
    for (var i= 0; i< newRow.length; i++){
        var newName= newRow[i].name;
        if (newName){
            newRow[i].name = newName+pos;
            newRow[i].id = pos;
            newRow[i].value = pos;
        }
    }
    var insertHere= document.getElementById('ghost');
    insertHere.parentNode.insertBefore(newRows,insertHere);
    document.getElementById(pos).addEventListener('click', delet());
}
function loop(arrayIds){
    console.log('loop');
    for (var i=0; i<arrayIds.length; i++){
        createRow(i);
    }
}
function delet(){
    console.log("this.id");
    //chrome.storage.sync.remove(id);
}

这样,当我单击任何"删除"按钮时,都不会发生任何事情。

我已经尝试了document.getElementById(pos).addEventListener('click', delet());的所有组合,但都不起作用。

document.getElementById(pos).addEventListener('click', delet());

应该是

document.getElementById(pos).addEventListener('click', delet);

在您的代码段中,您正在调用delet,因此该函数的结果被添加为事件侦听器,即undefined。如果要将delet绑定为事件处理程序,请将其传递给addEventListener而不调用它

编辑

正如我看到的代码一样,您为inputbutton提供了相同的id,当您调用document.getElementById时,它返回的是input而不是button,因此,事件绑定到input而不是button

要修复此问题,请用此替换您的createRow

function createRow(pos) {
    var newRow = document.getElementById('ghost').cloneNode(true);
    newRow.id= '';
    newRow.style.display= 'block';
    var value = newRow.querySelector("[name=VAL]");
    var button = newRow.querySelector("[name=DEL]");
    value.id = "VAL" + pos;
    value.value = pos;
    button.id = "DEL" + pos;
    var insertHere= document.getElementById('ghost');
    insertHere.parentNode.insertBefore(newRow, insertHere);
    button.addEventListener('click', delet);
}