Search code examples
javascriptarrayshtml-tablecalendar

How to execute value from <td> element


I'm not familiar with js, can you give me any tips. So basically I have calendar which generates dynamically. And I need to mark current day for example in "red". You can use my codepen for more detailed information.

When I try to execute value from this table I get the array which looks like this ~>

enter image description here

https://codepen.io/david_jons/pen/aPXeaK

<div id="calendar-container">
  <div id="calendar-header">
      <span id="calendar-month-year"></span>
  </div>
      <div id="calendar-dates">
  </div>
</div>

JS:

window.onload = function(){
    var d = new Date();
    var month_name = ['January','February','March','April','May','June','July','August','September','October','November','December'];
    var month = d.getMonth();
    var year = d.getFullYear();
    var first_date = month_name[month] + " " + 1 + " " + year;
    var tmp = new Date(first_date).toDateString();
    var first_day = tmp.substring(0, 3);
    var day_name = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
    var day_no = day_name.indexOf(first_day);
    var days = new Date(year, month+1, 0).getDate();
    var calendar = get_calendar(day_no, days);
    
    document.getElementById("calendar-month-year").innerHTML = month_name[month]+" "+year;
    document.getElementById("calendar-dates").appendChild(calendar);

    var tr = document.getElementById("calendar-dates");
    var tds = tr.getElementsByTagName("td");
    var current_date = d.getDate();
}

function get_calendar(day_no, days){
    var table = document.createElement('table');
    var tr = document.createElement('tr');
    
    //row for the day letters
    for(var c=0; c<=6; c++){
        var li = document.createElement('li');
        li.innerHTML = "SMTWTFS"[c];
        tr.appendChild(li);
    }
    table.appendChild(tr);
    
    //create 2nd row
    tr = document.createElement('tr');
    var c;
    for(c=0; c<=6; c++){
        if(c == day_no){
            break;
        }
        var td = document.createElement('td');
        td.innerHTML = "";
        tr.appendChild(td);
    }
    
    var count = 1;
    for(; c<=6; c++){
        var td = document.createElement('td');
        td.innerHTML = count;
        count++;
        tr.appendChild(td);
    }
    table.appendChild(tr);
    
    //rest of the date rows
    for(var r=3; r<=7; r++){
        tr = document.createElement('tr');
        for(var c=0; c<=6; c++){
            if(count > days){
                table.appendChild(tr);
                return table;
            }
            var td = document.createElement('td');
            td.innerHTML = count;
            count++;
            tr.appendChild(td);
        }
        table.appendChild(tr);
    }
    return table;
}

Solution

  • You can iterate over an HTML collection using Array.prototype.filter called with the HTML collection as a context.

    The following snippet may be of some help:

    var cells = document.getElementById("calendar-dates").getElementsByTagName("td");
    var current_date = d.getDate();
    var matchingElement = Array.prototype.filter.call(cells, function(cell) {
      return +current_date === +cell.textContent;
    })[0];
    matchingElement.style.backgroundColor = 'red';