Überwachen Sie die Größenänderung eines DOM-Elements über Iframe

Überwachen Sie die Größenänderung eines DOM-Elements über Iframe

Ein während des Entwicklungsprozesses häufig auftretendes Problem besteht darin, die Größenänderungen eines Div zu überwachen. Wenn ich beispielsweise Canvas zum Zeichnen eines Diagramms verwende und sich die Größe von Canvas ändert, muss ich den Inhalt darin neu zeichnen. Zu diesem Zeitpunkt muss ich zur Verarbeitung auf das Größenänderungsereignis hören. Obwohl es einen Größenänderungsereignis-Listener für das Fenster gibt, kann dieser unseren Anforderungen nicht gerecht werden, da sich in vielen Fällen die Größe des Div ändert und das eigentliche Ereignis „window.resize“ nicht ausgelöst wird.

Es gibt viele Möglichkeiten, das Größenänderungsereignis eines Div zu überwachen, z. B. Timerprüfung, Bildlaufereignisse usw. Dieser Artikel stellt hauptsächlich die Überwachung über das Iframe-Element vor.

Wir können jedoch indirekt den Größenänderungsereignislistener des Fensters verwenden, um den Größenänderungsereignislistener für ein bestimmtes Div zu implementieren. Bitte sehen Sie sich die spezifische Implementierung unten an.

2. Umsetzungsprinzip

  • Erstellen Sie dynamisch ein Iframe-Tag und hängen Sie es an den Container an, wobei Breite und Höhe zu 100 % vom Container übernommen werden.
  • Holen Sie sich das Fenster im Iframe über das contentWindow-Attribut.
  • Da die Breite und Höhe des Iframes vom übergeordneten Knoten geerbt werden, wird das Größenänderungsereignis im Iframe natürlich ausgelöst, wenn sich die Breite des übergeordneten Containers ändert.

Verwenden Sie das Ereignis „iframeWindow.resize“ , um DOM-Größenänderungen zu überwachen und so eine Überwachung des Größenänderungsereignisses zu erreichen.

Beispiel

document.querySelector("#ifarme_id").contentWindow.addEventListener('resize', () => {
    console.log('Größe ändern!');
}, FALSCH)

3. Anrufen

<!DOCTYPE html>
<html>
    <Kopf>
	<meta charset="utf-8">
	<title>DIV-Breite- und -Höhenüberwachung</title>
    <style type="text/css">
        #Inhalt {
        Überlauf: automatisch;
			}
		</Stil>
	</Kopf>
	<Text>
	<div id="Inhalt">
            Zhong Nanshan: Wenn Afrika gute Vorkehrungen trifft, wird die Epidemie bei heißem Wetter zurückgehen. Außerdem fragte ein Ausländer bei dem Treffen: Wenn Sie jetzt nach Afrika reisen würden, was würden Sie als Erstes tun?
        	Zhong Nanshan sagte: „Das Wichtigste ist jetzt, uns zu schützen, und die Ausbreitung zu verhindern.“
        	Wenn in Afrika in dieser Zeit gute Vorsorgemaßnahmen getroffen werden, kann sich die epidemische Lage bei heißem Wetter entspannen.
		</div>

		<button id="change-size">Breite und Höhe ändern</button>

		<Skripttyp="text/javascript">
			var eleResize = neues ElementResize('#Inhalt');
			eleResize.listen(Funktion() {
				console.log('Größenänderung!')
			})

			//Breite und Höhe ändern document.querySelector('#change-size').addEventListener('click', function() {
				let cont = document.querySelector('#Inhalt');
				cont.style.width = Math.floor((Math.random() * (document.documentElement.clientWidth - 500)) + 500) + 'px';
				cont.style.height = Math.floor(Math.random() * 300) + 'px';
			}, FALSCH)
		</Skript>
	</body>
</html>

Vollständiger Code

