Làm cách nào để kích hoạt sự kiện thay đổi kích thước cửa sổ trong JavaScript?


326

Tôi đã đăng ký một kích hoạt trên cửa sổ thay đổi kích thước. Tôi muốn biết làm thế nào tôi có thể kích hoạt sự kiện được gọi. Ví dụ, khi ẩn một div, tôi muốn hàm kích hoạt của mình được gọi.

Tôi tìm thấy window.resizeTo()có thể kích hoạt chức năng, nhưng có giải pháp nào khác không?

Câu trả lời:


381

Nếu có thể, tôi thích gọi hàm hơn là gửi một sự kiện. Điều này hoạt động tốt nếu bạn có quyền kiểm soát mã bạn muốn chạy, nhưng xem bên dưới để biết trường hợp bạn không sở hữu mã.

window.onresize = doALoadOfStuff;

function doALoadOfStuff() {
    //do a load of stuff
}

Trong ví dụ này, bạn có thể gọi doALoadOfStuffhàm mà không cần gửi sự kiện.

Trong các trình duyệt hiện đại của bạn, bạn có thể kích hoạt sự kiện bằng cách sử dụng:

window.dispatchEvent(new Event('resize'));

Điều này không hoạt động trong Internet Explorer, nơi bạn sẽ phải thực hiện lâu dài:

var resizeEvent = window.document.createEvent('UIEvents'); 
resizeEvent.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(resizeEvent);

jQuery có triggerphương thức , hoạt động như thế này:

$(window).trigger('resize');

Và có cảnh báo:

Mặc dù .trigger () mô phỏng kích hoạt sự kiện, hoàn thành với một đối tượng sự kiện được tổng hợp, nhưng nó không sao chép hoàn hảo một sự kiện xảy ra tự nhiên.

Bạn cũng có thể mô phỏng các sự kiện trên một yếu tố cụ thể ...

function simulateClick(id) {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}

6
Chức năng ẩn danh của bạn là không cần thiết. window.onresize = doALoadOfStuff; Ngoài ra, điều này không trả lời câu hỏi, câu trả lời của pinouchon dưới đây là câu trả lời đúng.
Dennis Plucinik

42
Đối với Google r's: Hãy xem câu trả lời của @ avetisk.
Lau Fabian

1
Đó là một ý tưởng tốt để tách rời, nhưng trong trường hợp của tôi / nó, nó không hoạt động. Chỉ gọi phương thức thay đổi kích thước sẽ không hoạt động vì nếu thay đổi kích thước cửa sổ không được kích hoạt, nhiều div / container khác sẽ không có chiều cao phù hợp.
PandaWood

@PandaWood - thì ví dụ cuối cùng của tôi tốt hơn trong trường hợp của bạn.
Fenton

Cảm ơn bạn @ user75525
Bondsmith

675
window.dispatchEvent(new Event('resize'));

11
dường như hoạt động với Chrome, FF, Safari, nhưng không phải: IE!
Davem M

14
jQuery triggerthực sự không kích hoạt sự kiện "thay đổi kích thước" gốc. Nó chỉ kích hoạt các trình lắng nghe sự kiện đã được thêm bằng jQuery. Trong trường hợp của tôi, một thư viện bên thứ 3 đã nghe trực tiếp sự kiện "thay đổi kích thước" bản địa và đây là giải pháp hiệu quả với tôi.
chowey

2
Giải pháp tuyệt vời và đơn giản. Mặc dù, tôi nghĩ bạn nên thêm một số mã để tương thích với IE (theo như tôi thấy, đối với IE, chúng ta phải sử dụng window.fireEvent)
Victor

35
Điều này đã không làm việc trên tất cả các thiết bị cho tôi. tôi đã phải kích hoạt sự kiện như thế này: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('thay đổi kích thước', đúng, sai, cửa sổ, 0); window.dispatchEvent (evt);
Manfred

19
Không thành công với "Đối tượng không hỗ trợ hành động này" trong IE11 của tôi
pomber

156

Với jQuery, bạn có thể thử gọi trình kích hoạt :

$(window).trigger('resize');

3
Trường hợp sử dụng cho điều này là khi một plugin jQuery sử dụng các sự kiện thay đổi kích thước cửa sổ để đáp ứng, nhưng bạn có một thanh bên bị sập. Container của plugin được thay đổi kích thước, nhưng cửa sổ thì không.
isherwood

4
Không cần JQuery thực sự nhưng tôi thích giải pháp JQuery hơn vì sản phẩm của tôi sử dụng JQuery rộng rãi.
Sri

Nơi này sẽ được thêm vào để thay đổi kích thước một trang wordpress sau khi nó được tải?
SAHM

Điều này không hoạt động với tôi trong Chrome mới nhất, câu trả lời này có: stackoverflow.com/a/22638332/1296209
webaholik

1
đây là những gì tôi đã thử ban đầu - nó không hoạt động, nhưng window.dispatchEvent(new Event('resize'));đã làm
user2682863

54

Một JS thuần túy cũng hoạt động trên IE (từ bình luận @Manfred )

