【问题标题】:jQuery resize() using browser maximise buttonjQuery resize() 使用浏览器最大化按钮
【发布时间】:2017-10-03 13:48:18
【问题描述】:

这是我在调整窗口大小时触发的代码:

$(window).resize(function()
{   
    setDisplayBoardSize();
});

当我调整窗口大小并正常运行我的函数时触发正常,正如预期的那样。

如果我点击最大化按钮,虽然它不能正常工作。

这是 setDisplayBoardSize() 函数:

function setDisplayBoardSize()
{
    var width = $(".display_container").width();

    for (i=min_columns; i<=max_columns; i++)
    {
        if ((width > (i*(item_width + gap))) && (width < ((i+1) * (item_width + gap))) )
        {
            $("#display_board").css("width",(i*(item_width + gap))+ "px");
        }
    }
}

我认为问题在于,当单击浏览器最大化按钮时,它会触发读取获取 .display_container 宽度的函数在调整大小之前,然后将窗口大小调整为最大值,这意味着我的 display_board 是尺寸不正确。

如果我是对的,我怎样才能获得 .display_container 元素的大小窗口已调整到最大值?

请注意,我已经在 Chrome 和 Firefox 中对此进行了测试

谢谢

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    这也发生在我身上,我不知道为什么,直到我读了你的帖子。好像你是对的,在我按下最大化之前函数被触发,所以为了解决这个问题,我使用了一点延迟。

    $(window).resize(function()
    {   
    setTimeout(function() {
        setDisplayBoardSize();
    }, 100);
    });

    【讨论】:

    • 您,先生,是唯一真正解决了我问题的人。您的解决方案非常简单且易于实施。如果可以的话,我会给你+100。非常感谢。
    • 完美!我将我的超时设置为 50 秒,它运行良好。谢谢!
    【解决方案2】:

    我在一个响应式网站上遇到了类似的问题,除了图片幻灯片之外,每个资产都会适当地调整大小和移动。这仅发生在 IE 中,并且仅发生在您从平板电脑断点处开始,然后单击最大化按钮并进入桌面断点时。

    最终解决问题的是使用 Paul Irish 提供的这个方便的代码来限制调整大小触发器:

    (function($,sr){
    
      // debouncing function from John Hann
      // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
      var debounce = function (func, threshold, execAsap) {
          var timeout;
    
          return function debounced () {
              var obj = this, args = arguments;
              function delayed () {
                  if (!execAsap)
                      func.apply(obj, args);
                  timeout = null;
              };
    
              if (timeout)
                  clearTimeout(timeout);
              else if (execAsap)
                  func.apply(obj, args);
    
              timeout = setTimeout(delayed, threshold || 100);
          };
      }
      // smartresize 
      jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };
    
    })(jQuery,'smartresize');
    
    
    // usage:
    $(window).smartresize(function(){
      // code that takes it easy...
    });
    

    您可以在此处查看他的完整帖子(从 2009 年开始):http://www.paulirish.com/2009/throttled-smartresize-jquery-event-handler/

    希望能帮助到那里的人。

    【讨论】:

    • 这真的很有用。 Underscore 也有一个 debounce 函数(可能是相同的去抖函数?)所以如果你使用它就更容易了!!
    【解决方案3】:

    编辑建议的修复:

    这里是working jsFiddle 这是results only demo

    如您所见,我完全重构了您原来的 jQuery 代码。我从 Global 中删除了所有内容并删除了这些功能。 .resize() 已经需要一个函数,所以我只需在该函数内执行所有操作,然后立即调用 .resize() 在初始页面加载时调用它。

    我做的另一个改变是向后增加你的 for 循环,从你允许的最宽的宽度开始 (5),一直到你允许的最小的宽度 (2)。

    另外,在您的 for 循环中,我创建了 jk 变量,以便更容易阅读这些条件。

    主要变化是 if 语句。如果我们在 max_column 迭代中并且容器的宽度更宽 k,我们希望将板的宽度设置为 k 并跳出 for 循环,否则我们评估你原来的 if 语句,否则如果我们在 min_column 迭代中,容器的宽度小于j,我们想将板子的宽度设置为j

    我在 Chrome 中对此进行了测试,效果很好。希望对您有所帮助。

    $(document).ready(function()
    {    
        $(window).resize(function() 
        {
            var item_width = 200, 
                item_height = 300, 
                gap = 20,
                min_columns = 2, 
                max_columns = 5,
                min_width = min_columns * (item_width + gap), 
                max_width = max_columns * (item_width + gap),
                container_width = $(".display_container").width(),
                $display_board = $("#display_board"),
                $display_board_ol_li = $display_board.find("ol > li");
    
            //console.log("container width: " + container_width);
    
            for (var i = max_columns; i >= min_columns; i--)
            {
                var j = i * (item_width + gap),
                    k = (i+1) * (item_width + gap);
    
                //console.log("j: " + j);
                //console.log("k: " + k);
                //console.log("display_board width (before): " + $display_board.css("width"));
    
                if (i === max_columns && container_width > k) 
                {
                    $display_board.css("width", max_width + "px");
                    //console.log("display_board width (after): " + $display_board.css("width"));
                    break;                
                } 
                else if (container_width > j && container_width < k)
                {
                    $display_board.css("width", j + "px");
                    //console.log("display_board width (after): " + $display_board.css("width"));
                    break;
                }
                else if (i === min_columns && container_width < j) 
                {
                    $display_board.css("width", min_width + "px");
                    //console.log("display_board width (after): " + $display_board.css("width"));
                }
            }
    
            $display_board_ol_li.css({
    
                "width" : item_width + "px",
                "height": item_height + "px",
                "margin": gap/2 + "px"
    
            });
    
        }).resize();
    
    });​
    

    【讨论】:

    • 这是为了防止 IE 过于频繁地触发 resize 事件,从而实际上让自己陷入困境……
    • 刚刚更新了 OP 说我已经测试过这是 Chrome 和 Firefox。测试 IE 并得到相同的结果,一切正常,但该函数似乎在调整元素大小之前触发(或在元素调整大小之前)。
    • 您能否创建一个jsBinjsFiddle 来展示您的问题?
    • Fiddle is here 令人沮丧的是,当窗口最大化时,它绝对完美地调整大小 - 尝试手动缩小窗口,使我的显示只有 2 列宽,然后最大化。在 jsFiddle 中,它正确显示 4 或 5 列,在我的浏览器(Chrome、Firefox 或 IE)中,它在最大化时保持为 2 列(如果我手动放大它,它将变为 5 列)。我应该注意我的屏幕是 1920 像素宽,所以我有很多列。
    • 附加信息 - 如果您非常快速地手动调整窗口大小,则它不会正确调整元素的大小(但仍会触发事件,因此只是 setDisplayBoardSize 过早地获取了容器的宽度)。
    【解决方案4】:

    一些浏览器如ie和opera触发这个事件有一定的限制,这个插件可以解决这个问题:

    http://benalman.com/projects/jquery-resize-plugin/

    【讨论】:

    • 感谢链接,破解插件。但是我有同样的问题,当我点击浏览器最大化按钮时,我的 JS 没有调整元素的大小,当我手动更改窗口的大小时效果很好,当我点击最大化时,该函数会触发,它只是调整大小调整窗口大小之前的元素,这意味着当窗口最大化时,我留下了一个较小的元素,这意味着我的显示板变成了 3 列画廊而不是 4 列画廊(例如)
    【解决方案5】:
    var window_width_check_big = false, // flag true if window bigger than my_width
    window_width_check_small = false,   // flag true if window smaller than my_width
    my_width = 1221; // Change to your width
    
    function get_window_size() {
        if(window.innerWidth > my_width) {
            window_width_check_big = true;
        }
        if(window.innerWidth < my_width) {
            window_width_check_small = true;
        }   
    }
    
    get_window_size();
    
    $(window).resize(function() {
    
        if(window.innerWidth > my_width) {
            window_width_check_big = true;
        }
        if(window.innerWidth < my_width) {
            window_width_check_small = true;
        }
        if( window_width_check_small && window_width_check_big ) {
            window_width_check_big = false;
            window_width_check_small = false;
            get_window_size();
            // Start function that you need
        }
    });
    

    【讨论】:

    • 请考虑在您的答案中为代码添加解释
    【解决方案6】:

    以下代码在 Chrome 和 IE11 中都适用于我: (javascript 和 jQuery)。

    function setWindowResizeEndEvent() {
    
        $(window).on('resize', setTimerForResizeEnd);
    }
    
    var mResizeTimer;
    function setTimerForResizeEnd() {
        clearTimeout(mResizeTimer);
        mResizeTimer = setTimeout(onResizeEnd, 100);
    }
    
    function onResizeEnd() {
        $(window).off('resize', setTimerForResizeEnd);
        $(window).resize();
    
        setWindowResizeEndEvent();
    }
    

    说明:我正在触发原生 window.resize 事件, 调整大小结束后。 这在最大化窗口结束后重新触发调整大小事件。

    【讨论】:

      【解决方案7】:

      以下代码在 Chrome 和 IE11 中都适用于我: (javascript 和 jQuery)。

      var mResizeTimer;
      function setWindowResizeEndEvent() {
      
          $(window).on('resize', setTimerForResizeEnd);
      }
      
      function setTimerForResizeEnd() {
          clearTimeout(mResizeTimer);
          mResizeTimer = setTimeout(onResizeEnd, 100);
      }
      
      function onResizeEnd() {
          $(window).off('resize', setTimerForResizeEnd);
          $(window).resize();
      
          setWindowResizeEndEvent();
      }
      

      说明:我正在触发原生 window.resize 事件, 调整大小结束后。 这在最大化窗口结束后重新触发调整大小事件。

      【讨论】:

        猜你喜欢
        • 2017-11-10
        • 1970-01-01
        • 2016-06-30
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        相关资源
        最近更新 更多