0

我有一个需要经常重用的功能。当我将另一个页面加载到当前页面时会出现问题,该函数会触发两次。我尝试了此解决方案,但无法使其正常工作(单击 1 次后禁用 jquery 功能,以防止多次执行)。有什么解决方案可以防止该功能在发出请求时多次触发?该功能应该每次点击只触发一次。

(function($) {
    $.fn.likeclick = function(thiss, key) {  
        var $this = thiss;
        var pid=key;
        if ($this.hasClass('addd')) {
            $.post("/blah.php?id="+pid, function(data) {
                if (data=="ok"){
                    $this.removeClass('addd').addClass('rem');
                    $('.ccount#'+pid).html(function(i,val) {
                        return (parseFloat(val) + 1).toFixed(0);
                    });
                }
            });
        } else {
            $.post("/blah1.php?id="+pid, function(data) {
                if (data=="okk"){
                    $this.removeClass('rem').addClass('addd');
                    $('.ccount#'+pid).html(function(i,val) {
                        return (parseFloat(val) - 1).toFixed(0);
                    });
                }
            });
        }
    };
})(jQuery);

用法:

<div class="like addd"></div>

$('.like').click(function() {
    likeclick($(this),this.id);
});
4

2 回答 2

0

如果我正确理解了您的问题,那么您需要一种方法让该函数在发出请求之前知道当前是否有任何活动请求。为什么不添加一个布尔值hasActiveRequest来跟踪这个?所以默认情况下它false,然后当他们点击它时,检查 boolean...if false 然后将其设置为true并发出请求;否则,如果它是true,则不要提出请求(因为已经有一个正在进行中)。请求完成后,将布尔值设置回false.

于 2013-03-10T02:46:53.243 回答
0

由于这些函数在使用 .post() 方法加载的页面(或数据)上不起作用,因此我尝试将 jQuery 函数直接添加到加载的页面或使用 .js 文件。无论哪种方式,代码都会在使用 .post() 加载几页后多次执行。无论我使用延迟、超时功能还是添加布尔值来尝试防止每次点击多次触发该功能,该功能仍会执行多次。

在无休止的搜索之后,我在 jQuery 文档中看到了这篇文章( http://docs.jquery.com/FAQ#Why_do_my_events_stop_working_after_an_AJAX_request.3F )。

在那篇文章中说:

谨防!从 jQuery 1.4.2 开始,多次将同一个处理程序绑定到同一个元素将导致它执行多次。这与以前版本的 jQuery 以及 DOM 2 事件规范(通常忽略重复的事件处理程序)不同。

更多研究发现了 .live() 方法,但该方法已被弃用。.on() 方法取代了 .live()。所以我的解决方案是:

$(document).on('click', '.like', function(){
var $this = $(this);
likeclick($this,this.id);
});

现在我不必从 .post() 方法向加载的页面(数据)添加函数或使用其他方法来尝试阻止函数触发两次。

于 2013-03-10T12:28:39.157 回答