var evt = window.document.createEvent('UIEvents'); 
evt.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(evt);

Hoặc cho góc:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});

4
Thật không may là tài liệu cho UIEvent.initUIEvent () nói Do not use this method anymore as it is deprecated.Các tài liệu createEvent nói "Nhiều phương pháp sử dụng với createEvent, chẳng hạn như initCustomEvent, không được tán thành. Sử dụng nhà xây dựng sự kiện để thay thế." Trang này có vẻ hứa hẹn cho các sự kiện UI.
Đua nòng nọc

9
Đúng, nhưng IE11 không hỗ trợ new Event()phương thức. Tôi nghĩ rằng như một hack đối với các trình duyệt cũ hơn, bạn có thể làm điều gì đó như thế if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }. Trong đó phương pháp hiện tại là câu trả lời của avetisk .
BrianS

@pomber Cảm ơn giải pháp, Thật ra tôi đã cố gắng kích hoạt sự kiện tùy chỉnh cho thay đổi kích thước cửa sổ để thay đổi kích thước biểu đồ của tôi ... giải pháp của bạn tiết kiệm trong ngày của tôi
Dinesh Gopal Chand

49

Kết hợp câu trả lời của pomber và avetisk để bao quát tất cả các trình duyệt và không gây ra cảnh báo:

if (typeof(Event) === 'function') {
  // modern browsers
  window.dispatchEvent(new Event('resize'));
} else {
  // for IE and other old browsers
  // causes deprecation warning on modern browsers
  var evt = window.document.createEvent('UIEvents'); 
  evt.initUIEvent('resize', true, false, window, 0); 
  window.dispatchEvent(evt);
}

1
Đây là một cách tốt để làm điều đó trên các trình duyệt mà không cần sử dụng jQuery.
kgx

không biết tại sao đây không phải là câu trả lời hàng đầu ...... điều này tốt hơn câu trả lời "hoặc hoặc" được chấp nhận ....
SPillai

14

Tôi thực sự không thể làm cho nó hoạt động với bất kỳ giải pháp nào ở trên. Khi tôi đã ràng buộc sự kiện với jQuery thì nó hoạt động tốt như sau:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');

Hoạt động trong Chrome ngày hôm nay.
webaholik

9

chỉ

$(window).resize();

là những gì tôi sử dụng ... trừ khi tôi hiểu sai những gì bạn yêu cầu.


3
Và ngay cả khi bạn có jQuery, nó chỉ kích hoạt các sự kiện bị ràng buộc với jQuery.
adamdport

0

Phản hồi với RxJS

Nói như một cái gì đó trong Angular

size$: Observable<number> = fromEvent(window, 'resize').pipe(
            debounceTime(250),
            throttleTime(300),
            mergeMap(() => of(document.body.clientHeight)),
            distinctUntilChanged(),
            startWith(document.body.clientHeight),
          );

Nếu đăng ký thủ công mong muốn (Hoặc không góc cạnh)

this.size$.subscribe((g) => {
      console.log('clientHeight', g);
    })

Vì khởi đầu nội bộ của tôi với Giá trị có thể không chính xác (công văn để sửa)

window.dispatchEvent(new Event('resize'));

Nói Angular (tôi có thể ..)

<div class="iframe-container"  [style.height.px]="size$ | async" >..

0

Tôi tin rằng điều này sẽ làm việc cho tất cả các trình duyệt:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);

Hoạt động tốt trong Chrome và FF, nhưng không hoạt động trong IE11
Collins

@Collins - cảm ơn vì đã cập nhật, nghĩ rằng tôi đã xác minh điều này trên IE11 ... Tôi sẽ cố gắng dành chút thời gian sau để cập nhật thông tin này, cảm ơn vì đã phản hồi.
webaholik

0

Bạn có thể làm điều này với thư viện này. https://github.com/itmor/events-js

const events = new Events();

events.add({  
  blockIsHidden: () =>  {
    if ($('div').css('display') === 'none') return true;
  }
});

function printText () {
  console.log('The block has become hidden!');
}

events.on('blockIsHidden', printText);

-3

window.resizeBy()sẽ kích hoạt sự kiện onresize của window. Điều này hoạt động trong cả Javascript hoặc VBScript .

window.resizeBy(xDelta, yDelta)được gọi là muốn window.resizeBy(-200, -200)thu nhỏ trang 200px x 200px.


2
Tại sao điều này được đánh dấu xuống? Có đúng không? Có phụ thuộc trình duyệt không?
Peter Wone

2
Điều này không hoạt động trong bất kỳ trình duyệt nào : Chrome, Firefox, IE, Firefox đã thử nghiệm.
fregante

1
Firefox 7+, và có lẽ các trình duyệt hiện đại khác, không còn cho phép gọi phương thức này trong hầu hết các trường hợp. Ngoài ra, thật không mong muốn thực sự thay đổi kích thước cửa sổ để kích hoạt sự kiện.
user247702

Cả resizeBy () và resizeTo () đều hoạt động tốt trong phiên bản Chrome ổn định mới nhất. 76.0
VanagaS
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.