点击事件无法在Chrome扩展程序选项页面中使用

时间:2016-03-29 13:30:42

标签: javascript google-chrome google-chrome-extension

在我的选项页面中,我生成了一些带有输入编号和按钮的行,与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());我能想到的所有组合,但没有一种能够发挥作用。

1 个答案:

答案 0 :(得分:0)

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);
}