Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript窗口大小调整事件_Javascript_Window Resize - Fatal编程技术网

JavaScript窗口大小调整事件

JavaScript窗口大小调整事件,javascript,window-resize,Javascript,Window Resize,如何连接到浏览器窗口调整大小事件 虽然有,但我不想仅仅因为这一个要求就把它带到我的项目中。最佳实践是附加到调整大小事件 window.addEventListener('resize',函数(事件){ ... },对); jQuery只是包装标准的resizeDOM事件,例如 window.onresize=函数(事件){ ... }; jQuery可能会做一些工作,以确保在所有浏览器中一致触发调整大小事件,但我不确定是否有任何浏览器不同,但我鼓励您在Firefox、Safari和IE中进行

如何连接到浏览器窗口调整大小事件


虽然有,但我不想仅仅因为这一个要求就把它带到我的项目中。

最佳实践是附加到调整大小事件

window.addEventListener('resize',函数(事件){
...
},对);
jQuery只是包装标准的
resize
DOM事件,例如

window.onresize=函数(事件){
...
};

jQuery可能会做一些工作,以确保在所有浏览器中一致触发调整大小事件,但我不确定是否有任何浏览器不同,但我鼓励您在Firefox、Safari和IE中进行测试。

以下博客文章可能对您有用:

它提供了以下代码:

window.onresize=function(){
//你的代码
};

感谢您在上引用我的博客文章

虽然您可以直接连接到标准的窗口大小调整事件,但您会发现在IE中,该事件每X轴触发一次,每Y轴移动触发一次,导致触发大量事件,如果渲染是一项密集任务,则可能会对站点的性能产生影响


我的方法涉及一个短超时,该超时在后续事件中被取消,以便在用户完成调整窗口大小之前,事件不会冒泡到您的代码中。

永远不要覆盖window.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 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);

window.onresize=函数(){
document.getElementById('ctl00_ContentPlaceHolder1_acordion1')。style.height='100%';
} 

首先,我知道上面的评论中提到了
addEventListener
方法,但我没有看到任何代码。由于这是首选方法,因此:

window.addEventListener('resize', function(event){
  // do stuff here
});

.

如果您只想调整窗口大小和仅调整窗口大小,上述解决方案将起作用。但是,如果希望将调整大小传播到子元素,则需要自己传播事件。下面是一些示例代码:

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

我相信@Alex V已经给出了正确的答案,但答案确实需要一些现代化,因为它已经超过五年了

有两个主要问题:

  • 切勿将
    对象
    用作参数名称。这是一个保留的词。话虽如此,@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
    函数的示例:

    addEvent(window, "resize", function(event) {
      console.log('resized');
    });
    
    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);
    

    决不能直接使用resize事件,因为在调整大小时会连续触发它

    使用去盎司功能来减少多余的调用

    window.addEventListener('resize',去盎司(handler,delay,immediate),false)

    这是一个常见的浮动在网周围的去盎司,不过请务必寻找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);
    

    这里有一个我精心准备的解决方案。

    2018+的解决方案:

    你应该使用。这是一种浏览器本机解决方案,其性能比使用
    resize
    事件要好得多。此外,它不仅支持
    文档上的事件
    ,还支持任意
    元素上的事件


    目前。对于其他(和更老的)浏览器,您必须使用。

    您可以使用以下方法

    
    内容。。。(调整浏览器大小以查看)
    
    谢谢大家。我不关心IE,我更多的是考虑在手机上调整opera的大小。这种方法的一个潜在问题是,您正在覆盖事件,因此无法将多个操作附加到一个事件。addEventListener/attachEvent组合是使javascript与可能在页面上执行的任何其他脚本友好配合的最佳方式。var onresize=window.onresize;window.onresize=函数(事件){if(typeof onresize==='function')onresize();/**…*/}
    window.addEventListener('resize',function(){},true)
    @SubOne是一个完美的例子,说明人们永远不应该这样做。ECMAScript 6:
    window.onresize=()=>{/*code*/}或更好:
    window.addEventListener('resize',()=>{/*code*/})这应该是公认的答案。重写onresize只是一种糟糕的做法。哈,所有额外的空检查是怎么回事?尝试在IE 4.5或其他版本中工作?您想知道如何调用此函数来接收窗口大小调整事件?下面是如何:addEvent(窗口,“调整大小”,函数_参考);:)请注意,从IE 11开始,
    attachEvent
    不再受支持。未来首选的方法是
    addEventListener
    。小心
    elem==undefined
    。有可能(尽管不太可能)出现以下情况:
    window.addEventListener('orientationchange', () => console.log('hello'), false);
    
    var ro = new ResizeObserver( entries => {
      for (let entry of entries) {
        const cr = entry.contentRect;
        console.log('Element:', entry.target);
        console.log(`Element size: ${cr.width}px x ${cr.height}px`);
        console.log(`Element padding: ${cr.top}px ; ${cr.left}px`);
      }
    });
    
    // Observe one or multiple elements
    ro.observe(someElement);
    
    <body onresize="yourHandler(event)">