Comment puis-je me connecter à un événement de redimensionnement de la fenêtre du navigateur?
Il existe un moyen jQuery d'écouter les événements de redimensionnement mais je préférerais ne pas l'intégrer dans mon projet pour cette seule exigence.
javascript
dom-events
window-resize
Compte mort
la source
la source
Réponses:
jQuery enveloppe simplement l'
resize
événement DOM standard , par exemple.jQuery peut faire un certain travail pour s'assurer que l'événement de redimensionnement est déclenché de manière cohérente dans tous les navigateurs, mais je ne suis pas sûr si l'un des navigateurs diffère, mais je vous encourage à tester dans Firefox, Safari et IE.
la source
window.addEventListener('resize', function(){}, true);
window.onresize = () => { /* code */ };
ou mieux:window.addEventListener('resize', () => { /* code */ });
Tout d'abord, je sais que la
addEventListener
méthode a été mentionnée dans les commentaires ci-dessus, mais je n'ai vu aucun code. Puisque c'est l'approche préférée, la voici:Voici un exemple de travail .
la source
removeEventListener
.Ne remplacez jamais la fonction window.onresize.
Au lieu de cela, créez une fonction pour ajouter un écouteur d'événements à l'objet ou à l'élément. Cela vérifie et empêche les écouteurs de fonctionner, puis remplace la fonction de l'objet en dernier recours. Il s'agit de la méthode préférée utilisée dans les bibliothèques telles que jQuery.
object
: l'élément ou l'objet fenêtretype
: redimensionner, faire défiler (type d'événement)callback
: la référence de la fonctionEnsuite, l'utilisation est comme ceci:
ou avec une fonction anonyme:
la source
attachEvent
n'est plus pris en charge. La voie privilégiée pour l'avenir estaddEventListener
.elem == undefined
. Il est possible (bien que peu probable) que "non défini" soit défini localement comme autre chose. stackoverflow.com/questions/8175673/…L'événement de redimensionnement ne doit jamais être utilisé directement car il est déclenché en continu pendant que nous redimensionnons.
Utilisez une fonction anti-rebond pour atténuer les appels en excès.
window.addEventListener('resize',debounce(handler, delay, immediate),false);
Voici un rebounce commun flottant autour du net, mais recherchez des plus avancés comme featuerd dans lodash.
Cela peut être utilisé comme ça ...
Il ne se déclenchera jamais plus d'une fois tous les 200 ms.
Pour les changements d'orientation mobile, utilisez:
Voici une petite bibliothèque que j'ai constituée pour prendre soin de cela proprement.
la source
(...arguments) => {...}
(ou...args
pour moins de confusion) car laarguments
variable n'est plus disponible dans sa portée.Solution pour 2018+:
Vous devez utiliser ResizeObserver . Il s'agit d'une solution native du navigateur qui a de bien meilleures performances que d'utiliser l'
resize
événement. De plus, il supporte non seulement l'événement sur ledocument
mais aussi sur l'arbitraireelements
.Actuellement, Firefox, Chrome et Safari le prennent en charge . Pour les autres navigateurs (et les anciens), vous devez utiliser un polyfill .
la source
Je crois que la réponse correcte a déjà été fournie par @Alex V, mais la réponse nécessite une certaine modernisation car elle a plus de cinq ans maintenant.
Il y a deux problèmes principaux:
Ne jamais utiliser
object
comme nom de paramètre. C'est un mot réservé. Cela étant dit, la fonction fournie par @Alex V ne fonctionnera passtrict mode
.La
addEvent
fonction fournie par @Alex V ne renvoie pas leevent object
si laaddEventListener
méthode est utilisée. Un autre paramètre doit être ajouté à laaddEvent
fonction pour permettre cela.REMARQUE: le nouveau paramètre to
addEvent
a été rendu facultatif afin que la migration vers cette nouvelle version de fonction n'interrompe aucun appel précédent à cette fonction. Toutes les utilisations héritées seront prises en charge.Voici la
addEvent
fonction mise à jour avec ces modifications:Un exemple d'appel à la nouvelle
addEvent
fonction:la source
Merci d'avoir référencé mon article de blog sur http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html .
Bien que vous puissiez simplement vous connecter à l'événement de redimensionnement de fenêtre standard, vous constaterez que dans IE, l'événement est déclenché une fois pour chaque mouvement X et une fois pour chaque mouvement de l'axe Y, ce qui entraîne le déclenchement d'une tonne d'événements pouvant avoir des performances impact sur votre site si le rendu est une tâche intensive.
Ma méthode implique un court délai d'attente qui est annulé lors d'événements ultérieurs afin que l'événement ne se propage pas à votre code jusqu'à ce que l'utilisateur ait fini de redimensionner la fenêtre.
la source
la source
Le billet de blog suivant peut vous être utile: Correction de l'événement de redimensionnement de la fenêtre dans IE
Il fournit ce code:
la source
Les solutions déjà mentionnées ci-dessus fonctionneront si tout ce que vous voulez faire est de redimensionner la fenêtre et la fenêtre uniquement. Toutefois, si vous souhaitez que le redimensionnement soit propagé aux éléments enfants, vous devrez propager l'événement vous-même. Voici un exemple de code pour le faire:
Notez qu'un élément enfant peut appeler
sur l'objet événement transmis comme premier Arg de l'événement resize. Par exemple:
la source
la source
la source