0

我想保留按钮单击功能的参考,做我的事情,然后运行原始的单击功能。

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

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

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

但是,我有一个特殊情况。在我的页面 onLoad 函数中,有异步 ajax 调用。所以在 document.ready 上调用的函数实际上是在 ajax 代码完成之前调用的。

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

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

编辑 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();      
  });
});
4

3 回答 3

1

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

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();
    });
}
于 2013-01-20T13:05:21.477 回答
0

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

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

如果您想在所有 AJAX 请求完成后做某事,您可以检查您可以在每个请求开始时设置的变量。您甚至可以尝试使用ajaxStart来更改当前请求的数量,然后再将其签入ajaxSuccess

$(document).ajaxStart(function () {
    // do something
});
于 2013-01-20T13:09:00.840 回答
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 函数都已触发。

于 2013-01-20T13:03:18.517 回答