J’ai un élément div:
.
Comment lier un événement personnalisé lorsque cette div devient visible (obtient display: block;
)?
Et aussi je voudrais lier un événement quand cette div devient invisible (obtient display: none;
).
J’aimerais faire cela dans jQuery.
Edit: je fais des tabs simples avec du contenu ajax. Je veux que le contenu de cet onglet soit mis à jour en ajax uniquement lorsque cet onglet est visible.
Démarrer et arrêter la mise à jour AJAX en fonction de la visibilité. Vous pouvez utiliser .is()
pour retourner un VRAI ou un FAUX pour :visible
:
var timer; // Variable to start and top updating timer // This if statement has to be part of the event handler for the visibility // change of selector..... so there might be more straight forward solution // see the last example in this answer. if ($(selector).is(":visible")) { // Start / continue AJAX updating timer = setInterval(AJAXupdate, 1000); } else { // Stop AJAX updating clearInterval(timer); }
Voici un exemple simple d’une timer qui s’arrête lorsqu’elle est invisible. Notez que les nombres ne continuent pas à augmenter quand ils ne sont pas visibles:
(function() { var switcher; // variable to start and stop timer // Function / event that will be started and stopped function count() { $("div").html(1 + parseInt($("div").html(), 10)); } $(function() { // <== doc ready // Start timer - it is visible by default switcher = setInterval(count, 1000); $("input").click(function() { $("div").toggle(); // Toggle timer visibility // Start and stop timer based on visibility if ($("div").is(":visible")) { switcher = setInterval(count, 1000); } else { clearInterval(switcher); } }); }); }());
Bien sûr, dans le cas ci-dessus, et peut-être dans votre cas, il est plus simple d'activer ou de désactiver alternativement la mise à jour:
(function() { var switcher; function count() { $("div").html(1 + parseInt($("div").html(), 10)); } $(function() { switcher = setInterval(count, 1000); $("input").toggle(function() { clearInterval(switcher); $("div").toggle(); }, function() { switcher = setInterval(count, 1000); $("div").toggle(); }); }); }());
Avoir l’événement toujours lié à la div, mais à l’intérieur de l’événement, procédez comme suit:
if($(self).is(":visible")){ // Implement your code }
Désormais, votre événement ne sera déclenché que si l’élément est visible pour l’utilisateur.
La solution que j’ai trouvée consistait à déclencher un événement de focus
lorsque l’onglet est sélectionné.
var tabContainers = $ ('div.tabs> div'); $ ('div.tabs ul.tabNavigation a'). click (function () { tabContainers.each (function () { tabContainers.hide (). filter (this.hash) .show (); if ($ (this) .is (': visible')) { $ (this) .focus (); // déclenche cet événement si l'onglet est visible } autre { $ (this) .blur (); // si l'onglet est invisible } }); });
Et puis j’attrape ces événements de focus
et de blur
:
$ (document) .ready (fonction () { $ ("# tabID"). bind ("focus", function () { if ($ (this) .is (": visible")) { // commence ajax ici } }); $ ("# tab '. $ key.'"). bind ("flou", fonction () { si (! $ (this) .is (": visible")) { // arrêtez ajax ici } }); });