我使用javascript动态生成一个可变长度的HTML表,在该表单中我为每一行插入一个按钮。按钮应该在单击时调用函数,但是现在在页面加载/表生成时为每一行调用该函数。如果有多个按钮(因为我为每行创建一个按钮),每个按钮都会调用该函数。我知道这是因为我在upVoteA()中有一个带调用者姓名的警报。
以下是创建按钮的调用部分(整个函数位于此帖的底部):
var tr1 = document.createElement('TR');
var upvote = document.createElement('button')
upvote.name = i + offset
upvote.onclick = upVoteA(upvote.name)
upvote.innerHTML = "Upvote link"
tr1.appendChild(upvote)
我错过了一些属性来改变这种行为吗?我的代码出了什么问题?
此外,这是我调用的完整函数,以便在有用的情况下生成表格。
function answerTableText(idd, offset)
{
var answerDiv = document.getElementById("answerShow")
while(answerDiv.firstChild){
answerDiv.removeChild(answerDiv.firstChild)
}
if(qnumans_array[idd] >0)
{
var table = document.createElement('TABLE');
var tableBody = document.createElement('TBODY');
table.appendChild(tableBody);
for (var i=0; i<qnumans_array[idd]; i++){
var tr = document.createElement('TR');
var td1 = document.createElement('TD')
td1.innerHTML = answer_array[i + offset]
var td2 = document.createElement('TD')
var tr1 = document.createElement('TR');
//tr1.innerHTML = "Upvote"
var upvote = document.createElement('button')
upvote.name = i + offset
upvote.onclick = upVoteA(upvote.name)
upvote.innerHTML = "Upvote link"
tr1.appendChild(upvote)
var tr2 = document.createElement('TR');
tr2.innerHTML = "Downvote"
td2.appendChild(tr1)
td2.appendChild(tr2)
td1.padding = "1em"
td2.padding = "1em"
tr.appendChild(td1)
tr.appendChild(td2)
tr.style.borderBottom = "thin solid #37434E"
tr.style.borderTop = "thin solid #37434E"
tableBody.appendChild(tr);
}
answerDiv.appendChild(table);
}
else answerDiv.innerHTML = "No answers yet."
}
答案 0 :(得分:1)
当你说:
upvote.onclick = upVoteA(upvote.name)
您立即调用该函数,并将其结果分配给onclick
。你想要这样的东西:
upvote.onclick = function() {
upVoteA(upvote.name);
};
答案 1 :(得分:1)
这一行:
upvote.onclick = upVoteA(upvote.name)
调用 upVoteA
并将其返回值分配给onclick
属性,就像
a = foo()
调用 foo
并将其返回值分配给a
。
相反,使用显式包装器为其分配一个函数:
upvote.onclick = function() {
upVoteA(upvote.name);
};
...或使用Function#bind
:
upvote.onclick = upVoteA.bind(null, upvote.name);