Javascript onclick不';t触发器函数(通过innerHTML创建的按钮)

Javascript onclick不';t触发器函数(通过innerHTML创建的按钮),javascript,html,Javascript,Html,首先,我尝试: document.getElementById(trade_selection[i].slug).onclick = send_trade_request(auction_a, slug_for_trading, username); 但它在任何单击事件发生之前触发了该函数,因此我发现需要调用匿名函数才能使其工作,因此我尝试: var slug_for_trading='slug for trading'; var交易选择=[{ 名称:“foo”, 鼻涕虫:“尼斯鼻涕虫

首先,我尝试:

   document.getElementById(trade_selection[i].slug).onclick = send_trade_request(auction_a, slug_for_trading, username);
但它在任何单击事件发生之前触发了该函数,因此我发现需要调用匿名函数才能使其工作,因此我尝试:

var slug_for_trading='slug for trading';
var交易选择=[{
名称:“foo”,
鼻涕虫:“尼斯鼻涕虫”,
出售用户名:“foo”,
价格:123
}, {
名称:“foo1”,
鼻涕虫:“veryveryniceslug”,
正在出售用户名:“foo1”,
价格:123
}];
var el=document.getElementById('test');
el.innerHTML=“贸易
”; 对于(变量i=0;i”; log(document.getElementById(trade_selection[i].slug)); document.getElementById(交易选择[i].slug.onclick=function(){ 发送交易请求(拍卖a、交易slug、用户名); } } 功能发送交易请求(拍卖a、拍卖b、至){ 警报(拍卖a+“”+拍卖b+“”+收件人); }

问题在于,您实际上正在调用
发送交易请求(拍卖a、slug交易、用户名)立即

您应该在函数中包装send_trade_request(),并在不实际调用函数的情况下引用该函数:


问题是您实际上正在调用
send\u trade\u request(拍卖、slug\u for\u trading、用户名)立即

您应该在函数中包装send_trade_request(),并在不实际调用函数的情况下引用该函数:


好的,问题是,您正在使用“innerHTML”将新元素分配给“root”div。您正在“删除”先前添加的事件侦听器

而是使用:

  var button = document.createElement('button');
  button.innerHTML = "send request: " + i;
  button.id = trade_selection[i].slug;
  el.appendChild(button);

这样,您可以保留以前的DOM树并附加新元素。已测试并运行。

好的,问题是,您正在使用“innerHTML”将新元素分配给“root”div。方法是:el.innerHTML=el.innerHTML+“new element HTML”。您正在“删除”先前添加的事件侦听器

而是使用:

  var button = document.createElement('button');
  button.innerHTML = "send request: " + i;
  button.id = trade_selection[i].slug;
  el.appendChild(button);


这样,您可以保留以前的DOM树并附加新元素。经过测试,它正常工作。

我的假设是,当您尝试将事件处理程序附加到元素时,该元素不在“浏览器中”,因为Javascript优先于DOM。尝试
console.log(document.getElementById(trade\u selection[i].slug)
在添加事件处理程序之前,查看您是否得到了未定义的
。如果是这样,我是对的。@Dellirium请运行我的编辑,日志显示这两个按钮都是在事件处理程序之前成功创建的。感谢您的建议,以及有关Javascript优先级的信息(了解了一些新内容)。我想我已经了解了问题所在。给我一点时间用小提琴运行它。好的,我想我明白了,重新检查并发布我的假设是,当您尝试将事件处理程序附加到元素时,该元素不在“浏览器”中,因为Javascript优先于DOM。请尝试
console.log(document.getElementById(trade_selection[I].slug)
在添加事件处理程序之前,查看您是否得到了未定义的
。如果是这样,我是对的。@Dellirium请运行我的编辑,日志显示这两个按钮都是在事件处理程序之前成功创建的。感谢您的建议,以及有关Javascript优先级的信息(了解了一些新内容).我想我知道问题是什么了,给我一点时间用小提琴来运行它。好的,我想我知道了,重新检查并发布了异常,它被包装了,没有被调用。它只是匿名。这正是事件回调的工作原理:你传递给它一个函数,而不调用它,当事件发生时,只有在函数被执行的时候。但是他一直在dy在他的例子中就是这么做的,所以我认为没有必要告诉他去做,他已经做了什么。没有立即的电话,他甚至说他必须在他的问题中把它包起来。哦,我明白了。他在第一个例子中没有做到,但在第二个例子中,他确实尝试过把它包起来。只是它被包起来了,没有被调用。它只是匿名而已这正是事件回调的工作原理:你传递给它一个函数而不调用它,当事件发生时,只有函数被执行。但他在他的例子中已经这样做了,所以我不认为告诉他做什么有意义,他已经做了什么。没有立即调用,他甚至说他必须在他的问题中总结它。哦,我明白了。在第一个例子中,他没有做到,但在第二个例子中,他确实尝试过包装它。关闭它,但会重新创建,所以我们可以在这里讨论它。我想我知道你的目的是什么,这是一个完全不同的问题,然后这里讨论的问题,不管怎样,在小提琴中解决了,所以OP可以看一看。我不同意,你没有错了,如果你的意思是我认为你的意思,这将导致问题,因为函数在循环中定义,循环在第二次迭代中更改参数。这种情况发生了!这就是为什么需要外部定义的
registrationHandler
的原因。我没有在最初的回答中对这一问题进行评论,因为它不是rea儿子,最初的问题不起作用,但它确实是有用的,它应该在那里,所以荣誉。是的,这正是我所想的。我本想把它添加到答案中,但我明白你的意思。使用
.forEach()的一个很好的理由
而不是
for
循环。关闭它,将重新创建,因此我们可以在这里讨论它。我想我知道你的目标,这是一个完全不同的问题,与这里讨论的问题完全不同,不管怎样,在小提琴中解决,所以OP可以看一看。我不同意,你没有弄错,如果你的意思是我认为你的意思,这会引起一些问题