Closes#2336. Closes#2317. Closes#2290. Closes#2228. Closes#2067.
Closes#1890. Closes#1865. Closes#1850. Closes#1755. Closes#1688.
Closes#1578. Closes#1501. Closes#1353. Closes#1342. Closes#782.
Closes#416. Closes#2288.
BREAKING CHANGE: The slideBox's API has undergone many changes.
- **`<ion-slide-box>`** attributes have changed (see
[documentation](http://ionicframework.com/docs/api/directive/ionSlideBox)):
* `active-slide` has changed to `selected`. Change your code from
this:
```html
<ion-slide-box active-slide="activeSlideIndex"></ion-slide-box>
```
To this:
```html
<ion-slide-box selected="activeSlideIndex"></ion-slide-box>
```
* `does-continue` has changed to `loop`. Change your code from this:
```html
<ion-slide-box does-continue="shouldLoop"></ion-slide-box>
```
To this:
```html
<ion-slide-box loop="shouldLoop"></ion-slide-box>
```
* `auto-play` and `slide-interval` have been merged into `auto-play`.
Change your code from this:
```html
<!-- autoPlay is on -->
<ion-slide-box auto-play="true" slide-interval="1000">
</ion-slide-box>
<!-- autoPlay is off -->
<ion-slide-box auto-play="false" slide-interval="1000">
</ion-slide-box>
```
To this:
```html
<!-- autoPlay is on -->
<ion-slide-box auto-play="1000"></ion-slide-box>
<!-- autoPlay is off -->
<ion-slide-box auto-play="false"></ion-slide-box>
```
* `show-pager` and `pager-click` have been removed. Use
a child `<ion-slide-pager>` element. See the [`ion-slide-pager`
documentation](http://ionicframework.com/docs/api/directive/ionSlidePager).
Change your code from this:
```html
<!-- pager using default click action -->
<ion-slide-box show-pager="true">
</ion-slide-box>
<!-- pager with custom click action -->
<ion-slide-box show-pager="true" pager-click="doSomething(index)">
</ion-slide-box>
```
To this:
```html
<ion-slide-box>
<!-- pager using default click action -->
<ion-slide-pager></ion-slide-pager>
</ion-slide-box>
<ion-slide-box>
<!-- pager with custom click action -->
<ion-slide-pager ng-click="doSomething(index)"></ion-slide-pager>
</ion-slide-box>
```
- **`$ionicSlideBoxDelegate`** methods have changed (see
[documentation](http://ionicframework.com/docs/api/service/$ionicSlideBoxDelegate)):
- `update()` has been removed. slideBox updates on its own now.
- `stop()` has been removed. See `autoPlay()` below.
- `start()` hass been removed. See `autoPlay()` below.
- `slide(newIndex[, speed])` has been renamed to `select(newIndex[,
speed]);
- `currentIndex()` has been renamed to `selected()`.
- `slidesCount()` has been renamed to `count()`.
- New method `$ionicSlideBoxDelegate.autoPlay()`. Change your code
from this:
```js
// stop auto sliding
$ionicSlideBoxDelegate.stop();
// later... start auto sliding
$ionicSlideBoxDelegate.start();
```
To this:
```js
var autoPlaySpeed = 3000; //wait 3000 seconds between changing slide
// stop auto sliding
$ionicSlideBoxDelegate.autoPlay(false);
// later... start auto sliding
$ionicSlideBoxDelegate.autoPlay(autoPlaySpeed);
```
- `previous()` now returns the index of the previous slide and does
not select. Change your code from this:
```js
// select previous slide
$ionicSlideBoxDelegate.previous();
```
To this:
```js
// select previous slide
$ionicSlideBoxDelegate.select( $ionicSlideBoxDelegate.previous() );
```
- `next()` now returns the index of the next slide and does
not select. Change your code from this:
```js
// select next slide
$ionicSlideBoxDelegate.next();
```
To this:
```js
// select next slide
$ionicSlideBoxDelegate.select( $ionicSlideBoxDelegate.next() );
```
Previously if this script was executed after the window was loaded, none of the callbacks would fire.
See https://developer.mozilla.org/en-US/docs/Web/API/document.readyState for definition of detecting the `load` event.
TODO: Potentially this is redundent, since maybe using `ionic.DomUtil.ready` would mean one less listener. However I don't know if the listeners attached to `ionic.Platform.ready` require the `document.readyState` to be `complete` rather than only `interactive`.
Linked to #2229
When a state change happens, ensure the keyboard is hidden. When a
keyboard is hidden, ensure all pending timers our cleared. When
resetting scrollView, ensure it’s only doing it when it has to.
For testing: #1670#2192
I added a bit of detail to ready function to remind folks that - in the context of a web browser - even though ready has fired it is *NOT* going to allow for device specific features. It may be too obvious, but I really think a reminder here will help.
If an element isContentEditable, do not ignoreScrollStart incase users
are using contenteditable elements to scroll. This may have originally
been put in because it disabled text selection, and moving the text
cursor on touch. But this doesn’t seem to be the case anymore, so it
may have been put in for platform versions we no longer support. Also
fix the data-prevent-scroll dataset attribute. Closes#2091
The gestures which were being added to side menu content were also
adding the `disable-user-behavior` class, which disabled
contenteditable elements. Now passing in the gesture option
stop_browser_behavior=false, along with adding the options param to the
gestures service. Fixes#421
When a list was within a side menu it could scroll up and down, but if
the user happened to drag a little bit on the X axis, then it would try
to open the side menu and the Y scroll of the content stopped. Closes
#1541
The `tapContainingElement` method was not working correctly to climb up
the DOM of a clicked element to potentially find an ancestor label
element. Closes#1643
A pull request (#1430) was merged that added a requestAnimationFrame polyfill to
the window on platforms that do not have rAF. This was overlooked.
This now has created conflicts with Angular 1.2.17 on Android browsers
that do not have requestAnimationFrame.
The problem was that a polyfill for requestAnimationFrame was put onto the
window for Android <4.3. AngularJS would then check if
window.requestAnimationFrame existed. Angular's check passed, and then
it would try to use cancelAnimationFrame which was undefined.
Now, nothing on the window is changed.
Gesture hold event and ionic’s tap will both fire since the tap has no
strict duration between its start and end (a click will always fire no
matter how long the press is held). If a hold event fires from
ionic.Gesture, then the simulated click which would fire on
touchend/mouseup should be canceled.
With the previous implementation, Chrome complains:
"'webkitCancelAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead."
This fixes that by reusing (copy-paste) the code from angular.js
A better way would be to use ionic.requestAnimationFrame and ionic.cancelAnimationFrame everywhere, but that is more involved and risky...