我怎么能挂钩到浏览器窗口调整大小事件?

jQuery有一种监听调整大小事件的方法,但我不希望仅仅为了这一需求而将其引入我的项目中。


当前回答

最佳实践是添加到resize事件,而不是替换它:

window.addEventListener('resize', function(event) {
    ...
}, true);

另一种方法是为DOM事件创建一个单独的处理程序(但只能有一个),例如。

window.onresize = function(event) {
    ...
};

jQuery可能会做一些工作来确保resize事件在所有浏览器中始终如一地触发,但我不确定是否每个浏览器都不同,但我鼓励您在Firefox、Safari和IE中进行测试。

其他回答

调整大小事件永远不应该直接使用,因为它在我们调整大小时不断被触发。

使用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);

这是一个小的图书馆,我把它整理在一起。

<script language="javascript">
    window.onresize = function() {
    document.getElementById('ctl00_ContentPlaceHolder1_Accordion1').style.height = '100%';
} 

</script>
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_];
        }
    }
}

永远不要重写窗口。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');
});

2018年解决方案+:

您应该使用ResizeObserver。这是一种浏览器原生解决方案,比使用resize事件具有更好的性能。此外,它不仅支持文档上的事件,还支持任意元素上的事件。

var ro = new ResizeObserver(entries => { For (let entry of entries) { const cr = entry.contentRect; console.log(元素:,entry.target); console.log('元素大小:${cr. log。宽度}px x ${cr.height}px '); console.log('元素填充:${cr. log。顶级}px;$ {cr.left} px”); } }); //观察一个或多个元素 ro.observe (someElement);

目前Firefox、Chrome、Safari和Edge支持。对于其他(和旧的)浏览器,您必须使用polyfill。