11/*!
2- * Vue.js v1.0.27
2+ * Vue.js v1.0.28
33 * (c) 2016 Evan You
44 * Released under the MIT License.
55 */
@@ -401,6 +401,7 @@ var UA = inBrowser && window.navigator.userAgent.toLowerCase();
401401var isIE = UA && UA . indexOf ( 'trident' ) > 0 ;
402402var isIE9 = UA && UA . indexOf ( 'msie 9.0' ) > 0 ;
403403var isAndroid = UA && UA . indexOf ( 'android' ) > 0 ;
404+ var isIOS = UA && / i p h o n e | i p a d | i p o d | i o s / . test ( UA ) ;
404405
405406var transitionProp = undefined ;
406407var transitionEndEvent = undefined ;
@@ -417,6 +418,12 @@ if (inBrowser && !isIE9) {
417418 animationEndEvent = isWebkitAnim ? 'webkitAnimationEnd' : 'animationend' ;
418419}
419420
421+ /* istanbul ignore next */
422+ function isNative ( Ctor ) {
423+ return ( / n a t i v e c o d e / . test ( Ctor . toString ( ) )
424+ ) ;
425+ }
426+
420427/**
421428 * Defer a task to execute it asynchronously. Ideally this
422429 * should be executed as a microtask, so we leverage
@@ -430,33 +437,53 @@ if (inBrowser && !isIE9) {
430437var nextTick = ( function ( ) {
431438 var callbacks = [ ] ;
432439 var pending = false ;
433- var timerFunc ;
440+ var timerFunc = undefined ;
441+
434442 function nextTickHandler ( ) {
435443 pending = false ;
436444 var copies = callbacks . slice ( 0 ) ;
437- callbacks = [ ] ;
445+ callbacks . length = 0 ;
438446 for ( var i = 0 ; i < copies . length ; i ++ ) {
439447 copies [ i ] ( ) ;
440448 }
441449 }
442450
443- /* istanbul ignore else */
444- if ( inBrowser && window . postMessage && ! window . importScripts && // not in WebWorker
445- ! ( isAndroid && ! window . requestAnimationFrame ) // not in Android <= 4.3
446- ) {
447- ( function ( ) {
448- var NEXT_TICK_TOKEN = '__vue__nextTick__' ;
449- window . addEventListener ( 'message' , function ( e ) {
450- if ( e . source === window && e . data === NEXT_TICK_TOKEN ) {
451- nextTickHandler ( ) ;
452- }
453- } ) ;
454- timerFunc = function ( ) {
455- window . postMessage ( NEXT_TICK_TOKEN , '*' ) ;
456- } ;
457- } ) ( ) ;
458- } else {
459- timerFunc = typeof global !== 'undefined' && global . setImmediate || setTimeout ;
451+ // the nextTick behavior leverages the microtask queue, which can be accessed
452+ // via either native Promise.then or MutationObserver.
453+ // MutationObserver has wider support, however it is seriously bugged in
454+ // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
455+ // completely stops working after triggering a few times... so, if native
456+ // Promise is available, we will use it:
457+ /* istanbul ignore if */
458+ if ( typeof Promise !== 'undefined' && isNative ( Promise ) ) {
459+ var p = Promise . resolve ( ) ;
460+ var noop = function noop ( ) { } ;
461+ timerFunc = function ( ) {
462+ p . then ( nextTickHandler ) ;
463+ // in problematic UIWebViews, Promise.then doesn't completely break, but
464+ // it can get stuck in a weird state where callbacks are pushed into the
465+ // microtask queue but the queue isn't being flushed, until the browser
466+ // needs to do some other work, e.g. handle a timer. Therefore we can
467+ // "force" the microtask queue to be flushed by adding an empty timer.
468+ if ( isIOS ) setTimeout ( noop ) ;
469+ } ;
470+ } else if ( typeof MutationObserver !== 'undefined' ) {
471+ // use MutationObserver where native Promise is not available,
472+ // e.g. IE11, iOS7, Android 4.4
473+ var counter = 1 ;
474+ var observer = new MutationObserver ( nextTickHandler ) ;
475+ var textNode = document . createTextNode ( String ( counter ) ) ;
476+ observer . observe ( textNode , {
477+ characterData : true
478+ } ) ;
479+ timerFunc = function ( ) {
480+ counter = ( counter + 1 ) % 2 ;
481+ textNode . data = String ( counter ) ;
482+ } ;
483+ } else {
484+ // fallback to setTimeout
485+ /* istanbul ignore next */
486+ timerFunc = setTimeout ;
460487 }
461488
462489 return function ( cb , ctx ) {
@@ -472,7 +499,7 @@ var nextTick = (function () {
472499
473500var _Set = undefined ;
474501/* istanbul ignore if */
475- if ( typeof Set !== 'undefined' && Set . toString ( ) . match ( / n a t i v e c o d e / ) ) {
502+ if ( typeof Set !== 'undefined' && isNative ( Set ) ) {
476503 // use native Set when available.
477504 _Set = Set ;
478505} else {
@@ -1634,24 +1661,6 @@ function getOuterHTML(el) {
16341661 }
16351662}
16361663
1637- /**
1638- * Find a vm from a fragment.
1639- *
1640- * @param {Fragment } frag
1641- * @return {Vue|undefined }
1642- */
1643-
1644- function findVmFromFrag ( frag ) {
1645- var node = frag . node ;
1646- // handle multi-node frag
1647- if ( frag . end ) {
1648- while ( ! node . __vue__ && node !== frag . end && node . nextSibling ) {
1649- node = node . nextSibling ;
1650- }
1651- }
1652- return node . __vue__ ;
1653- }
1654-
16551664var commonTagRE = / ^ ( d i v | p | s p a n | i m g | a | b | i | b r | u l | o l | l i | h 1 | h 2 | h 3 | h 4 | h 5 | h 6 | c o d e | p r e | t a b l e | t h | t d | t r | f o r m | l a b e l | i n p u t | s e l e c t | o p t i o n | n a v | a r t i c l e | s e c t i o n | h e a d e r | f o o t e r ) $ / i;
16561665var reservedTagRE = / ^ ( s l o t | p a r t i a l | c o m p o n e n t ) $ / i;
16571666
@@ -2435,6 +2444,7 @@ var util = Object.freeze({
24352444 isIE : isIE ,
24362445 isIE9 : isIE9 ,
24372446 isAndroid : isAndroid ,
2447+ isIOS : isIOS ,
24382448 get transitionProp ( ) { return transitionProp ; } ,
24392449 get transitionEndEvent ( ) { return transitionEndEvent ; } ,
24402450 get animationProp ( ) { return animationProp ; } ,
@@ -2465,7 +2475,6 @@ var util = Object.freeze({
24652475 removeNodeRange : removeNodeRange ,
24662476 isFragment : isFragment ,
24672477 getOuterHTML : getOuterHTML ,
2468- findVmFromFrag : findVmFromFrag ,
24692478 mergeOptions : mergeOptions ,
24702479 resolveAsset : resolveAsset ,
24712480 checkComponentAttr : checkComponentAttr ,
@@ -4101,6 +4110,10 @@ var vFor = {
41014110 params : [ 'track-by' , 'stagger' , 'enter-stagger' , 'leave-stagger' ] ,
41024111
41034112 bind : function bind ( ) {
4113+ if ( process . env . NODE_ENV !== 'production' && this . el . hasAttribute ( 'v-if' ) ) {
4114+ warn ( '<' + this . el . tagName . toLowerCase ( ) + ' v-for="' + this . expression + '" v-if="' + this . el . getAttribute ( 'v-if' ) + '">: ' + 'Using v-if and v-for on the same element is not recommended - ' + 'consider filtering the source Array instead.' , this . vm ) ;
4115+ }
4116+
41044117 // support "item in/of items" syntax
41054118 var inMatch = this . expression . match ( / ( .* ) (?: i n | o f ) ( .* ) / ) ;
41064119 if ( inMatch ) {
@@ -4680,6 +4693,24 @@ if (process.env.NODE_ENV !== 'production') {
46804693 } ;
46814694}
46824695
4696+ /**
4697+ * Find a vm from a fragment.
4698+ *
4699+ * @param {Fragment } frag
4700+ * @return {Vue|undefined }
4701+ */
4702+
4703+ function findVmFromFrag ( frag ) {
4704+ var node = frag . node ;
4705+ // handle multi-node frag
4706+ if ( frag . end ) {
4707+ while ( ! node . __vue__ && node !== frag . end && node . nextSibling ) {
4708+ node = node . nextSibling ;
4709+ }
4710+ }
4711+ return node . __vue__ ;
4712+ }
4713+
46834714var vIf = {
46844715
46854716 priority : IF ,
@@ -4708,10 +4739,8 @@ var vIf = {
47084739 if ( value ) {
47094740 if ( ! this . frag ) {
47104741 this . insert ( ) ;
4711- this . updateRef ( value ) ;
47124742 }
47134743 } else {
4714- this . updateRef ( value ) ;
47154744 this . remove ( ) ;
47164745 }
47174746 } ,
@@ -4743,29 +4772,6 @@ var vIf = {
47434772 }
47444773 } ,
47454774
4746- updateRef : function updateRef ( value ) {
4747- var ref = this . descriptor . ref ;
4748- if ( ! ref ) return ;
4749- var hash = ( this . vm || this . _scope ) . $refs ;
4750- var refs = hash [ ref ] ;
4751- var key = this . _frag . scope . $key ;
4752- if ( ! refs ) return ;
4753- if ( value ) {
4754- if ( Array . isArray ( refs ) ) {
4755- refs . push ( findVmFromFrag ( this . _frag ) ) ;
4756- } else {
4757- refs [ key ] = findVmFromFrag ( this . _frag ) ;
4758- }
4759- } else {
4760- if ( Array . isArray ( refs ) ) {
4761- refs . $remove ( findVmFromFrag ( this . _frag ) ) ;
4762- } else {
4763- refs [ key ] = null ;
4764- delete refs [ key ] ;
4765- }
4766- }
4767- } ,
4768-
47694775 unbind : function unbind ( ) {
47704776 if ( this . frag ) {
47714777 this . frag . destroy ( ) ;
@@ -7064,18 +7070,20 @@ function sortDirectives(dirs) {
70647070
70657071 var groupedMap = { } ;
70667072 var i , j , k , l ;
7073+ var index = 0 ;
7074+ var priorities = [ ] ;
70677075 for ( i = 0 , j = dirs . length ; i < j ; i ++ ) {
70687076 var dir = dirs [ i ] ;
70697077 var priority = dir . descriptor . def . priority || DEFAULT_PRIORITY ;
70707078 var array = groupedMap [ priority ] ;
70717079 if ( ! array ) {
70727080 array = groupedMap [ priority ] = [ ] ;
7081+ priorities . push ( priority ) ;
70737082 }
70747083 array . push ( dir ) ;
70757084 }
70767085
7077- var index = 0 ;
7078- var priorities = Object . keys ( groupedMap ) . sort ( function ( a , b ) {
7086+ priorities . sort ( function ( a , b ) {
70797087 return a > b ? - 1 : a === b ? 0 : 1 ;
70807088 } ) ;
70817089 for ( i = 0 , j = priorities . length ; i < j ; i ++ ) {
@@ -7597,7 +7605,7 @@ function makeTerminalNodeLinkFn(el, dirName, value, options, def, rawName, arg,
75977605 def : def
75987606 } ;
75997607 // check ref for v-for, v-if and router-view
7600- if ( dirName === 'for' || dirName === 'if' || dirName === ' router-view') {
7608+ if ( dirName === 'for' || dirName === 'router-view' ) {
76017609 descriptor . ref = findRef ( el ) ;
76027610 }
76037611 var fn = function terminalNodeLinkFn ( vm , el , host , scope , frag ) {
@@ -10213,7 +10221,7 @@ function installGlobalAPI (Vue) {
1021310221
1021410222installGlobalAPI ( Vue ) ;
1021510223
10216- Vue . version = '1.0.27 ' ;
10224+ Vue . version = '1.0.28 ' ;
1021710225
1021810226// devtools global hook
1021910227/* istanbul ignore next */
0 commit comments