]> source.dussan.org Git - jquery-ui.git/commitdiff
Button: Don't fire click/change events if mouse was dragged during click of toggle...
authorKris Borchers <kris.borchers@gmail.com>
Fri, 13 May 2011 19:28:10 +0000 (15:28 -0400)
committerScott González <scott.gonzalez@gmail.com>
Fri, 13 May 2011 19:29:03 +0000 (15:29 -0400)
(cherry picked from commit a69a1788bc5cd67c6e627e519e20897a0c238945)

ui/jquery.ui.button.js

index a1be75d8e021b556541068295d65a2c397bf201d..2539846f6f5104c494a49c44a81a9355ae54380f 100644 (file)
@@ -13,7 +13,7 @@
  */
 (function( $, undefined ) {
 
-var lastActive,
+var lastActive, startXPos, startYPos, clickDragged,
        baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
        stateClasses = "ui-state-hover ui-state-active ",
        typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
@@ -111,13 +111,36 @@ $.widget( "ui.button", {
 
                if ( toggleButton ) {
                        this.element.bind( "change.button", function() {
+                               if ( clickDragged ) {
+                                       return;
+                               }
                                self.refresh();
                        });
+                       // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+                       // prevents issue where button state changes but checkbox/radio checked state
+                       // does not in Firefox (see ticket #6970)
+                       this.buttonElement
+                               .bind( "mousedown.button", function( event ) {
+                                       if ( options.disabled ) {
+                                               return;
+                                       }
+                                       clickDragged = false;
+                                       startXPos = event.pageX;
+                                       startYPos = event.pageY;
+                               })
+                               .bind( "mouseup.button", function( event ) {
+                                       if ( options.disabled ) {
+                                               return;
+                                       }
+                                       if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+                                               clickDragged = true;
+                                       }
+                       });
                }
 
                if ( this.type === "checkbox" ) {
                        this.buttonElement.bind( "click.button", function() {
-                               if ( options.disabled ) {
+                               if ( options.disabled || clickDragged ) {
                                        return false;
                                }
                                $( this ).toggleClass( "ui-state-active" );
@@ -125,7 +148,7 @@ $.widget( "ui.button", {
                        });
                } else if ( this.type === "radio" ) {
                        this.buttonElement.bind( "click.button", function() {
-                               if ( options.disabled ) {
+                               if ( options.disabled || clickDragged ) {
                                        return false;
                                }
                                $( this ).addClass( "ui-state-active" );