11544 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'ai un soucis pour faire des boutons +/- qui gère la capacité à rester enfoncés sous IE.
En effet, autant mon script fonctionne très bien sous firefox et chrome, autant sous ie, il fonctionne lentement... Si on clique deux fois de suite avec moins d'une seconde d'écart (environ), il ne prend pas en compte le deuxième click, il fait comme si il ne déclenchait pas l'événement mouse down.

La fonction qui initialise les événements sur les plus et moins :

    /**
     * Add events on + -  buttons
     */
    'applyPlusMoinsButtonEvents':function(parent_selector,callback)
    {
        root.log('applyPlusMoinsButtonEvents'+parent_selector);

        jQuery(parent_selector+' .plus').mousedown(function(event){
            root.plus(this,callback,true);
        });

        jQuery(parent_selector+' .plus').click(function(event){
            event.preventDefault();
        });


        jQuery(parent_selector+' .moins').mousedown(function(event){
            root.moins(this,callback,true);
        });

        jQuery(parent_selector+' .moins').click(function(event){
            event.preventDefault();
        });
}



Donc ma fonction plus

'plus':function(object,callback,first){
        root.upcallback = callback;// save callback to reuse when mouse up

        var current_input = jQuery('#'+jQuery(object).data('applyfor')).get(0);//get the input the + button apply for
        
        //if max value defined
        if (typeof jQuery('#'+jQuery(object).data('applyfor')).data('maxvalue') != 'undefined' ){
            if (parseInt(current_input.value)+1 <= jQuery('#'+jQuery(object).data('applyfor')).data('maxvalue')){
                current_input.value = parseInt(current_input.value)+1;
            }
            else{
                current_input.value= jQuery('#'+jQuery(object).data('applyfor')).data('maxvalue');
            }
        }
        else{
            current_input.value = parseInt(current_input.value)+1;
        }

        if (typeof first != 'undefined' &&  first == true){
            root.timeout = window.setTimeout(function(){
                root.plus(object,callback);
            }, 500);
        }
        else{
            root.timeout = window.setTimeout(function(){
                root.plus(object,callback);
            }, 200);
        }

    },

et onpage load

document.body.onmouseup=function(event){
            if (root.timeout){
                clearTimeout(root.timeout);
                root.timeout=false;
                if (root.upcallback){
                    root.upcallback();
                    root.upcallback=false;
                }
                else{
                    root.log('NO upcallback');
                }
            }
        };


et la variable global root qui possède donc l'ensemble du code et qui est défini avec ces variable par défaut:
   
    timeout:false,
    upcallback : false,


Je ne sais pas si vous avez déjà rencontré ce problème, mais j'avoue que je ne comprends pas trop... C'est comme si IE avait du mal à suivre le rythme...
Modifié par RedPhenix (15 Nov 2012 - 14:03)
Ok, j'ai finit par trouver, c'est que IE lorsqu'on fait deux clics trop rapprochés déclenche l'événement doubleclick au lieu de l'événement simple click.
En attrappant également l'événement doublie click, on règle le problème Smiley biggrin

        //fix ie: need this event to catch when ie detect double click instead of just event simple click
        if (jQuery.browser.msie) {
            jQuery(parent_selector+' .plus').dblclick(function(event){
                root.plus(this,callback,true,true);
            });
            jQuery(parent_selector+' .moins').dblclick(function(event){
                root.moins(this,callback,true,true);
            });
        }

Voila, merci Smiley lol
Modifié par RedPhenix (16 Nov 2012 - 11:24)