我在for循环中有以下javascript jquery ajax调用。
此循环调用外部api并将输入按钮附加到html元素。按下此按钮时,它应显示一个弹出警告框,但由于for循环将此单击事件多次附加到按钮,因此会弹出多次。
我还尝试将.click()放在for循环之外,但这似乎既不起作用,因为ajax是异步的,而.click()事件也没有附加到任何东西,因为它的外部流动。
我试图谷歌这个问题,但大多数人只是有定期的ajax异步问题,但这次它在一个循环中似乎没有太多关于此设置的信息。
代码
function successHandler(data, textStatus, jqXHR) {
jj = '<input class ="submitAsset"type="submit" value="'+ data
+'">';
jQuery("#example").append(jj);
jQuery('.submitAsset').on("click", function() {
alert("clicked");
}); //function click
} //function successHandler
for (i=0;i < 9; i++) {
$.ajax({
dataType: 'json',
url: 'http://example.com',
success: successHandler
});//ajax call-- get required information
}//for
答案 0 :(得分:0)
它抛出多个警报的原因是每次调用successhandler时都会将相同的单击处理程序附加到元素。
您需要使用事件委派或仅在成功事件中将事件附加到新附加的元素:
1)使用事件委托:
function successHandler(data, textStatus, jqXHR) {
jj = '<input class ="submitAsset"type="submit" value="'+ data +'">';
jQuery("#example").append(jj);
}
jQuery('#example').on("click",".submitAsset", function() {
alert("clicked");
});
2)通过将click处理程序添加到最后添加的元素:
function successHandler(data, textStatus, jqXHR) {
jj = '<input class ="submitAsset"type="submit" value="'+ data +'">';
jQuery("#example").append(jj);
jQuery('.submitAsset:last').on("click", function() {
alert("clicked");
}); //function click
} //function successHandler
注意:在这种情况下,我建议使用事件委托,因为与多个绑定相比,它创建的CPU开销更少。
答案 1 :(得分:0)
您不需要在循环中附加事件并使用事件委派附加事件
function successHandler(data, textStatus, jqXHR) {
jj = '<input class ="submitAsset"type="submit" value="'+ data +'">';
jQuery("#example").append(jj);
} //function successHandler
for (i=0;i < 9; i++)
{
$.ajax({
dataType: 'json',
url: 'http://example.com',
success: successHandler
});//ajax call-- get required information
}//for
//and attache events using event delegation
$("#example").on("click", "input.submitAsset", function()
{
alert("clicked");
});
答案 2 :(得分:0)
多次调用successHandler
,并使用类名多次注册事件处理程序。因此,已创建的所有元素都将多次注册。
要解决此问题,请不要使用jQuery('.submitAsset')
注册处理程序,而是通过包装jj
创建元素jQuery
并将onclick
处理程序直接注册到元素,如下所示,
function successHandler(data, textStatus, jqXHR) {
jj = jQuery('<input class ="submitAsset"type="submit" value="'+ data
+'">');
jQuery("#example").append(jj);
jj.on("click", function() {
alert("clicked");
}); //function click
} //function successHandler
for (i=0;i < 9; i++) {
$.ajax({
dataType: 'json',
url: 'http://example.com',
success: successHandler
});//ajax call-- get required information
}
否则,请将event
附加到成功处理程序之外,如下所示
$("#example").on("click", ".submitAsset", function()
{
alert("clicked");
});
function successHandler(data, textStatus, jqXHR) {
jj = '<input class ="submitAsset"type="submit" value="'+ data
+'">';
jQuery("#example").append(jj);
} //function successHandler
for (i=0;i < 9; i++) {
$.ajax({
dataType: 'json',
url: 'http://example.com',
success: successHandler
});//ajax call-- get required information
}
答案 3 :(得分:0)
如果有形式,那么我认为您不需要添加多个Submit buttons
,而只需添加Button
类型,否则您需要添加return false
或{{1} }。所以我建议使用event.preventDefault()
类型并使用事件委托,比如
button