代码之家  ›  专栏  ›  技术社区  ›  jayarjo

如何在窗口调整事件中只调用一次javascript函数?

  •  1
  • jayarjo  · 技术社区  · 14 年前

    resize event page

    “调整大小处理程序中的代码不应 已调用处理程序。取决于 在调整大小时连续发送 进行中(中的典型行为) 基于Internet Explorer和WebKit 浏览器,如Safari和Chrome), 或者只在调整大小的最后一次

    现在,我观察到我的应用程序内存泄漏不断增加,因为我不断调整浏览器窗口的大小,这反过来又不断触发特定的代码。我原以为resize事件在resize操作结束时只调用一次,但现在读了这篇文章后,我认为我的代码只是在自我杀戮。

    当调整大小操作已经结束时,是否有任何惯例只触发跨浏览器回调一次?

    6 回复  |  直到 14 年前
        1
  •  6
  •   Felix Kling    14 年前

    既然您正在使用jQuery,请看一下 Ben Alman's doTimeout plugin debounce 事件处理程序。

    甚至还有一个 example that matches exactly your case

    $(window).resize(function(){
      $.doTimeout( 'resize', 250, function(){
        // do something computationally expensive
      });
    });
    

    这里的关键是,传递给 doTimeout 仅当在接下来的250毫秒内未再次调用调整大小处理程序(即未触发调整大小事件)时才执行。如果是,则中止计时器并启动新的计时器。

        2
  •  3
  •   tonejac    13 年前

    因此,我认为最好是执行以下操作,而不是$.doTimeout方法(该方法似乎不希望在另一个JQuery语句中运行):

    // create a global timer var:
    var _timeVar;
    
    // create your jQuery window resize method. The clearTimeout() method prevents the
    $(window).resize(function(){
        clearTimeout( _timerVar );
        _timerVar = setTimeout('resizeUI()', 250);
    });
    
    // my resize function
    function resizeUI() {
        // resize stuff here
    }
    
        3
  •  1
  •   James    14 年前

    在没有看到您的代码的情况下,我建议您使用某种方法来限制每秒可以触发处理程序的次数:

    var lastTime = 0;
    $(window).resize(function(){
        // This condition will only be met (at most) once every second
        if (lastTime + 1000 < +new Date) {
            // do your stuff...
            lastTime = +new Date;
        }
    });
    
        4
  •  0
  •   matpol    14 年前

        5
  •  0
  •   Raymond    13 年前

    假设窗口有几秒钟没有调整大小,然后调整大小: 在第一次触发事件时,lastTime var将小于new Date,因此将执行调整大小的代码。

    请让我现在如果我误解了你的代码,因为我正在寻找一个解决这个问题的办法,我想避免有太多的定时器参与其他解决方案的建议。

    谢谢。

        6
  •  0
  •   Pavel Křupala    12 年前

    当Firefox启动时(在xuladdon中工作),我接到多个电话。如果您想一次只调用一次代码(当代码已经在运行时再次调用代码时引起的错误),您可以只使用触发器(标志[boolean value])。

    MyClass = {
      is_resizing: false,
      // another variables here...
    
      resized: function() {
        if (! MyClass.is_resizing) {
          // your code goes here...
        }
      },
    
      // another methods here...
    };
    
    window.addEvenetListener('resize', function(e) { MyClass.resized(); e.stopPropagation(); }, false);