จะทริกเกอร์เหตุการณ์การปรับขนาดหน้าต่างใน JavaScript ได้อย่างไร


327

ฉันได้ลงทะเบียนทริกเกอร์ในการปรับขนาดหน้าต่าง ฉันต้องการทราบว่าฉันสามารถเรียกเหตุการณ์ให้เรียกได้อย่างไร ตัวอย่างเช่นเมื่อซ่อน div ฉันต้องการเรียกใช้ฟังก์ชันทริกเกอร์

ฉันพบว่าwindow.resizeTo()สามารถเปิดใช้งานฟังก์ชั่น แต่มีวิธีการแก้ปัญหาอื่น ๆ ?

คำตอบ:


382

หากเป็นไปได้ฉันต้องการเรียกใช้ฟังก์ชันแทนที่จะส่งเหตุการณ์ วิธีนี้ใช้งานได้ดีหากคุณสามารถควบคุมรหัสที่คุณต้องการเรียกใช้ แต่ดูด้านล่างสำหรับกรณีที่คุณไม่ได้เป็นเจ้าของรหัส

window.onresize = doALoadOfStuff;

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

ในตัวอย่างนี้คุณสามารถเรียกใช้doALoadOfStuffฟังก์ชันได้โดยไม่ต้องส่งเหตุการณ์

ในเบราว์เซอร์สมัยใหม่ของคุณคุณสามารถทริกเกอร์เหตุการณ์โดยใช้:

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

สิ่งนี้ไม่ทำงานใน Internet Explorer ซึ่งคุณจะต้องทำสิ่งต่อไปนี้:

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

jQuery มีtriggerวิธีการซึ่งทำงานเช่นนี้:

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

และมีข้อแม้:

แม้ว่า. trigger () จำลองการเปิดใช้งานเหตุการณ์พร้อมด้วยวัตถุเหตุการณ์ที่สังเคราะห์ขึ้นมา แต่ก็ไม่ได้จำลองเหตุการณ์ที่เกิดขึ้นตามธรรมชาติได้อย่างสมบูรณ์แบบ

คุณสามารถจำลองเหตุการณ์ในองค์ประกอบเฉพาะ ...

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

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}

6
ฟังก์ชั่นไม่ระบุชื่อของคุณไม่จำเป็น window.onresize = doALoadOfStuff; นอกจากนี้ยังไม่ตอบคำถามนี้คำตอบของ pinouchon ด้านล่างเป็นคำตอบที่ถูกต้อง
Dennis Plucinik

42
ถึงGoogle r's: ดูคำตอบของ @ avetisk
Fabian Lauer

1
มันเป็นความคิดที่ดีที่จะแยก แต่ในกรณีของฉัน / มันไม่ทำงาน เพียงแค่เรียกเมธอดการปรับขนาดไม่ทำงานเพราะหากการปรับขนาดหน้าต่างไม่ได้ถูกทริกเกอร์ div / container อื่น ๆ ที่หลากหลายจะไม่มีชุดความสูงที่เหมาะสม
PandaWood

@PandaWood - แล้วตัวอย่างสุดท้ายของฉันดีกว่าในกรณีของคุณ
เฟนตัน

ขอบคุณ @ user75525
Bondsmith

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

11
ดูเหมือนว่าจะทำงานกับ Chrome, FF, Safari แต่ไม่ใช่: IE!
Davem M

14
jQuery triggerไม่ได้เรียกเหตุการณ์ "ปรับขนาด" ดั้งเดิม มันจะทริกเกอร์ผู้ฟังเหตุการณ์ที่เพิ่มเข้ามาโดยใช้ jQuery ในกรณีของฉันห้องสมุดบุคคลที่สามกำลังฟังโดยตรงกับเหตุการณ์ "ปรับขนาด" ดั้งเดิมและนี่คือโซลูชันที่เหมาะกับฉัน
chowey

2
ทางออกที่ดีและเรียบง่าย แม้ว่าฉันคิดว่าคุณควรเพิ่มโค้ดบางตัวสำหรับความเข้ากันได้กับ IE (เท่าที่ฉันเห็นสำหรับ IE เราต้องใช้window.fireEvent)
Victor

35
สิ่งนี้ใช้ไม่ได้กับอุปกรณ์ทั้งหมดสำหรับฉัน ฉันต้องเรียกใช้เหตุการณ์เช่นนี้: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('ปรับขนาด', จริง, เท็จ, หน้าต่าง, 0); window.dispatchEvent (EVT);
เฟรด

19
มันล้มเหลวด้วย "วัตถุไม่สนับสนุนการกระทำนี้" ใน IE11 ของฉัน
pomber

156

ด้วย jQuery คุณสามารถลองโทรหาทริกเกอร์ได้ :

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

3
กรณีใช้งานสำหรับกรณีนี้คือเมื่อปลั๊กอิน jQuery ใช้เหตุการณ์การปรับขนาดหน้าต่างเพื่อตอบสนอง แต่คุณมีแถบข้างที่ยุบอยู่ ที่เก็บปลั๊กอินได้รับการปรับขนาด แต่หน้าต่างไม่ได้
isherwood

4
ไม่จำเป็นต้องใช้ JQuery แต่ฉันชอบโซลูชัน JQuery เนื่องจากผลิตภัณฑ์ของฉันใช้ JQuery อย่างกว้างขวาง
ศรี

