Sự kiện thay đổi kích thước cửa sổ trình duyệt chéo - JavaScript / jQuery


240

Phương pháp chính xác (hiện đại) để gõ vào sự kiện thay đổi kích thước cửa sổ hoạt động trong Firefox, WebKit và Internet Explorer là gì?

Và bạn có thể bật / tắt cả hai thanh cuộn không?


Tôi cũng đang xem xét điều này. Tôi muốn thử áp dụng các giải pháp được cung cấp ở đây, nhưng tôi sợ tôi không hiểu cú pháp: $ (cửa sổ). Đó có phải là một cái gì đó cụ thể cho jquery?
Byff

1
Byff, vâng, $ (window) là một cấu trúc jQuery. window.onresize là tương đương trong JavaScript thô.
Andrew Hedges

Bản demo này có thể giúp mọi người thử nghiệm trên tất cả các trình duyệt jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe

window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/ Mạnh
Dylan Valade

Trên Opera trên thiết bị di động, nó được kích hoạt mỗi khi thanh trên cùng (giao diện người dùng trình duyệt) hiển thị / ẩn.
psur

Câu trả lời:


367

jQuery có một phương thức tích hợp sẵn cho việc này:

$(window).resize(function () { /* do something */ });

Vì mục đích đáp ứng UI, bạn có thể cân nhắc sử dụng setTimeout để gọi mã của mình chỉ sau một số mili giây, như trong ví dụ sau, lấy cảm hứng từ điều này :

function doSomething() {
    alert("I'm done resizing for the moment");
};

var resizeTimer;
$(window).resize(function() {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(doSomething, 100);
});

34
Tại sao sự kiện này không được kích hoạt khi cửa sổ được mở rộng ra toàn màn hình bằng nút?
Sly

2
@Sly Đối với tôi nó hoạt động, trong Safari, Chrome và Mozilla trên Mac. Bạn sử dụng trình duyệt nào?
Đánh dấu Vital

2
@Sly:$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
Zack Zatkin-Gold

6
Ê-li, đây là JavaScript. Những gì bạn đã viết là không chính xác (ngoại trừ một trường hợp cụ thể khi bạn đang xây dựng với mới).
Yoh Suzuki

3
Điều đáng nói là hàm jQuery này "thêm" một lệnh gọi hàm vào danh sách các hàm hiện tại sẽ được gọi trên một cửa sổ thay đổi kích thước. Nó không ghi đè các sự kiện hiện có đang được lên lịch trên một cửa sổ thay đổi kích thước.
RTF

48
$(window).bind('resize', function () { 

    alert('resize');

});

4
Tôi thích cách tiếp cận liên kết hơn, vì phương thức resize () thực sự là một lối tắt cho cách tiếp cận liên kết đầy đủ và tôi thường thấy rằng thường có nhiều hơn một trình xử lý sự kiện mà tôi nên áp dụng cho một phần tử.
Mike Kormendy

@Mike - Không chỉ vậy, nhưng tôi đoán phương pháp thay đổi kích thước không có phương thức "hủy liên kết" trong trường hợp bạn muốn loại bỏ người nghe. "Liên kết" chắc chắn là con đường để đi!
Shane

43

Đây là cách không phải là jQuery để gõ vào sự kiện thay đổi kích thước:

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

Nó hoạt động trên tất cả các trình duyệt hiện đại. Nó không tiết kiệm bất cứ điều gì cho bạn. Đây là một ví dụ về nó trong hành động.


giải pháp này sẽ không hoạt động trong IE. Đã sửa phiên bản với sự hỗ trợ của IE dom: stackoverflow.com/questions/6927637/ trộm
Sergey

1
> Nó không tiết kiệm bất cứ điều gì cho bạn. Bạn có thể vui lòng giải thích? Điều gì nên / sẽ điều tiết? Nó có liên quan đến sự kiện bắn nhiều lần liên tiếp không?
josinalvo

@josinalvo nói chung khi bạn đang nghe một sự kiện phát sinh nhiều thứ bạn sẽ muốn gỡ lỗi (ví dụ: lodash) để bạn không gây ra tắc nghẽn trong chương trình của mình.
Jondlm

17

Xin lỗi để đưa ra một chủ đề cũ, nhưng nếu ai đó không muốn sử dụng jQuery, bạn có thể sử dụng điều này:

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

8
Chỉ cần lưu ý rằng điều này sẽ ghi đè bất kỳ trình xử lý hiện có nào có thể bị ràng buộc với window.onresize. Nếu tập lệnh của bạn phải sống một hệ sinh thái với các tập lệnh khác, bạn không nên cho rằng tập lệnh của mình là tập lệnh duy nhất muốn thực hiện thay đổi kích thước cửa sổ. Nếu bạn không thể sử dụng một khung công tác như jQuery, ít nhất bạn nên xem xét việc lấy window.onresize hiện có và thêm trình xử lý của bạn vào cuối của nó, thay vì hoàn toàn ghi đè lên nó.
Tom Auger

2
@TomAuger "ít nhất bạn nên xem xét lấy cửa sổ hiện có.onresize và thêm trình xử lý của bạn vào cuối của nó" - bạn có thể có nghĩa ngược lại, tức là "gọi trình xử lý hiện có ở cuối trình xử lý của bạn"? Tôi thực sự muốn thấy một mã javascript sẽ thêm một cái gì đó vào cuối chức năng đã có :-)
TMS

