Exécution sous chrome

Par GameTag, il y a 10 ans


Bonjour,

Mon problème est assez étrange et je n'ai rien trouvé sur le net ressemblant à ça. La fonction callback de show() s'éxecute avant d'avoir fini de chargé l'objet jQuery qui appelle show(), sous firefox/edge aucun soucis. Par contre sur Chrome je ne comprend pas, il l'éxcute correctemet le script mais une fois tout les 5 rafraichissements... D'où l'utilisation la fonction setTimeout de 200ms. J'espère que vous comprendrez avec cet exemple :

/css .main{ position : relative; height : 0px; width: 100%; } section{ display: none; opacity: 0; position: absolute; top: 0; left: 0; } /js $(document).ready(function(){ activeItem = { activeItem : 'informations', subcat : 'compte' }; $ctn = $('section#ctn'+capitalizeFirstLetter(activeItem.subcat)); $ctn.css('opacity', 1); setTimeout(function(){ // ***** CHROME ******* $ctn.show(function(){ height = $ctn.outerHeight(true); // height recuperer de l'objet en absolute // La valeur height varie selon les rafraichissements console.log('height apres show', height, $ctn.outerHeight(true), $ctn.height()); $('.main').height(height); // Le main est redimensionner en conséquence height = $('.main').innerHeight(); // Du coup une dimension tronqué }).promise().done(function(){ console.log('show est fini'); }); }, 400); });

Ce que je fais

Le but du code : adapter la hauteur du .main par rapport à un item placé en absolute (son contenu est généré en PHP)

Recuper un container ($ctn = #ctnInformations) puis mettre son opacity à 1

$ctn = $('section#ctn'+capitalizeFirstLetter(activeItem.subcat)); $ctn.css('opacity', 1);

Puis lui appliquer la fonction show() et récupérer ses dimensions

setTimeout(function(){ // FUCKIN CHROME ******* $ctn.show(function(){ height = $ctn.outerHeight(true); // height recuperer de l'objet en absolute // La valeur height varie selon les rafraichissements console.log('height apres show', height, $ctn.outerHeight(true), $ctn.height()); $('.main').height(height); // Main est redimensionner en conséquence height = $('section').innerHeight(); // Du coup une dimension tronqué }).promise().done(function(){ console.log('show est fini'); }); }); }, 400);

Ce que je veux

Exécuter le script sans TimeOut sur Chrome

Ce que j'obtiens

Si vous enlevez le setTimeout : chrome exécute trop vite le code. Firefox et Edge pas de problème.

2 réponses

dycom, il y a 10 ans

Salut à tu regarder la doc pour la fonction .show car elle très bien expliqué,

[http://www.w3schools.com/jquery/jquery_hide_show.asp]()
[http://api.jquery.com/show/]()

La fonction .show est défini comme ceci:

$(selector).show(speed,callback);

Il ne te reste plus qu'à suivre cette exemple, dans ton cas sa doit donner quelque chose comme ça:

$ctn.show("fast", function(){ height = $ctn.outerHeight(true); // height recuperer de l'objet en absolute // La valeur height varie selon les rafraichissements console.log('height apres show', height, $ctn.outerHeight(true), $ctn.height()); $('.main').height(height); // Main est redimensionner en conséquence height = $('section').innerHeight(); // Du coup une dimension tronqué });

Normalement sa devrai fonctionner sinon réfère toi à la documentation. Bye ;)

GameTag, il y a 9 ans

Wah en effet sa fonctionne correctement, je pensais que se paramètre était falcultatif mais en faite il exécutait le callback trop tôt.

Merci beaucoup :)