奇怪的动态onclick事件处理程序分配问题

时间:2011-11-25 16:42:25

标签: javascript

function AddTableHeader(table, cells, newOrderby) {
    var head = table.createTHead();
    var row = head.insertRow(0);
    row.className = "SupplierDataTableTr";
    for (var s in cells) {
        var cell = null; 
        cell = document.createElement("th");
        cell.innerHTML = cells[s];
        cell.className = "SupplierDataTableTh";
        if (newOrderby != null && newOrderby[s] != null) {
            var ob = newOrderby[s];
            cell.onclick = function() { SetOrderBy(ob); AutoComplete(null, 'txtSearch'); };
            cell.style.cursor = "pointer";
        }

        row.appendChild(cell); 
    }
}

在if语句中我在数组中设置变量ob = string ..此时数组包含“SupplierNr”,“Name”,“Email”,“Phone”并且与单元格数组具有相同的顺序

问题是,最后每个<th>标记上的事件都附加了最后一个newOrderby字符串,即“Phone”。我在调试器中循环遍历此部分,并为循环中的每个事件设置不同的orderby字符串,但由于某种原因,所有<th>元素都会创建最后一个eventhandler。为什么是这样?单元格是在for循环中创建的,应该是本地的,它们与彼此没有任何关系。

任何人都知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您在循环中分配事件处理程序,那么您可能需要使用闭包来确保它正常工作。否则你会遇到你正在描述的问题。

此处类似的问题和解决方案:Event handlers inside a Javascript loop - need a closure?