Eh bien, il existe de nombreuses solutions pour ce type de problèmes ici. Mais, mon problème est que je ne suis pas autorisé à modifier les fonctionnalités existantes. La fonctionnalité existante est:
$('body').on('click', '.parent.normal', function () {
// code for Expanding a div
});
Et
$('body').on('click', '.parent.expand', function () {
// code for Closing expanded div
});
Ce que je peux faire, c'est définir une autre fonction click
pour cliquer en dehors du div étendu qui appellera l'événement de clic existant pour fermer le div étendu. Pour ce faire, j'ai écrit ceci:
if($('.parent.expand').length > 0) {
$('div:not(".parent.normal, .expanded-content, .expanded-content > div")').click(function () {
$('.parent.expand').click();
});
}
Ce qui ne fonctionne pas réellement. Comment puis-je le faire fonctionner?
3 réponses
L'ajout de cela à votre code existant doit résoudre le problème.
$(document).on('click',function(e){
if (!$(e.target).parents('.content').length > 0){
$('.parent.expand').click();
}
});
Voici un violon fonctionnel
Cela le fera sans apporter de modifications aux fonctions existantes:
$(document).mouseup(function (e) {
var elem_not = $(".parent.normal, .parent.expand, .expanded-content, .expanded-content > div");
if (!elem_not.is(e.target) && elem_not.has(e.target).length === 0) {
$('.parent.expand').click();
}
});
Mise à jour de votre FIDDLE
Vous devez modifier votre CSS pour que votre corps ait 100% de largeur et 100% de hauteur. Cela créera une zone pour vos événements de clic à enregistrer en dehors de la div.
html, body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
}
Et puis utilisez ce javascript:
// open expand content
$('body').on('click', '.parent.normal', function (e) {
e.stopPropagation();
e.preventDefault();
$(this).removeClass('normal');
$(this).addClass('expand');
$(this).parent().find('.expanded-content').slideDown(300);
});
// close expand content
$('body').on('click', '.parent.expand', function (e) {
e.stopPropagation();
e.preventDefault();
$(this).removeClass('expand');
$(this).addClass('normal');
$(this).parent().find('.expanded-content').slideUp(300);
});
$('body').on('click', function (e) {
e.stopPropagation();
e.preventDefault();
$('.parent.expand').click();
});
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.