11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour, j'écris car n'arrivant pas à trouver la solution à mon problème. Mon soucis est que j'ai un jCarousel lié à deux input (un pour faire suivant, l'autre précédent) et que la librairie jCarousel s'occupe toute seule d'activer / désactiver ces inputs (quand on atteint respectivement le premier ou le dernier élément de la liste). Le truc c'est que j'aimerais désactiver également d'autres contrôles que ceux grisés par le jCarousel. Sachant que mon bouton suivant lié au jCarousel a pour id : next et que celui que je voudrais désactiver également a pour id : avance, j'ai essayé :
$("next").change(function() { $("#avance").attr("disabled", $("#next").attr("disabled")); });

Sans succès, rien ne se passe. J'ai essayé de déclencher l'évènement sur le "onclick" de mon contrôle 'avance' :
function click_event() {
            $("#next").click();
            $("#avance").attr("disabled", $("#next").attr("disabled"));
        }

Là ça marche mais pas tout le temps... Je m'explique, le 'grisage' du contrôle ne se fait instantanément par le jCarousel, et donc s'il y a un petit délais, mon contrôle est grisé lorsque je click une deuxième fois dessus... bref ça ne marche pas comme désiré !
En fait, je pense qu'il faudrait que je trouve un moyen de déclencher un événement lorsque mon contrôle 'next' devient grisé pour griser mon contrôle 'avance'... Toute idée / suggestion est la bienvenue, merci d'avance !
Bonjour,

Pour commencer, il faudrait voir si le plugin utilisé ne prévoit pas d'appliquer cet effet (passage en disabled="disabled" ou bien ajout d'une classe) à plusieurs éléments, grâce à des options de configuration. Voir la documentation du plugin à ce sujet.

Si ce n'est pas le cas, il faut à priori modifier le plugin (ou l'étendre si c'est possible) pour obtenir le comportement désiré.

Laisser le plugin gérer ses affaires, et surveiller le DOM pour déclencher certaines actions en fonction de ce que fait le plugin, ça me semble assez casse-gueule. Ou en tout cas très bricolé. Enfin, si le changement de valeur d'un attribut disabled correspond à un évènement observable, pourquoi pas, mais je ne crois pas que ce soit le cas.
Merci pour la réponse... J'ai regarder un peu plus pendant la journée, le truc c'est que je travaille dans un environnement de production qui a approuvé le plugin jCarousel "tel quel". Ce qui signifie que je ne peux malheureusement pas le modifier Smiley decu
Bien sur j'ai une option alternative qui serait de "compter" les éléments et désactiver le contrôle lorsque l'on atteint le dernier mais ce serait dommage de rajouter des traitements qui sont déjà effectuer nativement par le plugin jCarsousel. Mais en effet, il ne me semble pas que la propriété "disabled" soit observable. Par contre est-il possible de créer des évènements perso ? C'est à dire rendre observable certaines propriétés ?
mettosjester a écrit :
Ce qui signifie que je ne peux malheureusement pas le modifier Smiley decu

Et il ne peut pas être étendu ou surclassé?
(Je ne sais pas quels sont les termes exacts ou les moyens pour le faire en JavaScript, mais ça doit bien exister, et si le plugin est conçu pour pouvoir être modifié à la volée ça peut marcher. Peut-être du côté de jQuery.extend? Je dis peut-être des bêtises...)

mettosjester a écrit :
Par contre est-il possible de créer des évènements perso ? C'est à dire rendre observable certaines propriétés ?

À priori non. Tu ne peux pas non plus observer globalement les changements du DOM (du moins nativement et sans bricoler).

C'est d'ailleurs le problème avec les essais mentionnés dans ton premier message: la méthode jQuery.change permet d'observer l'évènement "onchange". Et le "onchange", ce n'est pas une modification du DOM en général, mais la modification de la saisie dans un champ de formulaire. Donc c'est pas applicable ici, et donc oui, forcément, il ne se passe rien.

Une solution assez bricolée mais jouable serait de rajouter un appel de fonction au clic sur les boutons, qui irait vérifier l'état de l'attribut disabled du bouton après un temps donné (donc avec un setTimeOut), par exemple de 100ms, pour laisser à jCarousel le temps de modifier la valeur de l'attribut du bouton.

En passant: il me semblait que jCarousel utilisait des DIV pour ses boutons, pas des BUTTON. Donc ce qu'il faudra tester ce n'est sans doute pas la valeur de l'attribut disabled, mais sans doute la présence ou non d'une classe sur le DIV.
Modifié par Florent V. (18 Apr 2009 - 19:28)