我怎么能挂钩到浏览器窗口调整大小事件?
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');
});
其他回答
window.onresize = function() {
// your code
};
调整大小事件永远不应该直接使用,因为它在我们调整大小时不断被触发。
使用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);
这是一个小的图书馆,我把它整理在一起。
下面的博文可能对你有用:修复IE中的窗口大小调整事件
它提供了以下代码:
Sys.Application.add_load(function(sender, args) { $addHandler(窗口,“调整大小”,window_resize); }); var resizeTimeoutId; 函数 window_resize(e) { window.clearTimeout(resizeTimeoutId); resizeTimeoutId = window.setTimeout('doResizeCode();', 10); }
<script language="javascript">
window.onresize = function() {
document.getElementById('ctl00_ContentPlaceHolder1_Accordion1').style.height = '100%';
}
</script>
我相信@Alex V已经给出了正确的答案,但答案确实需要一些现代化,因为它现在已经超过5年了。
主要有两个问题:
永远不要使用object作为参数名。这是一个保留词。话虽如此,@Alex V提供的函数将不能在严格模式下工作。 如果使用了addEventListener方法,@Alex V提供的addEvent函数不会返回事件对象。为此,应该向addEvent函数添加另一个参数。
注意:addEvent的新形参被设置为可选的,因此迁移到这个新函数版本将不会中断之前对该函数的任何调用。将支持所有遗留使用。
下面是addEvent函数的更新:
/*
function: addEvent
@param: obj (Object)(Required)
- The object which you wish
to attach your event to.
@param: type (String)(Required)
- The type of event you
wish to establish.
@param: callback (Function)(Required)
- The method you wish
to be called by your
event listener.
@param: eventReturn (Boolean)(Optional)
- Whether you want the
event object returned
to your callback method.
*/
var addEvent = function(obj, type, callback, eventReturn)
{
if(obj == null || typeof obj === 'undefined')
return;
if(obj.addEventListener)
obj.addEventListener(type, callback, eventReturn ? true : false);
else if(obj.attachEvent)
obj.attachEvent("on" + type, callback);
else
obj["on" + type] = callback;
};
新建addEvent函数的示例调用:
var watch = function(evt)
{
/*
Older browser versions may return evt.srcElement
Newer browser versions should return evt.currentTarget
*/
var dimensions = {
height: (evt.srcElement || evt.currentTarget).innerHeight,
width: (evt.srcElement || evt.currentTarget).innerWidth
};
};
addEvent(window, 'resize', watch, true);