阿贾克斯 - 防止点击一个成功的阿贾克斯请求

问题描述:

我有一个视频缩略图在我的网页上,有一个小图标“大拇指朝下”。当你点击那个时,另一个缩略图显示,替换另一个。用户可以尽可能多地做到这一点。阿贾克斯 - 防止点击一个成功的阿贾克斯请求

我的代码现在只在第一次运行。 HTML:

<a href="/change/videos/{{ video.video_id}}/thumbsdown/" data-sort="sort" data-page="page" class="dislike_black" title="I dislike this"></a> 

AJAX:

$('.dislike_black').click(function(e) { 
    e.preventDefault(); 
    alert("test"); 
    var $aTag = $(this); 
    $.ajax({ 
     url: $aTag.attr('href'), 
     type: "POST", 
     data: { 
      "sort": $aTag.data('sort'), 
      "page": $aTag.data('page') 
     }, 
     success: function(response) { 
      $aTag.parents("li").replaceWith(response); 
     } 
    }); 
}); 

当我点击该图标在第一时间,所有的罚款,触发警报,第二次思想,没有警告,浏览器加载在href链接。

我试过.preventDefault();在成功和完整的事件上,但它不工作。

如何做到这一点的任何提示?

你的内容是动态创建的,因此,根据jQuery的版本你使用,你需要的jQuery.live()jQuery.on()方法

jQuery.live() since jQuery 1.3 an event handler for all elements which match the current selector, now and in the future.

jQuery.on() since jQuery 1.7 - Attach an event handler function for one or more events to the selected elements.

样品

jQuery.live()

$('.dislike_black').live("click", function(e) { 
    e.preventDefault(); 
    alert("test"); 
    var $aTag = $(this); 
    $.ajax({ 
     url: $aTag.attr('href'), 
     type: "POST", 
     data: { 
      "sort": $aTag.data('sort'), 
      "page": $aTag.data('page') 
     }, 
     success: function(response) { 
      $aTag.parents("li").replaceWith(response); 
     } 
    }); 
}); 

jQuery的。在()

$('.dislike_black').on("click", function(e) { 
    e.preventDefault(); 
    alert("test"); 
    var $aTag = $(this); 
    $.ajax({ 
     url: $aTag.attr('href'), 
     type: "POST", 
     data: { 
      "sort": $aTag.data('sort'), 
      "page": $aTag.data('page') 
     }, 
     success: function(response) { 
      $aTag.parents("li").replaceWith(response); 
     } 
    }); 
}); 

更多信息

+0

如果jQuery的版本1.7+不可用,那么'live'不推荐使用它来更换代理 – Rafay 2012-01-27 21:04:49

+0

我想我在我的答案中涵盖了这些版本。你怎么看 ?感谢repsonse – dknaack 2012-01-27 21:05:51

+1

是的,你已经覆盖了很好的+1版本,但'.live'在jquery的最新版本中已弃用,所以建议使用'.delegate'而不是'.live', – Rafay 2012-01-27 21:10:03

尝试使用事件代表团。

// older jquery, use this line: 
// $(".dislike_black").live("click", function (e) { 
$(document).on("click", ".dislike_black", function (e) { 
    e.preventDefault(); 
    alert("test"); 
    var $aTag = $(this); 
    $.ajax({ 
     url : $aTag.attr('href'), 
     type : "POST", 
     data : { 
      "sort" : $aTag.data('sort'), 
      "page" : $aTag.data('page') 
     }, 
     success: function (response) { 
      $aTag.parents("li").replaceWith(response); 
     } 
    }); 
}); 
+0

林具有错误 的$(document)。在不是一个函数” – Lelly 2012-01-27 21:05:23

+0

那么你正在使用一个老jquery,注释掉该行并取消注释上面的行。 – 2012-01-27 21:10:18

+0

@RébeccaO'Brien因为pro可能你使用的是旧版本的jquery,对于'.on'来工作你需要1.7.0版本' – Rafay 2012-01-27 21:11:31

因为您正在用ajax成功处理程序中的新html替换包含锚本身的dom。在这种情况下,您应该使用on,它会将事件处理程序附加到父元素或文档元素,无论您作为根元素传递什么,但只会在您作为第二个参数传递的匹配选择器上触发事件。尝试这个。

$(document).on('click', '.dislike_black', function(e) { 
    e.preventDefault(); 
    alert("test"); 
    var $aTag = $(this); 
    $.ajax({ 
     url: $aTag.attr('href'), 
     type: "POST", 
     data: { 
      "sort": $aTag.data('sort'), 
      "page": $aTag.data('page') 
     }, 
     success: function(response) { 
      $aTag.parents("li").replaceWith(response); 
     } 
    }); 
}); 

.on()参考:(版本1.7+)http://api.jquery.com/on/

如果您在使用jQuery的旧版本仍然可以做到这一点使用方法delegate其语法是相同on只是第2个参数被互换。

$(document).delegate('.dislike_black', 'click', function(e) { 
    //Your code here 
}); 

.delegate()参考:http://api.jquery.com/delegate/

+0

我有错误:“$(document).on不是函数” – Lelly 2012-01-27 21:07:17

+0

你使用的是旧版本的jQuery 。从我的答案中使用'委托'的替代方法。 – ShankarSangoli 2012-01-27 21:07:56

尝试

$(document).delegate('.dislike_black',"click",function(e) {