如何将EventListener添加到表格单元格 [英] How to addEventListener to table cells

查看:22
本文介绍了如何将EventListener添加到表格单元格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向表格单元格添加一个事件监听器,以便每次单击表格单元格执行一个函数.

var getDaysInMonth = function (year, month) {返回新日期(年,月,0).getDate();}var 日历 = {月份:函数(){var d = 新日期();返回 d.getMonth() + this.nextMonth;},年:函数(){var y = 新日期();返回 y.getFullYear();},下个月:1,cellColor: '白色',}var loopTable = function () {var daysInMonth = getDaysInMonth(calendar.year(), calendar.month());var table = document.getElementById('myTable');var 行 = table.rows;无功l = 1;var 月份 = calendar.month();var year = calendar.year();var firstDay = new Date(year + "-" + month).getDay();var currentDay = new Date().getDay();var dayOfMonth = new Date().getDate();for (让 i = 1; i < rows.length; i++) {如果(行 [i] == 行 [1]){无功k = 1;for (let j = firstDay; j 

body {背景颜色:rgb(0, 121, 191);}桌子 {宽度:50%;背景颜色:#D9534F;边框:1px纯白色;填充:10px;填充底部:20px;字体大小:25px;边框半径:25px;位置:相对;保证金:自动;}TD{边框:1px纯白色;文本对齐:居中;字体粗细:600;字体大小:20px;填充:20px;}第 {高度:50px;}.calArrows {文字装饰:无;白颜色;字体大小:35px;}#nxt {字体大小:30px;位置:绝对;顶部:0;正确:25%}#prev {字体大小:30px;位置:绝对;顶部:0;左:25%;}#calendarTitle {font-family: '独立花',草书;字体粗细:600;字体大小:25px;白颜色;}.inactiveLink {游标:不允许;指针事件:无;}#myTable {空单元格:隐藏;}.xmasDec {宽度:90%;高度:70%;位置:绝对;前10名%;左:5%;}#calWraper {位置:相对;}#myCan {位置:绝对;顶部:0;左:10%;宽度:90%;高度:70%;不透明度:0、5;}

<canvas class="myCan" width="100" height="100"></canvas><div id="calWraper"><table id="myTable"><caption id="calendarTitle">测试</caption><tr><th>Sun</th><th>周一</th><th>周二</th><th>周三</th><th>星期四</th><th>周五</th><th>周六</th></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td></tr><canvas id="myCan" width="200" height="200" style="background-color: transparent"></canvas><a href="#" id="prev" class="calArrows"><i class="fa fa-arrow-left" ></i></a><a href="#" id="nxt" class="calArrows"><i class="fa fa-arrow-right" ></i></a>

</html>

我尝试通过创建一个函数来循环遍历行和单元格并将 eventListener 添加到每个 .但它似乎不起作用,它在随机实例上工作,这真的很奇怪.这是我创建的函数:

function clickCell() {var row = document.getElementById('myTable').rows;for (var i = 0; i < row.length; i++) {for (var j = 0; j 

解决方案

您的画布似乎与您的表格重叠.因为你的表格中的 td 元素永远不会被点击.

您需要将 CSS 属性 pointer-events:none 添加到您的画布.

#myCan {...指针事件:无;}

这样就不会再阻止点击表格了.

您还可以更简单地向单元格添加事件侦听器:

document.querySelectorAll('#myTable td').forEach(e => e.addEventListener("click", function() {//这里,`this` 指的是事件被挂钩的元素console.log("点击")}));

为每个单元格创建一个单独的函数;相反,您可以共享一个功能而不会丢失任何功能:

function clickHandler() {//这里,`this` 指的是事件被挂钩的元素console.log("点击")}document.querySelectorAll('#myTable td').forEach(e => e.addEventListener("click", clickHandler));

<小时>

有些浏览器在 querySelectorAll 返回的 HTMLCollection 上仍然没有 forEach,但它很容易被 polyfill:

if (!HTMLCollection.prototype.forEach) {Object.defineProperty(HTMLCollection.prototype, "forEach", {值:Array.prototype.forEach});}

如果您必须支持没有 Array.prototype.forEach 的真正过时的浏览器,请参阅 MDN 上的 polyfill.

I'want to add an eventListener to the table cells so each time a table cell is clicked to execute a function .

var getDaysInMonth = function (year, month) {
    return new Date(year, month, 0).getDate();
}



var calendar = {
    month: function () {
        var d = new Date();
        return d.getMonth() + this.nextMonth;
    },

    year: function () {
        var y = new Date();
        return y.getFullYear();
    },

    nextMonth: 1,
    
    cellColor: 'white',
    
}



var loopTable = function () {
    var daysInMonth = getDaysInMonth(calendar.year(), calendar.month());
    var table = document.getElementById('myTable');
    var rows = table.rows;
    var l = 1;
    var month = calendar.month();
    var year = calendar.year();
    var firstDay = new Date(year + "-" + month).getDay();
    var currentDay = new Date().getDay();
    var dayOfMonth = new Date().getDate();

 
    for (let i = 1; i < rows.length; i++) {

        if (rows[i] == rows[1]) {

            var k = 1;

            for (let j = firstDay; j < rows[i].cells.length; j++) {

                if (k === dayOfMonth && calendar.nextMonth === 1) {
                    rows[i].cells[j].style.backgroundColor = calendar.cellColor;
                

                }

                if (k <= daysInMonth) {
                    rows[i].cells[j].innerHTML = k;
                    k++
                }

            }
        } else {
            for (let j = 0; j < rows[i].cells.length; j++) {
                if (k === dayOfMonth && calendar.nextMonth === 1) {
                    rows[i].cells[j].style.backgroundColor = calendar.cellColor;
                }
                if (k <= daysInMonth) {
                    rows[i].cells[j].innerHTML = k;
                    k++
                }
            }
        }
    }
}

loopTable();
clickCell();

function monthTitle() {

    var monthsArray = ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sept.', 'Oct.', 'Nov.', 'Dec.'];
    monthNum = calendar.month();
    var monthName = monthsArray[calendar.month() - 1] + '' + calendar.year();
    var title = document.getElementById('calendarTitle');
    var nextArrow = document.getElementById('nxt');
    var leftArrow = document.getElementById('prev');

  
    if (monthName === ('Dec.' + '' + calendar.year())){
        xmas();
    }
    if (monthNum >= 12) {
        nextArrow.className += ' inactiveLink';
    } else if (monthNum <= 1) {
        leftArrow.className += ' inactiveLink';
    } else {
        nextArrow.classList.remove('inactiveLink');
        leftArrow.classList.remove('inactiveLink');
    }

    title.innerHTML = '';
    var titleNode = document.createTextNode(monthName);
    title.appendChild(titleNode);


}
monthTitle();

function nextMonth() {
    clearTable();
    calendar.nextMonth += 1;
    monthTitle();
    loopTable();
}

function previousMonth() {
    clearTable();
    calendar.nextMonth -= 1;
    monthTitle();
    loopTable();
}

function clearTable() {
    var table = document.getElementById('myTable');
    var rows = table.rows;

    for (var i = 1; i < rows.length; i++) {
        cells = rows[i].cells;
        for (var j = 0; j < cells.length; j++) {
            if (cells[j].innerHTML = '') {
                cells[j].style.display = 'none';
            }
            cells[j].innerHTML = '';
            cells[j].style.backgroundColor = '#D9534F';
            cells[j].style.emptyCells = 'hide';
        }
    }
}

var next = document.getElementById('nxt');
var previous = document.getElementById('prev');
var table = document.getElementById('myTable');
var cell = table.rows;
next.addEventListener('click', nextMonth);
previous.addEventListener('click', previousMonth);



function clickCell() {
    var row = document.getElementById('myTable').rows;
    
    for (var i = 0; i < row.length; i++) {
        for (var j = 0; j < row[i].cells.length; j++ ) {
  					
            row[i].cells[j].addEventListener('click', function(){
  					console.log('click');
            })
        }
    }
}
clickCell();

body {
            background-color: rgb(0, 121, 191);
        }
        
        table {
            width: 50%;
            background-color: #D9534F;
            border: 1px solid white;
            padding: 10px;
            padding-bottom: 20px;
            font-size: 25px;
            border-radius: 25px;
            position: relative;
            margin: auto;
        }
        
        td {
            border: 1px solid white;
            text-align: center;
            font-weight: 600;
            font-size: 20px;
            padding: 20px;
        }
        
        th {
            height: 50px;
        }
        
        .calArrows {
            text-decoration: none;
            color: white;
            font-size: 35px;
        }
        
        #nxt {
            font-size: 30px;
            position: absolute;
            top: 0;
            right: 25%
        }
        
        #prev {
            font-size: 30px;
            position: absolute;
            top: 0;
            left: 25%;
        }
        
        #calendarTitle {
            font-family: 'Indie Flower', cursive;
            font-weight: 600;
            font-size: 25px;
            color: white;
        }
        
        .inactiveLink {
            cursor: not-allowed;
            pointer-events: none;
             
        }
        
        #myTable {
            empty-cells: hide;
        }
        
        .xmasDec {
            width: 90%;
            height: 70%;
            position: absolute;
            top: -10%;
            left: 5%;
        }
        
        #calWraper {
            position: relative;
        }
        
        #myCan {
            position: absolute;
            top: 0;
            left: 10%;
            width: 90%;
            height: 70%;
            opacity: 0, 5;
        }

<body>
    <canvas class="myCan" width="100" height="100"></canvas>
    <div id="calWraper">
        <table id="myTable">
            <caption id="calendarTitle">Test</caption>
            <tr>
                <th>Sun</th>
                <th>Mon</th>
                <th>Tue</th>
                <th>Wed</th>
                <th>Thur</th>
                <th>Fri</th>
                <th>Sat</th>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
            </tr>
        </table>
        <canvas id="myCan" width="200" height="200" style="background-color: transparent"></canvas>
            <a href="#" id="prev" class="calArrows"><i class="fa fa-arrow-left" ></i></a>
        <a href="#" id="nxt" class="calArrows"><i class="fa fa-arrow-right" ></i></a>



    </div>



</html>

I tried by creating a function that it will loop through rows and cells and add the eventListener to each . But it seems that its not working , its working on random instances which is really strange behavior . Here is the function i create:

function clickCell() {
    var row = document.getElementById('myTable').rows;
 for (var i = 0; i < row.length; i++) {
        for (var j = 0; j < row[i].cells.length; j++ ) {
                    console.log(row[i].cells[j].innerHTML);
            row[i].cells[j].addEventListener('click', function(){
                    console.log('click');
            })
        }
    }
}

解决方案

It seems your canvas is overlapping your table. Because of that td elements in your table are never clicked.

You will need to add CSS property pointer-events:none to your canvas.

#myCan {
    ...
   pointer-events: none;
}

This way it won't block table from being clicked anymore.

You can also add event listeners to your cells way simpler:

document.querySelectorAll('#myTable td')
.forEach(e => e.addEventListener("click", function() {
    // Here, `this` refers to the element the event was hooked on
    console.log("clicked")
}));

That creates a separate function for each cell; instead, you could share one function without losing any functionality:

function clickHandler() {
    // Here, `this` refers to the element the event was hooked on
    console.log("clicked")
}
document.querySelectorAll('#myTable td')
.forEach(e => e.addEventListener("click", clickHandler));


Some browsers still don't have forEach on the HTMLCollection returned by querySelectorAll, but it's easily polyfilled:

if (!HTMLCollection.prototype.forEach) {
    Object.defineProperty(HTMLCollection.prototype, "forEach", {
        value: Array.prototype.forEach
    });
}

If you have to support truly obsolete browsers that don't have Array.prototype.forEach, see the polyfill on MDN.

这篇关于如何将EventListener添加到表格单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