如何结束新呼叫的上一个函数调用?

时间:2018-03-06 18:56:24

标签: javascript jquery

<html><head>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script>
<script>
    $( window ).on( "load", function() {
        myfunc();
    });

    $(window).resize(function() {
        clearTimeout(this.id);
        this.id = setTimeout(myfunc, 200);
    });

    function myfunc(){
        $( "#myid" ).click(function() {alert('Hello');});
    }
</script>
</head><body>
<img src="https://assets.servedby-buysellads.com/p/manage/asset/id/32054" id="myid">
</body></html>

使用浏览器中的最小化和展开按钮。首次调整大小后单击图像,您将看到两个警报。第二次调整大小后,您将看到三个警报,依此类推。如何结束新呼叫的上一个功能呼叫,仅查看myfunc()上次呼叫的警报?我需要这种调整大小的方式,因为我需要在调整大小后立即更改其他元素。

3 个答案:

答案 0 :(得分:0)

每次调整窗口大小时,都会调用myfunc函数,该函数会注册相同的回调匿名函数,该函数会一遍又一遍地显示警报。

相反,给出显示alert名称的函数,注册单击函数,调用一个单独命名的函数,只显示一次alert并根据需要调用它:

function showAlert(){
  alert('Hello');
}

$(window).on("load", function(){
  // Separate the code that actually produces the alert
  // so it can be called as needed.
  $("#myid").on("click", showAlert);
  showAlert();
});

$(window).resize(timer);

function timer() {
  clearTimeout(this.id);
  this.id = setTimeout(showAlert, 200);
}
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script>
<img src="https://assets.servedby-buysellads.com/p/manage/asset/id/32054" id="myid">

答案 1 :(得分:0)

问题是resize函数会多次触发,你可以通过调整大小函数中的console.log("Handler for .resize() called.");找到你自己,这样你就会明白发生了什么,以及它为什么会发生。

可以解决此问题的简单修复方法是使用setInterval()函数。

&#13;
&#13;
jQuery(document).ready(function($){
  $(window).on( "load", function() {
    myfunc();
  });
  $(window).resize(function() {
    var loop = setInterval(myfunc, 30);
    clearInterval(loop);
  });
  function myfunc(){
    $("#myid").click(function(){
    	alert('Hello');
    });
  }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img src="https://assets.servedby-buysellads.com/p/manage/asset/id/32054" id="myid">
&#13;
&#13;
&#13;

答案 2 :(得分:-2)

我认为不可能。

Javascript通常不能异步工作。虽然它可以要求浏览器发送数据并传递回调函数,但任何回调都只能在其他所有事情都完成后才会被激活,例如事件。 我想要结束你需要的函数执行 从函数返回。

当它上面有新功能时,无法从堆栈中弹出一个函数。