修复lte ie8 chrome 下window 的resize 事件多次执行

2024-03-25 01:58

本文主要是介绍修复lte ie8 chrome 下window 的resize 事件多次执行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/**
* window.onresize 事件 专用事件绑定器 v0.1 Alucelx
* http://www.cnblogs.com/Alucelx/archive/2011/10/20/2219263.html
* <description>
*   用于解决 lte ie8 & chrome 及其他可能会出现的 原生 window.resize 事件多次执行的 BUG.
* </description>
* <methods>
*   add: 添加事件句柄
*   remove: 删除事件句柄
* </methods>
*/
var  onWindowResize = function (){
     //事件队列
     var  queue = [],
     indexOf = Array.prototype.indexOf || function (){
         var  i = 0, length = this .length;
         for ( ; i < length; i++ ){
             if ( this [i] === arguments[0]){
                 return  i;
             }
         }
         return  -1;
     };
     var  isResizing = {}, //标记可视区域尺寸状态, 用于消除 lte ie8 / chrome 中 window.onresize 事件多次执行的 bug
     lazy = true , //懒执行标记
     listener = function (e){ //事件监听器
         var  h = window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || document.body.clientHeight,
             w = window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || document.body.clientWidth;
         if ( h === isResizing.h && w === isResizing.w){
             return ;
         } else {
             e = e || window.event;
         
             var  i = 0, len = queue.length;
             for ( ; i < len; i++){
                 queue[i].call( this , e);
             }
             isResizing.h = h,
             isResizing.w = w;
         }
     }
     return  {
         add: function (fn){
             if ( typeof  fn === 'function' ){
                 if (lazy){ //懒执行
                     if (window.addEventListener){
                         window.addEventListener( 'resize' , listener, false );
                     } else {
                         window.attachEvent( 'onresize' , listener);
                     }
                     lazy = false ;
                 }
                 queue.push(fn);
             } else {  }
             return  this ;
         },
         remove: function (fn){
             if ( typeof  fn === 'undefined' ){
                 queue = [];
             } else  if ( typeof  fn === 'function' ){
                 var  i = indexOf.call(queue, fn);
                 if (i > -1){
                     queue.splice(i, 1);
                 }
             }
             return  this ;
         }
     };
}.call( this );

绑定window 的 resize 事件,请使用这个对象

示例:

?
var  _fn = function (){document.body.innerHTML += "1" };
onWindowResize.add(_fn)
     .add( function (){document.body.innerHTML += "2" })
     .add( function (){document.body.innerHTML += "3" })
     .remove(_fn);

这篇关于修复lte ie8 chrome 下window 的resize 事件多次执行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843499

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa