在ajax之后重新启动jquery插件,导致事件多次触发

时间:2011-12-23 21:20:04

标签: javascript jquery jquery-plugins

我有一个我正在处理的查询插件,并且在加载了ajax内容之后的某些函数。问题是,假设我重新启动它15次,点击事件将在仅点击一次时触发15次。

有没有办法让它不会堆积?我正在调用addToCart onload,并在ajax返回后调用itemDetail

谢谢!

function addToCart()
{
  $(options.add_to_cart).click(function ()
  {
    event.preventDefault();
    var id = $(this).attr('id');

    store_item_id_val = id.replace('store-item-id-', '');
    var quantity = $('.quantity-' + store_item_id_val);

    if (quantity.val() < 1)
    {
      showError('Please enter a quantity of 1 or more.');
      $(quantity).val(1);
      return this;
    }

    $.post($(this).attr('href'),
    { store_item_id: store_item_id_val, quantity: quantity.val() },
      function (data)
      {
        var result = jQuery.parseJSON(data);
        renderCart(result);
      });
  });

  return this;
}

function itemDetails()
{
  $('.item-details').click(function ()
  {
    event.preventDefault();

    var url = $(this).attr('href');

    $.getJSON(url, function (result)
    {

      $('.modal-title').empty().html(result.title);
      $('.modal-content').empty().html(result.html);
      $('#modal').slideDown(100);
      $('.ui-button').button();
      addToCart();
      $('.modal-close').click(function ()
      {
        event.preventDefault();
        $('#modal').hide();
      });
    });
  });

1 个答案:

答案 0 :(得分:1)

根据您提供的代码,我可能会说您还有一些其他代码正在调用itemDetails()。每次调用itemDetails()时,它都会将click的另一个事件处理程序添加到您的.item-details。您可能希望改为:

$(document).ready(function()
{
  $('.item-details').click(function ()
  {
    event.preventDefault();

    var url = $(this).attr('href');

    $.getJSON(url, function (result)
    {

      $('.modal-title').empty().html(result.title);
      $('.modal-content').empty().html(result.html);
      $('#modal').slideDown(100);
      $('.ui-button').button();
      addToCart();
      $('.modal-close').click(function ()
      {
        event.preventDefault();
        $('#modal').hide();
      });
    });
  });
});

这会将事件处理程序放在您的.item-details分类项上,并且只触发事件一次。如果您添加并删除了动态.item-details,则可能应该使用:

$('.item-details').live('click', function() ...