<!DOCTYPE html>
<html>
	<Kopf>
		<meta charset="utf-8">
		<title>DIV-Breite- und -Höhenüberwachung</title>
		<style type="text/css">
			#Inhalt {
				Überlauf: automatisch;
			}
		</Stil>
	</Kopf>
	<Text>
		<div id="Inhalt">
			Zhong Nanshan: Wenn Afrika gute Vorkehrungen trifft, wird die Epidemie bei heißem Wetter zurückgehen. Außerdem fragte ein Ausländer bei dem Treffen: Wenn Sie jetzt nach Afrika reisen würden, was würden Sie als Erstes tun?

			Zhong Nanshan sagte: „Das Wichtigste ist jetzt, uns zu schützen, und die Ausbreitung zu verhindern.“

			Wenn in Afrika in dieser Zeit gute Vorsorgemaßnahmen getroffen werden, kann sich die epidemische Lage bei heißem Wetter entspannen.
		</div>
		<button id="change-size">Breite und Höhe ändern</button>

		<Skripttyp="text/javascript">
			(Funktion() {
				lass self = dies;
				/**
				 * Überwachung der Elementbreite und -höhe * @param {Object} el Überwachung des Elementselektors */
				Funktion ElementResize(eleSelector) {
					if (!(diese Instanz von ElementResize)) return;
					wenn (!eleSelector) return;
					dies.eleSelector = eleSelector;
					Dies.el = document.querySelector(eleSelector);
					diese.Warteschlange = [];
					this.__init(); //globel init
				}

				// Initialisierung ElementResize.prototype.__init = function() {
					lass iframe = this.crateIElement();
					this.el.style.position = "relativ";
					dies.el.appendChild(iframe)
					dies.bindEvent(iframe.contentWindow);
				}

				/**
				 * Elementstil festlegen * @param {HTMLObject} el
				 * @param {Objekt} styleJson
				 */
				ElementResize.prototype.setStyle = Funktion(el, styleJson) {
					wenn (!el) zurückgeben;
					styleJson = styleJson || {
						Deckkraft: 0,
						'z-index': '-1111',
						Position: 'absolut',
						links: 0,
						oben: 0,
						Breite: '100%',
						Höhe: '100%',
					};
					let styleText = '';
					für (Schlüssel in styleJson) {
						styleText += (Schlüssel + ':' + styleJson[Schlüssel] + ';');
					}
					el.style.cssText = StilText;
				}

				/**
				 * Element erstellen * @param {Object} Stil
				 */
				ElementResize.prototype.crateIElement = Funktion(Stil) {
					let iframe = document.createElement('iframe');
					dies.setStyle(iframe);
					Iframe zurückgeben;
				}

				/**
				 * Bindungsereignis * @param {Object} el
				 */
				ElementResize.prototype.bindEvent = Funktion(el) {
					wenn (!el) zurückgeben;
					var _self = dies;
					el.addEventListener('Größe ändern', Funktion() {
						_self.runQueue();
					}, FALSCH)
				}

				/**
				 * Warteschlange ausführen */
				ElementResize.prototype.runQueue = Funktion() {
					lass Warteschlange = diese.Warteschlange;
					für (var i = 0; i < Warteschlangenlänge; i++) {
						(Typ der Warteschlange[i]) === 'Funktion' && Warteschlange[i].apply(this);
					}
				}

				/**
				 * Externe Überwachung * @param {Object} cb Rückruffunktion */
				ElementResize.prototype.listen = Funktion(cb) {
					if (typeof cb !== 'function') throw new TypeError('cb ist keine Funktion!');
					diese.Warteschlange.push(cb);
				}

				self.ElementResize = Elementgröße;
			})()
			
			//Eine abhörende Instanz erstellen var eleResize = new ElementResize('#content');
			eleResize.listen(Funktion() {
				console.log('Ich bin ein Zuhörer')
			})

			//Breite und Höhe ändern document.querySelector('#change-size').addEventListener('click', function() {
				let cont = document.querySelector('#Inhalt');
				cont.style.width = Math.floor((Math.random() * (document.documentElement.clientWidth - 500)) + 500) + 'px';
				cont.style.height = Math.floor(Math.random() * 300) + 'px';
			}, FALSCH)
		</Skript>
	</body>
</html>

Weitere Funktionen werden aktualisiert ...

Dies ist das Ende dieses Artikels über die Überwachung der Größenänderungen eines DOM-Elements durch Iframe. Weitere relevante DOM-Elementänderungen finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

<<:  Mehrere allgemeine Beispielcodes für Weiterleitungsverbindungen in HTML

>>:  Lösen Sie das Problem der Datensynchronisierung beim Scrollen und Liken von Vue-Seamless-Scroll

Artikel empfehlen

Prinzip und Implementierung der parallelen Replikation von MySQL5.7

Jeder, der ein wenig über Datenoperationen und -w...

CentOS7.5-Installationstutorial für MySQL

1. Überprüfen Sie zunächst, ob auf dem System MyS...

So verhindern Sie, dass sich vsftpd-Benutzer über SSH anmelden

Vorwort vsftp ist eine benutzerfreundliche und si...

So installieren Sie Nginx in Docker und konfigurieren den Zugriff über https

1. Laden Sie das neueste Nginx-Docker-Image herun...

Einführung und Verwendung des JS-Beobachtermodus

Inhaltsverzeichnis I. Definition 2. Anwendungssze...

Tutorial zur Installation von RabbitMQ mit Yum auf CentOS8

Geben Sie den Ordner /etc/yum.repos.d/ ein Erstel...

JS + Canvas realisiert dynamischen Uhreffekt

Eine auf Canvas basierende Demo einer dynamischen...

Beispielcode zur Implementierung von dynamischem Skinning mit vue+element

Manchmal kann das Thema eines Projekts nicht jede...