Je veux savoir comment déclencher un événement quand une div change de hauteur ou n’importe quel attribut css.
J'ai un div avec id = mainContent
. Je veux que jquery déclenche automatiquement un événement quand il change de hauteur. J'ai fait quelque chose comme ça:
$("#mainContent").change('height', function() {
$("#separator").css('height', $("#mainContent").height());
});
Je sais que c'est faux.
Voici tout mon code (j'ai tout collé parce que je ne peux pas entrer dans jsfiddle pour une raison que je ne sais pas):
<html>
<head>
<style type="text/css">
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
#separator {
border-right: 1px solid black;
}
</style>
<script type="text/javascript" src="jquery1.6.4min.js"> </script>
<script type="text/javascript">
$(document).ready(function() {
$("#separator").css('height', $("body").height());
});
$(function() {
$("#btnSample1").click(function() {
$("#mainContent").css('height', '400px');
$("#mainContent").css('width', '600px');
$("#mainContent").css('background-color', '#F0F0F0');
});
$("#btnSample2").click(function() {
$("#mainContent").css('height', '1600px');
$("#mainContent").css('width', '700px');
$("#mainContent").css('background-color', '#F0F0F0');
});
$("#mainContent").change('height', function() {
$("#separator").css('height', $("#mainContent").height());
});
});
</script>
</head>
<body>
<table style="width: 100%;">
<tr>
<td valign="top" style="width: 19%;">
<table id="mainMenu">
<tr><td><input id="btnSample1" type="button" value="Sample 1" /></td></tr>
<tr><td><input id="btnSample2" type="button" value="Sample 2" /></td></tr>
</table>
</td>
<td valign="top" style="width: 1%;" >
<div id="separator"></div>
</td>
<td valign="top" style="width: 80%;">
<div id="mainContent"></div>
</td>
</tr>
</table>
</body>
</html>
J'essaie d'ajuster la hauteur du div id = separator
en fonction de la hauteur de mainContent
chaque fois que la hauteur de mainContent
change.
PS: Dans ce cas, je sais que je peux utiliser l'événement button pour le faire, mais je veux que la div déclenche l'événement lorsque la hauteur est modifiée. S'il vous plaît aider. Merci d'avance.
Tout d’abord, il n’existe aucun événement de ce type, mais vous pouvez en créer un par vous-même, car onchange
est pour :input
éléments seulement. pas pour les changements css.
Il existe deux façons de suivre les modifications css.
DOMAttrModified
. Mais c'est obsolète , donc je vais sauter dessus.Première manière:
var $element = $("#elementId");
var lastHeight = $("#elementId").css('height');
function checkForChanges()
{
if ($element.css('height') != lastHeight)
{
alert('xxx');
lastHeight = $element.css('height');
}
setTimeout(checkForChanges, 500);
}
Deuxième manière:
$('#mainContent').bind('heightChange', function(){
alert('xxx');
});
$("#btnSample1").click(function() {
$("#mainContent").css('height', '400px');
$("#mainContent").trigger('heightChange'); //<====
...
});
Si vous contrôlez les modifications CSS, la deuxième option est un moyen beaucoup plus élégant et efficace de le faire.
Documentations:
Description: Attach a handler to an event for the elements.
Description: Execute all handlers and behaviors attached to the matched elements for the given event type.
S'il vous plaît ne pas utiliser les techniques décrites dans d'autres réponses ici. Ils ne fonctionnent pas avec les modifications de taille d'animations css3, les modifications de disposition flottantes ou les modifications qui ne proviennent pas de jQuery Land. Vous pouvez utiliser un détecteur de redimensionnement, une approche basée sur les événements, qui ne gaspille pas votre temps processeur.
https://github.com/marcj/css-element-queries
Il contient une classe ResizeSensor que vous pouvez utiliser à cette fin.
new ResizeSensor(jQuery('#mainContent'), function(){
console.log('main content dimension changed');
});
Disclaimer: J'ai écrit cette bibliothèque
Pour l'avenir, je posterai ceci. Si vous n'avez pas besoin de prendre en charge <IE11, vous devez utiliser MutationObserver.
Voici un lien vers le caniuse js MutationObserver
Utilisation simple avec des résultats puissants.
var observer = new MutationObserver(function (mutations) {
//your action here
});
//set up your configuration
//this will watch to see if you insert or remove any children
var config = { subtree: true, childList: true };
//start observing
observer.observe(elementTarget, config);
Lorsque vous n'avez plus besoin d'observer, déconnectez-vous.
observer.disconnect();
Consultez le documentation MDN pour plus d'informations
Un autre exemple simple.
Pour cet exemple, nous pouvons utiliser 100x100 DIV-box:
<div id="box" style="width: 100px; height: 100px; border: solid 1px red;">
Red box contents here...
</div>
Et petite astuce jQuery:
<script type="text/javascript">
jQuery("#box").bind("resize", function() {
alert("Box was resized from 100x100 to 200x200");
});
jQuery("#box").width(200).height(200).trigger("resize");
</script>
Étapes:
C'est tout. ;-)