解决Javascript中$(window).resize()多次执行

有些时候,我们需要在浏览器窗口发生变化的时候,动态的执行一些操作,比如做自适应页面时的适配。这个时候,我们需要在窗口拖动的时候去执行代码。但是有些时候,执行的操作比较复杂,我们只希望在窗口拖动完毕之后,在执行代码,否则极容易造成浏览器假死状态,这个时候该如何解决呢。

浏览器窗口发生改变

先来写一下窗口拖动时执行代码的函数,原生JS可用window.onresize Jquery可用$(window).resize()

window.onresize = function(){
    console.log("窗口发生改变了哟!");
}

$(window).resize(function(){
    console.log("窗口发生改变了哟!");
})

这段代码在窗口拖动时会执行多次,如果执行的代码较复杂,极容易造成浏览器假死,对页面性能影响较大。

解决resize执行多次

如何实现不管窗口如何改变,只在停止改变之后才执行代码呢?我们来对之前的代码做下修改:

var resizeTimer = null;
$(window).bind(‘resize‘, function (){
        if (resizeTimer) clearTimeout(resizeTimer);
        resizeTimer = setTimeout(function(){
                console.log("窗口发生改变了哟!");
        } , 500);
});

通过增加定时器的方式来让代码延迟执行,这样每次窗口改变的时候,我们都清除事件,只有当他停下来之后,才会继续执行。这个方法虽然可以解决resize执行多次的问题,但是感觉还不够完美。

wresize插件:

(function($) {
    $.fn.wresize = function(f) {
        version = ‘1.1‘;
        wresize = {
            fired : false,
            width : 0
        };  

    function resizeOnce() {
        if ($.browser.msie) {
            if (!wresize.fired) {
                wresize.fired = true;
            }else{
                var version = parseInt($.browser.version, 10);
                wresize.fired = false;
                if (version < 7) {
                    return false;
                } else if (version == 7) {
                    // a vertical resize is fired once, an horizontal resize
                    // twice
                    var width = $(window).width();
                    if (width != wresize.width) {
                            wresize.width = width;
                            return false;
                    }
                }
            }
        }
        return true;
    }  

    function handleWResize(e) {
        if (resizeOnce()) {
            return f.apply(this, [ e ]);
        }
    }  

    this.each(function() {
        if (this == window) {
            $(this).resize(handleWResize);
        } else {
            $(this).resize(f);
        }
    });
    return this;
    };
})(jQuery);  

这是在网上找到一个jquery插件源码,你可以把他另存为jquery.wresize.js,然后在你的页面引用,并执行以下操作。

function sayHello() {
    console.log("窗口发生改变了哟!");
}
$(window).wresize(sayHello);
时间: 2024-08-28 19:14:30

解决Javascript中$(window).resize()多次执行的相关文章

解决Javascript中$(window).resize()多次执行(转)

https://www.cnblogs.com/shuilangyizu/p/6816756.html 有些时候,我们需要在浏览器窗口发生变化的时候,动态的执行一些操作,比如做自适应页面时的适配.这个时候,我们需要在窗口拖动的时候去执行代码.但是有些时候,执行的操作比较复杂,我们只希望在窗口拖动完毕之后,在执行代码,否则极容易造成浏览器假死状态,这个时候该如何解决呢. 浏览器窗口发生改变 先来写一下窗口拖动时执行代码的函数,原生JS可用window.onresize Jquery可用$(wind

如何处理 jQuery $(window).resize() 中的方法被多次执行的小问题

引言: 估计很多同志们在编写浏览器resize()的方法时,都会遇到这样的情况: 当拖动浏览器的边角时,页面中的一些效果随浏览器大小的改变而触发,这一过程开始到结束,resize() 中的方法被执行了多少次? jquery $(window).resize() 和 javascript window.onresize 有什么区别? 当我们双击浏览器的标题工具栏时,窗口一下子变大或者变小时,resize() 或 window.onresize 中的方法被执行了多少次? 当我们不希望 resize(

解决window.history.go(-1)执行后不刷新页面的问题

在iphone上出现了window.history.go(-1)执行后不刷新页面的问题,安卓不会有这个问题. 解决方法为在返回后的页面加上: window.addEventListener('pageshow', function(e) { //如果检测到页面是从“往返缓存”中读取的,刷新页面 if (e.persisted) { window.location.reload(); } }); 原文地址:https://www.cnblogs.com/luoyihao/p/12665868.ht

JQuery 在$(window).laod() 事件中 不运行 $(window).resize()

本文转载至: http://stackoverflow.com/questions/2597152/jquery-window-resize-doesnt-work-on-load 原文标题   :JQuery: $(window).resize() doesn't work on Load 解决办法总结下  主要有这几种: 方法一:建立一个函数 把你要Resize 的动作写上  然后在  load的时候调用 在resize 的事后也也调用一下 onResize = function() { /

(转)javascript中的this

JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一. 个人也觉得js中的this不是一个好的设计,由于this晚绑定的特性,它可以是全局对象,当前对象,或者…有人甚至因为坑大而不用this. 其实如果完全掌握了this的工作原理,自然就不会走进这些坑.来看下以下这些情况中的this分别会指向什么: 1.全局代码中的this alert(this)//window 全局范围内的this将会指向全局对象,在浏览器中即使window. 2.作为单纯的函数调用 function f

JavaScript代码优化(下载时间和执行速度优化)

JavaScript代码的速度被分成两部分:下载时间和执行速度. 下载时间 Web浏览器下载的是js源码,因此所有长变量名和注释都回包含在内.这个因素会增加下载时间.1160是一个TCP-IP包中的字节数.最好能将每个javascript文件都保持在1160字节以下以获得最优的下载时间.    由于这个原因,要删除注释.删除制表符和空格.删除所有的换行.将长变量名缩短. 遵循这4条比较困难.因此用外部程序(ECMAScript Cruncher)来帮助我们. 要运行ESC,必使用Windows系

JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 □ 事件必须在页面元素加载之后起效 有这样一段简单的代码: <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style>

AOP 在javascript 中的使用

javascript 中的 onload 事件, 支持该事件的HTML标签: <body>, <frame>, <frameset>, <iframe>, <img>, <link>, <script> 支持该事件的javascript 对象: image , layer, window ( Array.prototype.slice(begin, end) 这个方法是 返回数组的一部分, begin不写为0, end不写

JavaScript中window.onload的使用方法

JavaScript中window.onload的使用介绍 window.onload加载事件在页面内容加载完成之后立即执行相应的函数. window.onload使用方法: 1)window.onload=function(){    var tr=obj.parentNode.parentNode;    tr.parentNode.removeChild(tr);   }2)function func(){     var tr=obj.parentNode.parentNode;