aboutsummaryrefslogtreecommitdiffstats
path: root/src/ngMobile
diff options
context:
space:
mode:
authorBraden Shepherdson2013-04-12 14:03:36 -0400
committerJames deBoer2013-04-30 16:56:24 -0700
commit52a55ec61895951999cb0d74e706725b965e9c9f (patch)
treeb8e53ec8b40bf07446e5bc814e556ec7d872f4ee /src/ngMobile
parente295eeefaa26b203cefb8b1148417e4c4f85e037 (diff)
downloadangular.js-52a55ec61895951999cb0d74e706725b965e9c9f.tar.bz2
feat(ngTap): Add a CSS class while the element is held down.
Diffstat (limited to 'src/ngMobile')
-rw-r--r--src/ngMobile/directive/ngClick.js33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/ngMobile/directive/ngClick.js b/src/ngMobile/directive/ngClick.js
index b3e3007d..a6f6ed19 100644
--- a/src/ngMobile/directive/ngClick.js
+++ b/src/ngMobile/directive/ngClick.js
@@ -2,11 +2,19 @@
/**
* @ngdoc directive
- * @name ngMobile.directive:ngTap
+ * @name ngMobile.directive:ngClick
*
* @description
- * Specify custom behavior when element is tapped on a touchscreen device.
- * A tap is a brief, down-and-up touch without much motion.
+ * A more powerful replacement for the default ngClick designed to be used on touchscreen
+ * devices. Most mobile browsers wait about 300ms after a tap-and-release before sending
+ * the click event. This version handles them immediately, and then prevents the
+ * following click event from propagating.
+ *
+ * This directive can fall back to using an ordinary click event, and so works on desktop
+ * browsers as well as mobile.
+ *
+ * This directive also sets the CSS class `ng-click-active` while the element is being held
+ * down (by a mouse click or touch) so you can restyle the depressed element if you wish.
*
* @element ANY
* @param {expression} ngClick {@link guide/expression Expression} to evaluate
@@ -15,7 +23,7 @@
* @example
<doc:example>
<doc:source>
- <button ng-tap="count = count + 1" ng-init="count=0">
+ <button ng-click="count = count + 1" ng-init="count=0">
Increment
</button>
count: {{ count }}
@@ -37,6 +45,8 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers.
var PREVENT_DURATION = 2500; // 2.5 seconds maximum from preventGhostClick call to click
var CLICKBUSTER_THRESHOLD = 25; // 25 pixels in any dimension is the limit for busting clicks.
+
+ var ACTIVE_CLASS_NAME = 'ng-click-active';
var lastPreventedTime;
var touchCoordinates;
@@ -172,6 +182,7 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
function resetState() {
tapping = false;
+ element.removeClass(ACTIVE_CLASS_NAME);
}
element.bind('touchstart', function(event) {
@@ -182,6 +193,8 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
tapElement = tapElement.parentNode;
}
+ element.addClass(ACTIVE_CLASS_NAME);
+
startTime = Date.now();
var touches = event.touches && event.touches.length ? event.touches : [event];
@@ -224,7 +237,8 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
clickHandler(scope, {$event: event});
});
}
- tapping = false;
+
+ resetState();
});
// Hack for iOS Safari's benefit. It goes searching for onclick handlers and is liable to click
@@ -239,6 +253,15 @@ ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
clickHandler(scope, {$event: event});
});
});
+
+ element.bind('mousedown', function(event) {
+ element.addClass(ACTIVE_CLASS_NAME);
+ });
+
+ element.bind('mousemove mouseup', function(event) {
+ element.removeClass(ACTIVE_CLASS_NAME);
+ });
+
};
}]);