【问题标题】:How to call javascript function only once during window resize event?如何在窗口调整大小事件期间只调用一次javascript函数?
【发布时间】:2011-03-12 04:35:47
【问题描述】:

在 jQuery resize event page 上据说:

"调整大小处理程序中的代码不应该 依赖的次数 处理程序被调用。根据 实现,调整大小事件可以 在调整大小时连续发送 进行中(典型的行为在 基于 Internet Explorer 和 WebKit Safari 和 Chrome 等浏览器), 或仅在调整大小结束时 操作(在典型的行为 火狐)。”

现在我观察到我的应用程序中的内存泄漏越来越多,因为我不断调整浏览器窗口的大小,而这又会不断触发特定代码。我认为在调整大小操作结束时只调用一次调整大小事件,但现在阅读此内容后,我认为我的代码只是过度杀伤自己。

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

【问题讨论】:

    标签: jquery cross-browser webkit resize


    【解决方案1】:

    我在 Firefox 启动时接到了多个电话(在 XUL Addon 中工作)。如果您想一次只调用一次代码(在代码已经运行时再次调用代码会导致错误),您可以只使用触发器(标志 [布尔值])。

    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);
    

    【讨论】:

      【解决方案2】:

      感谢您的提示,但我认为它不适用于像 IE 或 Webkit 这样在调整大小时不断触发事件的浏览器。 这就是为什么: 假设窗口几秒钟没有调整大小,然后你调整它: 在第一个触发事件时,lastTime 变量将小于 new Date,因此将执行调整大小的代码。 由于其他事件在调整大小时以高速率触发,它们都将不足一秒并且不会触发。最终结果是,对于我们试图捕获的最终窗口大小,调整大小不会发生。

      如果我误解了您的代码,请立即告诉我,因为我正在为此寻找解决方案,并且我想避免像其他解决方案那样涉及过多的计时器。

      谢谢。

      【讨论】:

        【解决方案3】:

        所以我认为这个答案最好通过执行以下操作而不是 $.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
        }
        

        【讨论】:

          【解决方案4】:

          无论如何,您都在使用 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 毫秒内没有再次调用调整大小处理程序(即没有触发调整大小事件)时才会执行。如果是这样,计时器将中止并启动一个新计时器。

          【讨论】:

          • 谢谢 :) 虽然您的第一个链接似乎已损坏。
          • @jayarjo:哎呀抱歉 :) 已修复。
          【解决方案5】:

          你可以使用一个标志。在函数开始时设置标志 - 如果在调整大小完成后取消设置。然后除非标志已被重置,否则不允许再次调用该函数。

          【讨论】:

            【解决方案6】:

            如果您向我们展示您的调整大小事件处理程序,我认为会有所帮助。

            如果没有看到您的代码,我只能建议使用某种限制来限制每秒可以触发处理程序的次数:

            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;
                }
            });
            

            【讨论】:

            • 不确定回调代码在此处的相关性。但是感谢您的解决方案:)
            猜你喜欢
            • 2010-10-13
            • 1970-01-01
            • 2014-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-21
            相关资源
            最近更新 更多