2013-03-10 36 views
0

我有一个需要经常重用的函数。当我将另一个页面加载到当前页面时,该问题发生,该功能激发两次。我试过这个解决方案,但无法使其正常工作(Disable jquery function after 1 click, to prevent multiple executions)。任何解决方案可以防止请求正在进行时多次触发该功能?该功能应该只能点击一次。防止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); 
}); 
+1

当您在链接问题中尝试了技巧时发生了什么?它看起来好像它应该适合你的情况。 – 2013-03-10 02:46:03

+0

“将另一个页面加载到当前页面” - 意味着某种Ajax获得?如果是这样,在ajax请求之后你做了什么?如果你发布了所有相关的代码,它会更容易。 – darshanags 2013-03-10 03:06:54

回答

0

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

+0

你能告诉我把布尔值放在哪里吗?我知道你在说什么(如果(hasActiveRequest)返回false),但我不知道在哪里把它们放在代码中 – Patriotec 2013-03-10 02:53:13

+0

你可以定义'var hasActiveRequest = false; '在顶部,在'$ .fn.likeclick = ...'之前添加一行 – sweetamylase 2013-03-10 03:11:35

0

由于功能没有上都加载了。员额()方法的页面(或数据)的工作,我试图直接或.js文件添加jQuery的功能,加载页面。无论哪种方式,在使用.post()加载几个页面之后,代码被多次执行。无论我使用延迟,超时函数还是添加布尔值来防止每次点击多次触发该函数,该函数仍会执行多次。

无尽的搜索后,我遇到了这篇文章(http://docs.jquery.com/FAQ#Why_do_my_events_stop_working_after_an_AJAX_request.3F)jQuery的文档。

在这篇文章中它指出:

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

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

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

现在我不必职能从。员额()方法添加到加载页面(数据),或者用其他的方法来尝试和防止函数开火两次。