jquery:添加代码以单击事件

时间:2013-01-20 12:54:21

标签: jquery

我想保留按钮点击功能的参考,做我的东西,然后运行原始点击功能。

我知道我通常可以在document.ready中做这些事情,例如:

    var originalOnClick = $("#myBtn").click;
    $("#myBtn").click = function() {
      // do my staff here, and only then call the original:
      originalOnClick();
    }

(如果错误,请更正此代码!)

但是,我有一个特例。在我的页面onLoad函数中,有异步的ajax调用。因此,在ajax代码完成之前,实际上会调用在document.ready上调用的函数。

有没有办法在调用click()或onclick()时更改click事件?我的意思是,是否有一个事件在点击事件之后立即被称为?

或者说我必须要求用户点击一个(我可以看到这个页面已加载)按钮,然后我才能做我的员工?

编辑1:ajax代码在包含的脚本中。我无法改变它。

编辑2:可能的解决方案:隐藏原始按钮,但使用其事件:

HTML:

 <div class="object1" style="display: none;" >original button.</div>
 <div class="object2">my button.</div>

JS:

function doMyStuff() {
    alert(' doMyStuff .');
}

$(document).ready(function(){

  $('.object1').click(function(){
     alert('original staff. ');        
  });  // actually, this is just a test code. In my project, I cannot edit this function

  $('.object2').click(function() {
   doMyStuff();
    $('.object1').click();      
  });
});

3 个答案:

答案 0 :(得分:1)

您可以拥有一个click事件,然后将其自身作为事件处理程序删除,然后创建一个新的事件处理程序:

function doNormalStuffWithClick() {
}

//First click
$('#myBtn').click(function() {
    // switch off this event handler
    $(this).off('click');
    // do stuff with first click
    // ....
    doNormalStuffWithClick();

    // Set up handler for subsequent clicks
    $("#myBtn").click(function() {
      doNormalStuffWithClick();
    });
}

答案 1 :(得分:0)

听起来您想要阻止用户在ajax功能完成之前单击您的按钮。有几种方法可以做到这一点。最简单的方法如下:

var ajaxCount = 0;

$.ajax('some/url', function(res){
    ajaxCount++
    // code here
});

$.ajax('some/url', function(res){
    ajaxCount++
    // code here
});

$('#myBtn').click(function(e){
    if(ajaxCount != 2) return false;

    // code here
});

在这种形式中,您只需检查以确保两个ajax函数都已触发。

答案 2 :(得分:0)

如果在完成AJAX请求之前绑定代码是个问题,可以在ajaxSuccess上调用它:

$(document).ajaxSuccess(function () {
    // do stuff
});

如果要在完成所有AJAX请求后执行某些操作,可以检查每个请求开始时可以设置的变量。您甚至可以尝试使用ajaxStart更改当前请求的数量,然后在ajaxSuccess

中进行检查
$(document).ajaxStart(function () {
    // do something
});