js添加多个窗口监听事件
2017-07-19 17:28
197 查看
看过一个文章,说js有相对较多的瑕疵,对此,我是比较认同的,就如我将要说的js的窗口监听事件,如窗口改变大小事件需要定义window.resize函数。
但,相当多的情况是:不只在一地方或者一个时刻监听window.resize,此时就需要有多个回调函数,如果再定义window.resize函数就会覆盖之前定义好的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,此时就需要有多个回调函数,如果再定义window.resize函数就会覆盖之前定义好的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);
定义一个这个的方法,之后使用该方法:
function onResizeEvent() { console.log(window.innerWidth, window.innerHeight); } onWindowResize.add(onResizeEvent);
完毕。
相关文章推荐
- JS针对浏览器窗口关闭事件的监听方法
- js监听和触发浏览器窗口关闭事件
- JS事件监听的添加方法
- 如何为js控件添加事件监听
- JS事件监听的添加方法
- JS 添加/删除事件监听
- js键盘事件监听,给页面操作添加快捷键,提高用户体验效果。
- cocos2d JS touch(触摸监听)-快速添加事件监听器到管理器
- JS添加/绑定事件监听函数并传参数attachEvent和addEventListener兼容个浏览器
- js监听窗口关闭事件
- JS针对浏览器窗口关闭事件的监听方法集锦
- js监听返回事件,返回直接关闭窗口事件(微信网页返回关闭)
- js动态创建的元素添加监听事件
- js 获取当前焦点所在的元素、给元素和input控件添加键盘监听事件、添加页面级的键盘监听事件
- js事件监听 解绑 添加兼容写法
- js下拉列表添加监听事件(支持所有主流浏览器)
- js中如何添加一个事件监听addEventListener
- js 添加监听事件,包含jquery和DOM对象的转换
- 用JS或者jQuery监听 浏览器窗口大小的变化事件
- JS事件监听的添加方法