我怎么能挂钩到浏览器窗口调整大小事件?
jQuery有一种监听调整大小事件的方法,但我不希望仅仅为了这一需求而将其引入我的项目中。
我怎么能挂钩到浏览器窗口调整大小事件?
jQuery有一种监听调整大小事件的方法,但我不希望仅仅为了这一需求而将其引入我的项目中。
当前回答
永远不要重写窗口。onresize函数。
相反,应该创建一个函数来向对象或元素添加事件侦听器。 这将检查监听器,如果监听器不工作,那么它将覆盖对象的函数作为最后的手段。这是jQuery等库中使用的首选方法。
对象:元素或窗口对象 类型:调整大小,滚动(事件类型) 回调:函数引用
var addEvent = function(object, type, callback) {
if (object == null || typeof(object) == 'undefined') return;
if (object.addEventListener) {
object.addEventListener(type, callback, false);
} else if (object.attachEvent) {
object.attachEvent("on" + type, callback);
} else {
object["on"+type] = callback;
}
};
那么用法是这样的:
addEvent(window, "resize", function_reference);
或者使用匿名函数:
addEvent(window, "resize", function(event) {
console.log('resized');
});
其他回答
var EM = new events_managment();
EM.addEvent(window, 'resize', function(win,doc, event_){
console.log('resized');
//EM.removeEvent(win,doc, event_);
});
function events_managment(){
this.events = {};
this.addEvent = function(node, event_, func){
if(node.addEventListener){
if(event_ in this.events){
node.addEventListener(event_, function(){
func(node, event_);
this.events[event_](win_doc, event_);
}, true);
}else{
node.addEventListener(event_, function(){
func(node, event_);
}, true);
}
this.events[event_] = func;
}else if(node.attachEvent){
var ie_event = 'on' + event_;
if(ie_event in this.events){
node.attachEvent(ie_event, function(){
func(node, ie_event);
this.events[ie_event]();
});
}else{
node.attachEvent(ie_event, function(){
func(node, ie_event);
});
}
this.events[ie_event] = func;
}
}
this.removeEvent = function(node, event_){
if(node.removeEventListener){
node.removeEventListener(event_, this.events[event_], true);
this.events[event_] = null;
delete this.events[event_];
}else if(node.detachEvent){
node.detachEvent(event_, this.events[event_]);
this.events[event_] = null;
delete this.events[event_];
}
}
}
您可以使用以下方法,这是好的小项目
<body onresize="yourHandler(event)">
函数yourHandler(e) { console.log(大小:,e.target.innerWidth) } <身体onresize = " yourHandler(事件)" > 内容……(调整浏览器大小查看) < /身体>
永远不要重写窗口。onresize函数。
相反,应该创建一个函数来向对象或元素添加事件侦听器。 这将检查监听器,如果监听器不工作,那么它将覆盖对象的函数作为最后的手段。这是jQuery等库中使用的首选方法。
对象:元素或窗口对象 类型:调整大小,滚动(事件类型) 回调:函数引用
var addEvent = function(object, type, callback) {
if (object == null || typeof(object) == 'undefined') return;
if (object.addEventListener) {
object.addEventListener(type, callback, false);
} else if (object.attachEvent) {
object.attachEvent("on" + type, callback);
} else {
object["on"+type] = callback;
}
};
那么用法是这样的:
addEvent(window, "resize", function_reference);
或者使用匿名函数:
addEvent(window, "resize", function(event) {
console.log('resized');
});
调整大小事件永远不应该直接使用,因为它在我们调整大小时不断被触发。
使用debounce函数来减少多余的调用。
窗口。addEventListener(“resizz”,debounce(handler, delay,即时性),假的);
这是一个常见的反弹漂浮在网上,尽管要寻找更先进的功能在lodash。
const debounce = (func, wait, immediate) => {
var timeout;
return () => {
const context = this, args = arguments;
const later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
这个可以这样使用……
window.addEventListener('resize', debounce(() => console.log('hello'),
200, false), false);
它不会每200毫秒发射一次以上。
移动方向变化使用:
window.addEventListener('orientationchange', () => console.log('hello'), false);
这是一个小的图书馆,我把它整理在一起。
上面已经提到的解决方案将工作,如果你想做的只是调整窗口的大小。但是,如果希望将调整大小传播到子元素,则需要自己传播事件。下面是一些示例代码:
window.addEventListener("resize", function () {
var recResizeElement = function (root) {
Array.prototype.forEach.call(root.childNodes, function (el) {
var resizeEvent = document.createEvent("HTMLEvents");
resizeEvent.initEvent("resize", false, true);
var propagate = el.dispatchEvent(resizeEvent);
if (propagate)
recResizeElement(el);
});
};
recResizeElement(document.body);
});
注意,子元素可以调用
event.preventDefault();
作为resize事件的第一个参数传入的事件对象。例如:
var child1 = document.getElementById("child1");
child1.addEventListener("resize", function (event) {
...
event.preventDefault();
});