Tôi thấy quan điểm của bạn, theo một nghĩa nào đó - trình xử lý onResize mới của bạn cần phải bọc onResize hiện có. Tuy nhiên, nó không phải gọi hàm bạn muốn thêm vào onResize cho đến khi nó được gọi là trình xử lý onResize ban đầu. Vì vậy, bạn vẫn có thể đảm bảo hàm onResize mới của bạn thực thi sau hàm onResize ban đầu, có lẽ tốt hơn ngược lại.
Tom Auger


5

Sử dụng jQuery 1.9.1 Tôi mới phát hiện ra rằng, mặc dù giống hệt về mặt kỹ thuật) *, nhưng điều này không hoạt động trong IE10 (nhưng trong Firefox):

// did not work in IE10
$(function() {
    $(window).resize(CmsContent.adjustSize);
});

trong khi điều này làm việc trong cả hai trình duyệt:

// did work in IE10
$(function() {
    $(window).bind('resize', function() {
        CmsContent.adjustSize();
    };
});

Chỉnh sửa
:) * Trên thực tế không giống hệt về mặt kỹ thuật, như đã lưu ý và giải thích trong các nhận xét của WraithKennyHenry Blyth .


1
Có hai thay đổi. Cái nào có tác dụng? ( .resize()Để .bind('resize')? Hoặc thêm chức năng ẩn danh Tôi nghĩ đó là thứ hai.)
WraithKenny

@WraithKenny Điểm tốt. Rất có thể là việc thêm chức năng ẩn danh là điều làm cho nó hoạt động. Tôi không nhớ nếu tôi đã thử nó.
bassim

1
Trong trường hợp đầu tiên, adjustSizephương thức mất bối cảnh của nó this, trong khi cuộc gọi thứ hai CmsContent.adjustSize()bảo tồn this, tức là this === CmsContent. Nếu CmsContenttrường hợp được yêu cầu trong adjustSizephương thức, thì trường hợp đầu tiên sẽ thất bại. Trường hợp thứ hai sẽ hoạt động cho mọi loại lệnh gọi hàm, vì vậy, luôn luôn nên chuyển một hàm ẩn danh.
Henry Blyth

1
@HenryBlyth Cảm ơn bạn! +1
bassim

4

jQuerycung cấp $(window).resize()chức năng theo mặc định:

<script type="text/javascript">
// function for resize of div/span elements
var $window = $( window ),
    $rightPanelData = $( '.rightPanelData' )
    $leftPanelData = $( '.leftPanelData' );

//jQuery window resize call/event
$window.resize(function resizeScreen() {
    // console.log('window is resizing');

    // here I am resizing my div class height
    $rightPanelData.css( 'height', $window.height() - 166 );
    $leftPanelData.css ( 'height', $window.height() - 236 );
});
</script> 

3

Tôi coi plugin jQuery "Sự kiện thay đổi kích thước jQuery" là giải pháp tốt nhất cho việc này vì nó đảm nhiệm việc điều chỉnh sự kiện để nó hoạt động giống nhau trên tất cả các trình duyệt. Nó tương tự như câu trả lời của Andrew nhưng tốt hơn vì bạn có thể nối sự kiện thay đổi kích thước vào các thành phần / bộ chọn cụ thể cũng như toàn bộ cửa sổ. Nó mở ra những khả năng mới để viết mã sạch.

Các plugin có sẵn ở đây

Có vấn đề về hiệu suất nếu bạn thêm nhiều người nghe, nhưng đối với hầu hết các trường hợp sử dụng thì nó hoàn hảo.


0

Tôi nghĩ bạn nên thêm quyền kiểm soát này:

    var disableRes = false;
    var refreshWindow = function() {
        disableRes = false;
        location.reload();
    }
    var resizeTimer;
    if (disableRes == false) {
        jQuery(window).resize(function() {
            disableRes = true;
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(refreshWindow, 1000);
        });
    }

0

hy vọng nó sẽ giúp ích cho jQuery

xác định một chức năng trước, nếu có một chức năng hiện có bỏ qua bước tiếp theo.

 function someFun() {
 //use your code
 }

thay đổi kích thước trình duyệt như thế này.

 $(window).on('resize', function () {
    someFun();  //call your function.
 });

0

Bên cạnh các chức năng thay đổi kích thước cửa sổ được đề cập, điều quan trọng là phải hiểu rằng các sự kiện thay đổi kích thước sẽ kích hoạt rất nhiều nếu được sử dụng mà không làm suy giảm các sự kiện.

Paul Irish có một chức năng tuyệt vời công bố các cuộc gọi thay đổi kích thước rất nhiều. Rất khuyến khích sử dụng. Hoạt động đa trình duyệt. Đã thử nghiệm nó trong IE8 vào một ngày khác và tất cả đều ổn.

http://www.paulirish.com/2009/throttled-smartresize-jquery-event-handler/

Hãy chắc chắn kiểm tra bản demo để thấy sự khác biệt.

Đây là chức năng cho sự hoàn chỉnh.

(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...
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.