จะเพิ่มสิ่งนี้ไว้เพื่อปรับขนาดหน้า WordPress หลังจากโหลดแล้วหรือไม่
SAHM

สิ่งนี้ไม่ทำงานสำหรับฉันใน Chrome ล่าสุดคำตอบนี้ใช้ได้: stackoverflow.com/a/22638332/1296209
webaholik

1
นี่คือสิ่งที่ฉันพยายามครั้งแรก - มันใช้งานไม่ได้ แต่window.dispatchEvent(new Event('resize'));ทำ
user2682863

54

JS บริสุทธิ์ที่ทำงานบน IE (จากความคิดเห็น @Manfred )

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

หรือสำหรับเชิงมุม:

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

4
แต่น่าเสียดายที่เอกสารสำหรับUIEvent.initUIEvent ()กล่าวว่าเอกสาร CreateEventพูดว่า "หลายวิธีใช้กับ CreateEvent เช่น initCustomEvent จะเลิก. ใช้ก่อสร้างเหตุการณ์แทน." หน้านี้ดูมีแนวโน้มสำหรับกิจกรรม UI Do not use this method anymore as it is deprecated.
Racing Tadpole

9
จริง แต่ IE11 ไม่รองรับnew Event()วิธีนี้ if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }ผมคิดว่าเป็นสับกับเบราว์เซอร์รุ่นเก่าที่คุณสามารถทำสิ่งที่ต้องการ ในกรณีที่วิธีการในปัจจุบันเป็นคำตอบของ avetisk
BrianS

@pomber ขอบคุณสำหรับการแก้ปัญหาที่จริงฉันพยายามที่จะเรียกเหตุการณ์ที่กำหนดเองสำหรับการปรับขนาดหน้าต่างเพื่อปรับขนาดแผนภูมิของฉัน ... วิธีการแก้ปัญหาของคุณบันทึกวันของฉัน
Dinesh Gopal Chand

49

การรวมคำตอบของ pomber และ avetisk เพื่อให้ครอบคลุมเบราว์เซอร์ทั้งหมดและไม่ก่อให้เกิดคำเตือน:

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
นี่เป็นวิธีที่ดีในการทำข้ามเบราว์เซอร์โดยไม่ใช้ jQuery
kgx

ไม่รู้เลยว่าทำไมนี่ไม่ใช่คำตอบอันดับต้น ๆ ...... มันดีกว่าคำตอบ "หรือ" ที่เป็นที่ยอมรับ ....
SPillai

14

ฉันไม่สามารถทำให้มันใช้งานได้กับวิธีแก้ไขปัญหาใด ๆ ข้างต้น เมื่อฉันผูกเหตุการณ์กับ jQuery แล้วมันทำงานได้ดีดังนี้:

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

ใช้งานได้ใน Chrome วันนี้
webaholik

9

แค่

$(window).resize();

คือสิ่งที่ฉันใช้ ... เว้นแต่ฉันจะเข้าใจผิดว่าคุณขออะไร


3
และแม้ว่าคุณจะมี jQuery มันจะทริกเกอร์เหตุการณ์ที่ผูกไว้กับ jQuery เท่านั้น
adamdport

0

ตอบสนองกับ RxJS

พูดว่าชอบบางสิ่งในเชิงมุม

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

หากต้องการสมัครสมาชิกด้วยตนเอง (หรือไม่ใช่เชิงมุม)

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

ตั้งแต่เริ่มต้นเริ่มต้นของฉันด้วยค่าอาจไม่ถูกต้อง (ส่งเพื่อแก้ไข)

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

ในการพูดเชิงมุม (ฉันสามารถ .. )

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

0

ฉันเชื่อว่านี่จะใช้ได้กับเบราว์เซอร์ทั้งหมด:

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

ทำงานได้ดีใน Chrome และ FF แต่ไม่ทำงานใน IE11
Collins

@Collins - ขอบคุณสำหรับการอัปเดตฉันคิดว่าได้ตรวจสอบเรื่องนี้ใน IE11 ... ฉันจะพยายามใช้เวลาในการอัปเดตในภายหลังขอบคุณสำหรับคำติชม
webaholik


-3

window.resizeBy()จะเปิดใช้งานกิจกรรม onresize ของหน้าต่าง งานนี้ทั้งในจาวาสคริปต์หรือVBScript

window.resizeBy(xDelta, yDelta)เรียกว่าต้องการwindow.resizeBy(-200, -200)ย่อขนาดหน้า 200px คูณ 200px


2
ทำไมถึงถูกทำเครื่องหมายลง? มันไม่ถูกต้องหรือ มันขึ้นอยู่กับเบราว์เซอร์หรือไม่?
Peter Wone

2
สิ่งนี้ไม่ทำงานในเบราว์เซอร์ใด ๆ : Chrome, Firefox, IE, Firefox ที่ทดสอบแล้ว
Fregante

1
Firefox 7+ และเบราว์เซอร์สมัยใหม่อื่น ๆ อาจไม่อนุญาตให้ใช้วิธีนี้ในกรณีส่วนใหญ่ นอกจากนี้ไม่ต้องการปรับขนาดหน้าต่างจริง ๆ เพื่อเรียกเหตุการณ์
user247702

ทั้ง resizeBy () และ resizeTo () ทำงานได้ดีในเวอร์ชั่นล่าสุดของ Chrome ที่เสถียร 76.0
VanagaS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.