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

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');
});

其他回答

我相信@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);

下面的博文可能对你有用:修复IE中的窗口大小调整事件

它提供了以下代码:

Sys.Application.add_load(function(sender, args) { $addHandler(窗口,“调整大小”,window_resize); }); var resizeTimeoutId; 函数 window_resize(e) { window.clearTimeout(resizeTimeoutId); resizeTimeoutId = window.setTimeout('doResizeCode();', 10); }

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

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

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

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

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

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

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

</script>