我想用javascript创建一个日历:
我通过这个功能创建元素:
createElem : function (name, attrs){
var el = document.createElement(name);
for(var key in attrs) {
el.setAttribute(key, attrs[key]);
}
return el;
}
表:
var tb=this.createElem("table", {"class":"p-calendar", id: "p-calendar"});
行和单元格:
for(var i=2; i<to; i++){
tb.insertRow(i);
for(var j=0; j < 7; j++){
tb.rows[i].insertCell(j);
.
.
所以在我的循环中:
tb.rows[i].cells[j].className="day"; // it's work
但是:
tb.rows[i].cells[j].onclick = function(){
tb.rows[i].cells[j].id = "today";
} // Unable to set property 'id' of undefined or null reference
提前致谢。
答案 0 :(得分:1)
简答:您的onclick处理程序需要closure
。
答案很长:
您的索引i
和j
会在for
循环中递增。实际点击元素后,您的onclick
处理程序会被调用。猜猜i
和j
的价值是什么。它们超出了rows
和cells
的元素数组的范围。这意味着每个元素都使用相同的i
和j
值,并且它们都没有在元素数组的范围内获取值。您可以通过在当前i
处理程序中记录j
和onclick
的值来验证这一点。
<强>解决方案:强>
替换块:
tb.rows[i].cells[j].onclick = function(){ ... }
使用:
var getOnclickMethod = function (i, j) {
var cur_i = i * 1;
var cur_j = j * 1;
var callback = function(){
tb.rows[cur_i].cells[cur_j].id = "today";
};
return callback;
};
tb.rows[i].cells[j].onclick = getOnclickMethod(i, j);