0

这是我的第一篇文章,所以我希望我没有违反任何规则。我已经进行了相当广泛的搜索,但可能没有找到我想要解决的正确术语。

无论如何,我的问题是这样的:我有一个带有项目列表的表格,最左边的列有一个按钮,单击时调用 ajax Post 和/或加载函数来查询项目的历史并将其列在下面桌子。这在其真正意义上的预期结果中起作用,但是,通过 FireBug 查看控制台,随后单击列表中的按钮会导致帖子翻倍。IE。第一次单击显示 1 个控制台事件,第二次单击显示 2 个控制台事件,第三次单击显示 4 个控制台事件,依此类推。这种情况一直持续到我选择不同的位置并且计数重置。

以下是我在控制台中看到的内容。这带来了时间问题,因为每个后续帖子都需要更长的时间。

点击 hist-tag 按钮 5365

>GET http://localhost/digipens/query.php?rec_id=5365

点击 hist-tag 按钮 5365

>GET http://localhost/digipens/query.php?rec_id=5365

点击 hist-tag 按钮 5365

>GET http://localhost/digipens/query.php?rec_id=5365

点击 hist-tag 按钮 5365

>GET http://localhost/digipens/query.php?rec_id=5365

代码:

$('.hist-tag').click(function(){

  var ID=$(this).closest('tr').attr('id')

  itemid  = $("#itemid_input_"+ID).val();
  dataString = '?rec_id='+ID;

  $('#item_hist').load('query.php' + dataString); 

});

任何实现相同目标的想法或不同方式都是极好的。

谢谢!

4

2 回答 2

1

听起来好像您正在添加单击处理程序作为单击的结果。你$('.hist-tag').click()在表格更新后打电话吗?如果是这样,您每次都在添加新的点击处理程序,这意味着点击被处理两次,然后是 4 次,然后是 8 次,等等。

我只能猜测,因为我在这里没有看到相关代码。

如果是这样,正确的解决方案是只添加一次单击处理程序,然后通过.on()调用来完成。这样,就可以处理当前和未来元素的点击:

$('#mytable').on('click', '.hist-tag', function(){
    var ID=$(this).closest('tr').attr('id');
    itemid=$("#itemid_input_"+ID).val();
    dataString = '?rec_id='+ID;
    $('#item_hist').load('query.php' + dataString);
});

这会将处理程序附加到您知道将始终存在的元素#mytable,或者无论您的表的 ID 是什么,然后监视对传播到表的子项的点击,并在您提供的选择器上过滤它们,即.hist-tag.

我再次猜测,但这就是我所拥有的证据似乎正在发生的事情。

于 2012-09-26T19:22:56.457 回答
0

我怀疑您的点击事件在每次返回时都会以某种方式重新绑定。
加载调用的响应中可能包含相同的脚本?

尝试这个:

$('.hist-tag').off('click');
$('.hist-tag').on('click', function(){
    var ID=$(this).closest('tr').attr('id');
    itemid=$("#itemid_input_"+ID).val();
    dataString = '?rec_id='+ID;
    $('#item_hist').load('query.php' + dataString);
    return false;  // prevents bubbling the click to the container
});
于 2012-09-26T19:23:47.530 回答