1

我有一个向表格添加一些行的函数,最后有一个扩展器。首次呈现页面时,有 30 行,扩展器由鼠标单击触发,因为onclick();事件在文档标记中内联描述。

当我添加新的onclick();时,我这样做是在一个循环中通过一些 JSON 加载接下来的 30 个对象,我通过 XHR 获得。

newCell.onclick = (function(id){toggleCertificate(id, this, i);})(currCert['id']);

现在currCert包含一个'id'我想在这个处理程序中的整数,这样对于每个i,都会有一个不同的整数来代替currCert['id']预期toggleCertificate(integer id ...);

newCell.onclick = function(){toggleCertificate(12983, this, 5);};

this需要像引用newCell对象一样向下传递,而其他两个变量需要以整数形式向下传递,以便在toggleCertificate执行时被解释为它们的值

我究竟做错了什么?我发现这种将函数附加到事件处理程序的语法非常棘手。

目前,此代码的行为类似于尝试使用我无法调试的数据执行“toggleCertificate”。Firebug 的 DOM 检查器显示附加的 onclick 变为

(function (){toggleCertificate(currCert['id']), this, i})

页面开始执行所有正确的onclick功能,而无需同时单击。

我希望 onclick 事件等于这个字符串

"toggleCertificate(" + currCert['id'] + ", this, " + i + ");"

抱歉,如果我使用了不正确的 JavaScript 标准,尤其是关于“事件处理程序”、“对象”和“内联”的任何词-_-

4

1 回答 1

0

您需要立即函数来返回一个函数:

newCell.onclick = (function(id, i) {
   return function() {
     toggleCertificate(id, this, i);
   }
})(currCert['id'], i);

onClick 需要一个可以稍后执行的函数(当有点击时),所以这就是立即函数的输出必须是什么。完全使用立即函数的原因是因为附加到 onClick 的函数是根据 i 和 currCert['id'] 的值以编程方式生成的

于 2013-05-19T12:59:34.483 回答