compass-jquery-plugin 0.3.2.0 → 0.3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +2 -0
- data/VERSION.yml +1 -1
- data/templates/ical/jquery.ical.js +2 -2
- data/templates/ical/jquery.ical.min.js +10 -11
- data/templates/jqgrid/jquery.jqGrid.js +28 -28
- data/templates/jqgrid/jquery.jqGrid.min.js +5 -5
- data/templates/jqtouch/jquery/touch/jqtouch.scss +4 -8
- data/templates/jquery/config/initializers/jquery.rb +1 -0
- data/templates/jquery/jquery-ui.js +368 -274
- data/templates/jquery/jquery-ui.min.js +580 -579
- data/templates/jquery/jquery.replacetext.js +129 -0
- data/templates/jquery/jquery.replacetext.min.js +1 -0
- data/templates/jquery/jquery/ui/_theme.scss +15 -4
- data/templates/jquery/manifest.rb +2 -0
- data/templates/mobile/jquery.mobile.js +431 -357
- data/templates/mobile/jquery.mobile.min.js +2 -2
- data/templates/mobile/jquery/mobile/_base.scss +5 -3
- metadata +7 -5
@@ -0,0 +1,129 @@
|
|
1
|
+
/*!
|
2
|
+
* jQuery replaceText - v1.1 - 11/21/2009
|
3
|
+
* http://benalman.com/projects/jquery-replacetext-plugin/
|
4
|
+
*
|
5
|
+
* Copyright (c) 2009 "Cowboy" Ben Alman
|
6
|
+
* Dual licensed under the MIT and GPL licenses.
|
7
|
+
* http://benalman.com/about/license/
|
8
|
+
*/
|
9
|
+
|
10
|
+
// Script: jQuery replaceText: String replace for your jQueries!
|
11
|
+
//
|
12
|
+
// *Version: 1.1, Last updated: 11/21/2009*
|
13
|
+
//
|
14
|
+
// Project Home - http://benalman.com/projects/jquery-replacetext-plugin/
|
15
|
+
// GitHub - http://github.com/cowboy/jquery-replacetext/
|
16
|
+
// Source - http://github.com/cowboy/jquery-replacetext/raw/master/jquery.ba-replacetext.js
|
17
|
+
// (Minified) - http://github.com/cowboy/jquery-replacetext/raw/master/jquery.ba-replacetext.min.js (0.5kb)
|
18
|
+
//
|
19
|
+
// About: License
|
20
|
+
//
|
21
|
+
// Copyright (c) 2009 "Cowboy" Ben Alman,
|
22
|
+
// Dual licensed under the MIT and GPL licenses.
|
23
|
+
// http://benalman.com/about/license/
|
24
|
+
//
|
25
|
+
// About: Examples
|
26
|
+
//
|
27
|
+
// This working example, complete with fully commented code, illustrates one way
|
28
|
+
// in which this plugin can be used.
|
29
|
+
//
|
30
|
+
// replaceText - http://benalman.com/code/projects/jquery-replacetext/examples/replacetext/
|
31
|
+
//
|
32
|
+
// About: Support and Testing
|
33
|
+
//
|
34
|
+
// Information about what version or versions of jQuery this plugin has been
|
35
|
+
// tested with, and what browsers it has been tested in.
|
36
|
+
//
|
37
|
+
// jQuery Versions - 1.3.2, 1.4.1
|
38
|
+
// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome, Opera 9.6-10.1.
|
39
|
+
//
|
40
|
+
// About: Release History
|
41
|
+
//
|
42
|
+
// 1.1 - (11/21/2009) Simplified the code and API substantially.
|
43
|
+
// 1.0 - (11/21/2009) Initial release
|
44
|
+
|
45
|
+
(function($){
|
46
|
+
'$:nomunge'; // Used by YUI compressor.
|
47
|
+
|
48
|
+
// Method: jQuery.fn.replaceText
|
49
|
+
//
|
50
|
+
// Replace text in specified elements. Note that only text content will be
|
51
|
+
// modified, leaving all tags and attributes untouched. The new text can be
|
52
|
+
// either text or HTML.
|
53
|
+
//
|
54
|
+
// Uses the String prototype replace method, full documentation on that method
|
55
|
+
// can be found here:
|
56
|
+
//
|
57
|
+
// https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String/Replace
|
58
|
+
//
|
59
|
+
// Usage:
|
60
|
+
//
|
61
|
+
// > jQuery('selector').replaceText( search, replace [, text_only ] );
|
62
|
+
//
|
63
|
+
// Arguments:
|
64
|
+
//
|
65
|
+
// search - (RegExp|String) A RegExp object or substring to be replaced.
|
66
|
+
// Because the String prototype replace method is used internally, this
|
67
|
+
// argument should be specified accordingly.
|
68
|
+
// replace - (String|Function) The String that replaces the substring received
|
69
|
+
// from the search argument, or a function to be invoked to create the new
|
70
|
+
// substring. Because the String prototype replace method is used internally,
|
71
|
+
// this argument should be specified accordingly.
|
72
|
+
// text_only - (Boolean) If true, any HTML will be rendered as text. Defaults
|
73
|
+
// to false.
|
74
|
+
//
|
75
|
+
// Returns:
|
76
|
+
//
|
77
|
+
// (jQuery) The initial jQuery collection of elements.
|
78
|
+
|
79
|
+
$.fn.replaceText = function( search, replace, text_only ) {
|
80
|
+
return this.each(function(){
|
81
|
+
var node = this.firstChild,
|
82
|
+
val,
|
83
|
+
new_val,
|
84
|
+
|
85
|
+
// Elements to be removed at the end.
|
86
|
+
remove = [];
|
87
|
+
|
88
|
+
// Only continue if firstChild exists.
|
89
|
+
if ( node ) {
|
90
|
+
|
91
|
+
// Loop over all childNodes.
|
92
|
+
do {
|
93
|
+
|
94
|
+
// Only process text nodes.
|
95
|
+
if ( node.nodeType === 3 ) {
|
96
|
+
|
97
|
+
// The original node value.
|
98
|
+
val = node.nodeValue;
|
99
|
+
|
100
|
+
// The new value.
|
101
|
+
new_val = val.replace( search, replace );
|
102
|
+
|
103
|
+
// Only replace text if the new value is actually different!
|
104
|
+
if ( new_val !== val ) {
|
105
|
+
|
106
|
+
if ( !text_only && /</.test( new_val ) ) {
|
107
|
+
// The new value contains HTML, set it in a slower but far more
|
108
|
+
// robust way.
|
109
|
+
$(node).before( new_val );
|
110
|
+
|
111
|
+
// Don't remove the node yet, or the loop will lose its place.
|
112
|
+
remove.push( node );
|
113
|
+
} else {
|
114
|
+
// The new value contains no HTML, so it can be set in this
|
115
|
+
// very fast, simple way.
|
116
|
+
node.nodeValue = new_val;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
} while ( node = node.nextSibling );
|
122
|
+
}
|
123
|
+
|
124
|
+
// Time to remove those elements!
|
125
|
+
remove.length && $(remove).remove();
|
126
|
+
});
|
127
|
+
};
|
128
|
+
|
129
|
+
})(jQuery);
|
@@ -0,0 +1 @@
|
|
1
|
+
(function(c){c.fn.replaceText=function(f,g,h){return this.each(function(){var a=this.firstChild,d,b,e=[];if(a){do if(a.nodeType===3){d=a.nodeValue;b=d.replace(f,g);if(b!==d)if(!h&&/</.test(b)){c(a).before(b);e.push(a)}else a.nodeValue=b}while(a=a.nextSibling)}e.length&&c(e).remove()})}})(jQuery);
|
@@ -741,10 +741,12 @@ button.ui-button::-moz-focus-inner {
|
|
741
741
|
----------------------------------*/
|
742
742
|
.ui-selectmenu {
|
743
743
|
display: block;
|
744
|
+
display: inline-block;
|
744
745
|
position: relative;
|
745
|
-
height: 2em;
|
746
|
+
height: 2.2em;
|
746
747
|
text-decoration: none;
|
747
|
-
overflow: hidden;
|
748
|
+
overflow: hidden;
|
749
|
+
zoom: 1; }
|
748
750
|
|
749
751
|
.ui-selectmenu-icon {
|
750
752
|
position: absolute;
|
@@ -784,7 +786,7 @@ button.ui-button::-moz-focus-inner {
|
|
784
786
|
.ui-selectmenu-menu li a,.ui-selectmenu-status {
|
785
787
|
line-height: 1.4em;
|
786
788
|
display: block;
|
787
|
-
padding: .
|
789
|
+
padding: .405em 1em;
|
788
790
|
outline: none;
|
789
791
|
text-decoration: none; }
|
790
792
|
|
@@ -819,7 +821,7 @@ button.ui-button::-moz-focus-inner {
|
|
819
821
|
.ui-selectmenu-menu li .ui-selectmenu-item-footer {
|
820
822
|
opacity: .8; }
|
821
823
|
|
822
|
-
/*for optgroups*/
|
824
|
+
/* for optgroups */
|
823
825
|
.ui-selectmenu-menu .ui-selectmenu-group {
|
824
826
|
font-size: 1em; }
|
825
827
|
|
@@ -833,6 +835,15 @@ button.ui-button::-moz-focus-inner {
|
|
833
835
|
margin: 0;
|
834
836
|
padding: 0; }
|
835
837
|
|
838
|
+
/* IE6 workaround (dotted transparent borders) */
|
839
|
+
* html .ui-selectmenu-menu li {
|
840
|
+
border-color: pink;
|
841
|
+
filter: chroma(color = pink);
|
842
|
+
width: 100%; }
|
843
|
+
|
844
|
+
* html .ui-selectmenu-menu li a {
|
845
|
+
position: relative; }
|
846
|
+
|
836
847
|
|
837
848
|
/*
|
838
849
|
* jQuery UI Slider 1.8.9
|
@@ -34,6 +34,8 @@ javascript 'jquery.offline.js'
|
|
34
34
|
javascript 'jquery.offline.min.js'
|
35
35
|
javascript 'jquery.pngFix.js'
|
36
36
|
javascript 'jquery.pngFix.min.js'
|
37
|
+
javascript 'jquery.replacetext.js'
|
38
|
+
javascript 'jquery.replacetext.min.js'
|
37
39
|
javascript 'jquery.themeswitchertool.js'
|
38
40
|
javascript 'jquery.themeswitchertool.min.js'
|
39
41
|
javascript 'jquery.tmpl.js'
|
@@ -1185,7 +1185,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1185
1185
|
|
1186
1186
|
_create: function() {
|
1187
1187
|
var $elem = this.element,
|
1188
|
-
o = this.options;
|
1188
|
+
o = this.options;
|
1189
1189
|
|
1190
1190
|
this.keepNative = "[data-role='none'], [data-role='nojs']" + (o.keepNative ? ", " + o.keepNative : "");
|
1191
1191
|
|
@@ -1236,7 +1236,8 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1236
1236
|
|
1237
1237
|
// auto-add back btn on pages beyond first view
|
1238
1238
|
if ( o.addBackBtn && role === "header" &&
|
1239
|
-
|
1239
|
+
$( ".ui-page" ).length > 1 &&
|
1240
|
+
$elem.data( "url" ) !== $.mobile.path.stripHash( location.hash ) &&
|
1240
1241
|
!leftbtn && $this.data( "backbtn" ) !== false ) {
|
1241
1242
|
|
1242
1243
|
$( "<a href='#' class='ui-btn-left' data-rel='back' data-icon='arrow-l'>"+ o.backBtnText +"</a>" ).prependTo( $this );
|
@@ -1381,21 +1382,24 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1381
1382
|
//define the url parameter used for referencing widget-generated sub-pages.
|
1382
1383
|
//Translates to to example.html&ui-page=subpageIdentifier
|
1383
1384
|
//hash segment before &ui-page= is used to make Ajax request
|
1384
|
-
subPageUrlKey:
|
1385
|
+
subPageUrlKey: "ui-page",
|
1385
1386
|
|
1386
1387
|
//anchor links with a data-rel, or pages with a data-role, that match these selectors will be untrackable in history
|
1387
1388
|
//(no change in URL, not bookmarkable)
|
1388
|
-
nonHistorySelectors:
|
1389
|
+
nonHistorySelectors: "dialog",
|
1389
1390
|
|
1390
1391
|
//class assigned to page currently in view, and during transitions
|
1391
|
-
activePageClass:
|
1392
|
+
activePageClass: "ui-page-active",
|
1392
1393
|
|
1393
1394
|
//class used for "active" button state, from CSS framework
|
1394
|
-
activeBtnClass:
|
1395
|
+
activeBtnClass: "ui-btn-active",
|
1395
1396
|
|
1396
1397
|
//automatically handle clicks and form submissions through Ajax, when same-domain
|
1397
1398
|
ajaxEnabled: true,
|
1398
1399
|
|
1400
|
+
//automatically load and show pages based on location.hash
|
1401
|
+
hashListeningEnabled: true,
|
1402
|
+
|
1399
1403
|
// TODO: deprecated - remove at 1.0
|
1400
1404
|
//automatically handle link clicks through Ajax, when possible
|
1401
1405
|
ajaxLinksEnabled: true,
|
@@ -1405,7 +1409,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1405
1409
|
ajaxFormsEnabled: true,
|
1406
1410
|
|
1407
1411
|
//set default transition - 'none' for no transitions
|
1408
|
-
defaultTransition:
|
1412
|
+
defaultTransition: "slide",
|
1409
1413
|
|
1410
1414
|
//show loading message during Ajax requests
|
1411
1415
|
//if false, message will not appear, but loading classes will still be toggled on html el
|
@@ -1421,6 +1425,9 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1421
1425
|
return $.support.mediaquery;
|
1422
1426
|
},
|
1423
1427
|
|
1428
|
+
//automatically initialize first pages or not.
|
1429
|
+
autoInitialize: true,
|
1430
|
+
|
1424
1431
|
//TODO might be useful upstream in jquery itself ?
|
1425
1432
|
keyCode: {
|
1426
1433
|
ALT: 18,
|
@@ -1460,7 +1467,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1460
1467
|
|
1461
1468
|
|
1462
1469
|
//trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
|
1463
|
-
$( window.document ).trigger(
|
1470
|
+
$( window.document ).trigger( "mobileinit" );
|
1464
1471
|
|
1465
1472
|
|
1466
1473
|
//support conditions
|
@@ -1473,25 +1480,25 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1473
1480
|
|
1474
1481
|
//define vars for interal use
|
1475
1482
|
var $window = $(window),
|
1476
|
-
$html = $(
|
1477
|
-
$head = $(
|
1483
|
+
$html = $( "html" ),
|
1484
|
+
$head = $( "head" ),
|
1478
1485
|
|
1479
1486
|
//loading div which appears during Ajax requests
|
1480
1487
|
//will not appear if $.mobile.loadingMessage is false
|
1481
1488
|
$loader = $.mobile.loadingMessage ?
|
1482
|
-
$(
|
1483
|
-
|
1484
|
-
|
1485
|
-
|
1489
|
+
$( "<div class='ui-loader ui-body-a ui-corner-all'>" +
|
1490
|
+
"<span class='ui-icon ui-icon-loading spin'></span>" +
|
1491
|
+
"<h1>" + $.mobile.loadingMessage + "</h1>" +
|
1492
|
+
"</div>" )
|
1486
1493
|
: undefined;
|
1487
1494
|
|
1488
1495
|
|
1489
1496
|
//add mobile, initial load "rendering" classes to docEl
|
1490
|
-
$html.addClass(
|
1497
|
+
$html.addClass( "ui-mobile ui-mobile-rendering" );
|
1491
1498
|
|
1492
1499
|
|
1493
1500
|
//define & prepend meta viewport tag, if content is defined
|
1494
|
-
$.mobile.metaViewportContent ? $("<meta>", { name: "viewport", content: $.mobile.metaViewportContent}).prependTo( $head ) : undefined;
|
1501
|
+
$.mobile.metaViewportContent ? $( "<meta>", { name: "viewport", content: $.mobile.metaViewportContent}).prependTo( $head ) : undefined;
|
1495
1502
|
|
1496
1503
|
|
1497
1504
|
//expose some core utilities
|
@@ -1503,10 +1510,17 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1503
1510
|
$html.removeClass( "ui-loading" );
|
1504
1511
|
} else {
|
1505
1512
|
if( $.mobile.loadingMessage ){
|
1506
|
-
var
|
1507
|
-
|
1508
|
-
$loader
|
1513
|
+
var activeBtn =$( "." + $.mobile.activeBtnClass ).first();
|
1514
|
+
|
1515
|
+
$loader
|
1516
|
+
.appendTo( $.mobile.pageContainer )
|
1517
|
+
//position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
|
1518
|
+
.css( {
|
1519
|
+
top: $.support.scrollTop && $(window).scrollTop() + $(window).height() / 2 ||
|
1520
|
+
activeBtn.length && activeBtn.offset().top || 100
|
1521
|
+
} );
|
1509
1522
|
}
|
1523
|
+
|
1510
1524
|
$html.addClass( "ui-loading" );
|
1511
1525
|
}
|
1512
1526
|
},
|
@@ -1516,46 +1530,52 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1516
1530
|
ypos = ypos || 0;
|
1517
1531
|
// prevent scrollstart and scrollstop events
|
1518
1532
|
$.event.special.scrollstart.enabled = false;
|
1533
|
+
|
1519
1534
|
setTimeout(function() {
|
1520
1535
|
window.scrollTo( 0, ypos );
|
1521
|
-
$(document).trigger("silentscroll", { x: 0, y: ypos });
|
1536
|
+
$(document).trigger( "silentscroll", { x: 0, y: ypos });
|
1522
1537
|
},20);
|
1538
|
+
|
1523
1539
|
setTimeout(function() {
|
1524
1540
|
$.event.special.scrollstart.enabled = true;
|
1525
1541
|
}, 150 );
|
1526
|
-
}
|
1527
|
-
});
|
1528
|
-
|
1529
|
-
|
1530
|
-
//dom-ready inits
|
1531
|
-
$(function(){
|
1532
|
-
|
1533
|
-
//find present pages
|
1534
|
-
var $pages = $("[data-role='page']");
|
1535
|
-
|
1536
|
-
$("[data-role='page'], [data-role='dialog']").each(function(){
|
1537
|
-
$(this).attr('data-url', $(this).attr('id'));
|
1538
|
-
});
|
1542
|
+
},
|
1539
1543
|
|
1540
|
-
//
|
1541
|
-
|
1544
|
+
// find and enhance the pages in the dom and transition to the first page.
|
1545
|
+
initializePage: function(){
|
1546
|
+
//find present pages
|
1547
|
+
var $pages = $( "[data-role='page']" );
|
1542
1548
|
|
1543
|
-
|
1544
|
-
|
1549
|
+
//add dialogs, set data-url attrs
|
1550
|
+
$pages.add( "[data-role='dialog']" ).each(function(){
|
1551
|
+
$(this).attr( "data-url", $(this).attr( "id" ));
|
1552
|
+
});
|
1545
1553
|
|
1546
|
-
|
1547
|
-
|
1554
|
+
//define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
|
1555
|
+
$.mobile.firstPage = $pages.first();
|
1548
1556
|
|
1549
|
-
|
1550
|
-
|
1557
|
+
//define page container
|
1558
|
+
$.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" );
|
1551
1559
|
|
1552
|
-
|
1553
|
-
|
1560
|
+
//cue page loading message
|
1561
|
+
$.mobile.pageLoading();
|
1554
1562
|
|
1555
|
-
|
1556
|
-
|
1563
|
+
// if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM
|
1564
|
+
if( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ){
|
1565
|
+
$.mobile.changePage( $.mobile.firstPage, false, true, false, true );
|
1566
|
+
}
|
1567
|
+
// otherwise, trigger a hashchange to load a deeplink
|
1568
|
+
else {
|
1569
|
+
$window.trigger( "hashchange", [ true ] );
|
1570
|
+
}
|
1571
|
+
}
|
1557
1572
|
});
|
1558
1573
|
|
1574
|
+
//dom-ready inits
|
1575
|
+
if($.mobile.autoInitialize){
|
1576
|
+
$($.mobile.initializePage);
|
1577
|
+
}
|
1578
|
+
|
1559
1579
|
|
1560
1580
|
//window load event
|
1561
1581
|
//hide iOS browser chrome on load
|
@@ -1593,7 +1613,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1593
1613
|
var splitkey = '&' + $.mobile.subPageUrlKey;
|
1594
1614
|
return path && path.split( splitkey )[0].split( dialogHashKey )[0];
|
1595
1615
|
},
|
1596
|
-
|
1616
|
+
|
1597
1617
|
//set location hash to path
|
1598
1618
|
set: function( path ){
|
1599
1619
|
location.hash = path;
|
@@ -1605,83 +1625,93 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1605
1625
|
setOrigin: function(){
|
1606
1626
|
path.origin = path.get( location.protocol + '//' + location.host + location.pathname );
|
1607
1627
|
},
|
1608
|
-
|
1628
|
+
|
1609
1629
|
//prefix a relative url with the current path
|
1610
1630
|
makeAbsolute: function( url ){
|
1611
1631
|
return path.get() + url;
|
1612
1632
|
},
|
1613
|
-
|
1633
|
+
|
1614
1634
|
//return a url path with the window's location protocol/hostname removed
|
1615
1635
|
clean: function( url ){
|
1616
1636
|
return url.replace( location.protocol + "//" + location.host, "");
|
1617
1637
|
},
|
1618
|
-
|
1638
|
+
|
1619
1639
|
//just return the url without an initial #
|
1620
1640
|
stripHash: function( url ){
|
1621
1641
|
return url.replace( /^#/, "" );
|
1622
1642
|
},
|
1623
|
-
|
1643
|
+
|
1624
1644
|
//check whether a url is referencing the same domain, or an external domain or different protocol
|
1625
1645
|
//could be mailto, etc
|
1626
1646
|
isExternal: function( url ){
|
1627
1647
|
return path.hasProtocol( path.clean( url ) );
|
1628
1648
|
},
|
1629
|
-
|
1649
|
+
|
1630
1650
|
hasProtocol: function( url ){
|
1631
1651
|
return /^(:?\w+:)/.test( url );
|
1632
1652
|
},
|
1633
|
-
|
1653
|
+
|
1634
1654
|
//check if the url is relative
|
1635
1655
|
isRelative: function( url ){
|
1636
1656
|
return /^[^\/|#]/.test( url ) && !path.hasProtocol( url );
|
1657
|
+
},
|
1658
|
+
|
1659
|
+
isEmbeddedPage: function( url ){
|
1660
|
+
return /^#/.test( url );
|
1637
1661
|
}
|
1638
1662
|
},
|
1639
1663
|
|
1640
1664
|
//will be defined when a link is clicked and given an active class
|
1641
1665
|
$activeClickedLink = null,
|
1642
|
-
|
1666
|
+
|
1643
1667
|
//urlHistory is purely here to make guesses at whether the back or forward button was clicked
|
1644
1668
|
//and provide an appropriate transition
|
1645
1669
|
urlHistory = {
|
1646
1670
|
//array of pages that are visited during a single page load. each has a url and optional transition
|
1647
1671
|
stack: [],
|
1648
|
-
|
1672
|
+
|
1649
1673
|
//maintain an index number for the active page in the stack
|
1650
1674
|
activeIndex: 0,
|
1651
|
-
|
1675
|
+
|
1652
1676
|
//get active
|
1653
1677
|
getActive: function(){
|
1654
1678
|
return urlHistory.stack[ urlHistory.activeIndex ];
|
1655
1679
|
},
|
1656
|
-
|
1680
|
+
|
1657
1681
|
getPrev: function(){
|
1658
1682
|
return urlHistory.stack[ urlHistory.activeIndex - 1 ];
|
1659
1683
|
},
|
1660
|
-
|
1684
|
+
|
1661
1685
|
getNext: function(){
|
1662
1686
|
return urlHistory.stack[ urlHistory.activeIndex + 1 ];
|
1663
1687
|
},
|
1664
|
-
|
1688
|
+
|
1665
1689
|
// addNew is used whenever a new page is added
|
1666
1690
|
addNew: function( url, transition ){
|
1667
1691
|
//if there's forward history, wipe it
|
1668
1692
|
if( urlHistory.getNext() ){
|
1669
1693
|
urlHistory.clearForward();
|
1670
1694
|
}
|
1671
|
-
|
1695
|
+
|
1672
1696
|
urlHistory.stack.push( {url : url, transition: transition } );
|
1673
|
-
|
1697
|
+
|
1674
1698
|
urlHistory.activeIndex = urlHistory.stack.length - 1;
|
1675
1699
|
},
|
1676
|
-
|
1700
|
+
|
1677
1701
|
//wipe urls ahead of active index
|
1678
1702
|
clearForward: function(){
|
1679
1703
|
urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 );
|
1680
1704
|
},
|
1681
1705
|
|
1682
|
-
//
|
1706
|
+
//wipe all urls
|
1707
|
+
clear: function(){
|
1708
|
+
urlHistory.stack = [];
|
1709
|
+
urlHistory.activeIndex = 0;
|
1710
|
+
},
|
1711
|
+
|
1712
|
+
//disable hashchange event listener internally to ignore one change
|
1683
1713
|
//toggled internally when location.hash is updated to match the url of a successful page load
|
1684
|
-
|
1714
|
+
ignoreNextHashChange: true
|
1685
1715
|
},
|
1686
1716
|
|
1687
1717
|
//define first selector to receive focus when a page is shown
|
@@ -1689,7 +1719,13 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1689
1719
|
|
1690
1720
|
//contains role for next page, if defined on clicked link via data-rel
|
1691
1721
|
nextPageRole = null,
|
1692
|
-
|
1722
|
+
|
1723
|
+
//queue to hold simultanious page transitions
|
1724
|
+
pageTransitionQueue = [],
|
1725
|
+
|
1726
|
+
// indicates whether or not page is in process of transitioning
|
1727
|
+
isPageTransitioning = false,
|
1728
|
+
|
1693
1729
|
//nonsense hash change key for dialogs, so they create a history entry
|
1694
1730
|
dialogHashKey = "&ui-state=dialog";
|
1695
1731
|
|
@@ -1779,7 +1815,8 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1779
1815
|
return $(this).one('webkitAnimationEnd', callback);
|
1780
1816
|
}
|
1781
1817
|
else{
|
1782
|
-
|
1818
|
+
// defer execution for consistency between webkit/non webkit
|
1819
|
+
setTimeout(callback, 0);
|
1783
1820
|
}
|
1784
1821
|
};
|
1785
1822
|
|
@@ -1790,17 +1827,17 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1790
1827
|
//update location.hash, with or without triggering hashchange event
|
1791
1828
|
//TODO - deprecate this one at 1.0
|
1792
1829
|
$.mobile.updateHash = path.set;
|
1793
|
-
|
1830
|
+
|
1794
1831
|
//expose path object on $.mobile
|
1795
1832
|
$.mobile.path = path;
|
1796
|
-
|
1833
|
+
|
1797
1834
|
//expose base object on $.mobile
|
1798
1835
|
$.mobile.base = base;
|
1799
1836
|
|
1800
1837
|
//url stack, useful when plugins need to be aware of previous pages viewed
|
1801
1838
|
//TODO: deprecate this one at 1.0
|
1802
1839
|
$.mobile.urlstack = urlHistory.stack;
|
1803
|
-
|
1840
|
+
|
1804
1841
|
//history stack
|
1805
1842
|
$.mobile.urlHistory = urlHistory;
|
1806
1843
|
|
@@ -1820,19 +1857,25 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1820
1857
|
currPage = urlHistory.getActive(),
|
1821
1858
|
back = false,
|
1822
1859
|
forward = false;
|
1823
|
-
|
1824
|
-
|
1860
|
+
|
1861
|
+
|
1825
1862
|
// If we are trying to transition to the same page that we are currently on ignore the request.
|
1826
1863
|
// an illegal same page request is defined by the current page being the same as the url, as long as there's history
|
1827
1864
|
// and to is not an array or object (those are allowed to be "same")
|
1828
1865
|
if( currPage && urlHistory.stack.length > 1 && currPage.url === url && !toIsArray && !toIsObject ) {
|
1829
1866
|
return;
|
1830
|
-
}
|
1831
|
-
|
1867
|
+
}
|
1868
|
+
else if(isPageTransitioning) {
|
1869
|
+
pageTransitionQueue.unshift(arguments);
|
1870
|
+
return;
|
1871
|
+
}
|
1872
|
+
|
1873
|
+
isPageTransitioning = true;
|
1874
|
+
|
1832
1875
|
// if the changePage was sent from a hashChange event
|
1833
1876
|
// guess if it came from the history menu
|
1834
1877
|
if( fromHashChange ){
|
1835
|
-
|
1878
|
+
|
1836
1879
|
// check if url is in history and if it's ahead or behind current page
|
1837
1880
|
$.each( urlHistory.stack, function( i ){
|
1838
1881
|
//if the url is in the stack, it's a forward or a back
|
@@ -1846,7 +1889,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1846
1889
|
urlHistory.activeIndex = i;
|
1847
1890
|
}
|
1848
1891
|
});
|
1849
|
-
|
1892
|
+
|
1850
1893
|
//if it's a back, use reverse animation
|
1851
1894
|
if( back ){
|
1852
1895
|
reverse = true;
|
@@ -1856,7 +1899,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1856
1899
|
transition = transition || urlHistory.getActive().transition;
|
1857
1900
|
}
|
1858
1901
|
}
|
1859
|
-
|
1902
|
+
|
1860
1903
|
|
1861
1904
|
if( toIsObject && to.url ){
|
1862
1905
|
url = to.url,
|
@@ -1868,7 +1911,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1868
1911
|
if($.type( data ) == "object" ){
|
1869
1912
|
data = $.param(data);
|
1870
1913
|
}
|
1871
|
-
|
1914
|
+
|
1872
1915
|
url += "?" + data;
|
1873
1916
|
data = undefined;
|
1874
1917
|
}
|
@@ -1878,7 +1921,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1878
1921
|
if(base){ base.reset(); }
|
1879
1922
|
|
1880
1923
|
//kill the keyboard
|
1881
|
-
$( window.document.activeElement ).add(
|
1924
|
+
$( window.document.activeElement ).add( "input:focus, textarea:focus, select:focus" ).blur();
|
1882
1925
|
|
1883
1926
|
function defaultTransition(){
|
1884
1927
|
if(transition === undefined){
|
@@ -1892,52 +1935,65 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1892
1935
|
|
1893
1936
|
//get current scroll distance
|
1894
1937
|
var currScroll = $window.scrollTop(),
|
1895
|
-
perspectiveTransitions = ["flip"],
|
1938
|
+
perspectiveTransitions = [ "flip" ],
|
1896
1939
|
pageContainerClasses = [];
|
1897
|
-
|
1898
|
-
//support deep-links to generated sub-pages
|
1940
|
+
|
1941
|
+
//support deep-links to generated sub-pages
|
1899
1942
|
if( url.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ){
|
1900
1943
|
to = $( "[data-url='" + url + "']" );
|
1901
1944
|
}
|
1902
|
-
|
1903
|
-
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1945
|
+
|
1946
|
+
if( from ){
|
1947
|
+
//set as data for returning to that spot
|
1948
|
+
from.data( "lastScroll", currScroll);
|
1949
|
+
//trigger before show/hide events
|
1950
|
+
from.data( "page" )._trigger( "beforehide", { nextPage: to } );
|
1951
|
+
}
|
1952
|
+
to.data( "page" )._trigger( "beforeshow", { prevPage: from || $("") } );
|
1909
1953
|
|
1910
1954
|
function loadComplete(){
|
1911
1955
|
|
1912
1956
|
if( changeHash !== false && url ){
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
1957
|
+
//disable hash listening temporarily
|
1958
|
+
urlHistory.ignoreNextHashChange = false;
|
1959
|
+
//update hash and history
|
1916
1960
|
path.set( url );
|
1917
|
-
urlHistory.listeningEnabled = true;
|
1918
1961
|
}
|
1919
|
-
|
1962
|
+
|
1920
1963
|
//add page to history stack if it's not back or forward
|
1921
1964
|
if( !back && !forward ){
|
1922
1965
|
urlHistory.addNew( url, transition );
|
1923
1966
|
}
|
1924
|
-
|
1967
|
+
|
1925
1968
|
removeActiveLinkClass();
|
1926
1969
|
|
1927
1970
|
//jump to top or prev scroll, sometimes on iOS the page has not rendered yet. I could only get by this with a setTimeout, but would like to avoid that.
|
1928
|
-
$.mobile.silentScroll( to.data(
|
1971
|
+
$.mobile.silentScroll( to.data( "lastScroll" ) );
|
1972
|
+
|
1929
1973
|
reFocus( to );
|
1930
1974
|
|
1931
|
-
//trigger show/hide events
|
1932
|
-
|
1933
|
-
|
1934
|
-
$.mobile.activePage = to;
|
1975
|
+
//trigger show/hide events
|
1976
|
+
if( from ){
|
1977
|
+
from.data( "page" )._trigger( "hide", null, { nextPage: to } );
|
1935
1978
|
}
|
1979
|
+
//trigger pageshow, define prevPage as either from or empty jQuery obj
|
1980
|
+
to.data( "page" )._trigger( "show", null, { prevPage: from || $("") } );
|
1981
|
+
|
1982
|
+
//set "to" as activePage
|
1983
|
+
$.mobile.activePage = to;
|
1936
1984
|
|
1937
1985
|
//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
|
1938
1986
|
if (duplicateCachedPage != null) {
|
1939
1987
|
duplicateCachedPage.remove();
|
1940
1988
|
}
|
1989
|
+
|
1990
|
+
//remove initial build class (only present on first pageshow)
|
1991
|
+
$html.removeClass( "ui-mobile-rendering" );
|
1992
|
+
|
1993
|
+
isPageTransitioning = false
|
1994
|
+
if(pageTransitionQueue.length>0) {
|
1995
|
+
$.mobile.changePage.apply($.mobile, pageTransitionQueue.pop());
|
1996
|
+
}
|
1941
1997
|
};
|
1942
1998
|
|
1943
1999
|
function addContainerClass(className){
|
@@ -1952,8 +2008,8 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1952
2008
|
|
1953
2009
|
pageContainerClasses = [];
|
1954
2010
|
};
|
1955
|
-
|
1956
|
-
|
2011
|
+
|
2012
|
+
|
1957
2013
|
|
1958
2014
|
if(transition && (transition !== 'none')){
|
1959
2015
|
$.mobile.pageLoading( true );
|
@@ -1963,26 +2019,27 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1963
2019
|
|
1964
2020
|
addContainerClass('ui-mobile-viewport-transitioning');
|
1965
2021
|
|
1966
|
-
|
1967
|
-
|
1968
|
-
|
1969
|
-
* what I could tell this was a problem with the classes not being applied yet.
|
1970
|
-
*/
|
1971
|
-
setTimeout(function() { from.addClass( transition + " out " + ( reverse ? "reverse" : "" ) );
|
2022
|
+
if( from ){
|
2023
|
+
from.addClass( transition + " out " + ( reverse ? "reverse" : "" ) );
|
2024
|
+
}
|
1972
2025
|
to.addClass( $.mobile.activePageClass + " " + transition +
|
1973
|
-
" in " + ( reverse ? "reverse" : "" ) );
|
2026
|
+
" in " + ( reverse ? "reverse" : "" ) );
|
1974
2027
|
|
1975
2028
|
// callback - remove classes, etc
|
1976
2029
|
to.animationComplete(function() {
|
1977
2030
|
from.add( to ).removeClass("out in reverse " + transition );
|
1978
|
-
|
2031
|
+
if( from ){
|
2032
|
+
from.removeClass( $.mobile.activePageClass );
|
2033
|
+
}
|
1979
2034
|
loadComplete();
|
1980
2035
|
removeContainerClasses();
|
1981
2036
|
});
|
1982
2037
|
}
|
1983
2038
|
else{
|
1984
2039
|
$.mobile.pageLoading( true );
|
1985
|
-
|
2040
|
+
if( from ){
|
2041
|
+
from.removeClass( $.mobile.activePageClass );
|
2042
|
+
}
|
1986
2043
|
to.addClass( $.mobile.activePageClass );
|
1987
2044
|
loadComplete();
|
1988
2045
|
}
|
@@ -2017,7 +2074,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2017
2074
|
fileUrl = toIDfileurl;
|
2018
2075
|
}
|
2019
2076
|
}
|
2020
|
-
|
2077
|
+
|
2021
2078
|
// ensure a transition has been set where pop is undefined
|
2022
2079
|
defaultTransition();
|
2023
2080
|
|
@@ -2025,7 +2082,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2025
2082
|
if ( to.length && !isFormRequest ) {
|
2026
2083
|
if( fileUrl && base ){
|
2027
2084
|
base.set( fileUrl );
|
2028
|
-
}
|
2085
|
+
}
|
2029
2086
|
enhancePage();
|
2030
2087
|
transitionPages();
|
2031
2088
|
} else {
|
@@ -2042,23 +2099,23 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2042
2099
|
type: type,
|
2043
2100
|
data: data,
|
2044
2101
|
success: function( html ) {
|
2045
|
-
|
2046
|
-
//pre-parse html to check for a data-url,
|
2102
|
+
|
2103
|
+
//pre-parse html to check for a data-url,
|
2047
2104
|
//use it as the new fileUrl, base path, etc
|
2048
2105
|
var redirectLoc = / data-url="(.*)"/.test( html ) && RegExp.$1;
|
2049
2106
|
|
2050
2107
|
if( redirectLoc ){
|
2051
2108
|
if(base){
|
2052
2109
|
base.set( redirectLoc );
|
2053
|
-
}
|
2054
|
-
url = fileUrl = path.
|
2110
|
+
}
|
2111
|
+
url = fileUrl = path.getFilePath( redirectLoc );
|
2055
2112
|
}
|
2056
2113
|
else {
|
2057
2114
|
if(base){
|
2058
2115
|
base.set(fileUrl);
|
2059
|
-
}
|
2116
|
+
}
|
2060
2117
|
}
|
2061
|
-
|
2118
|
+
|
2062
2119
|
var all = $("<div></div>");
|
2063
2120
|
//workaround to allow scripts to execute when included in page divs
|
2064
2121
|
all.get(0).innerHTML = html;
|
@@ -2079,14 +2136,14 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2079
2136
|
}
|
2080
2137
|
});
|
2081
2138
|
}
|
2082
|
-
|
2139
|
+
|
2083
2140
|
//append to page and enhance
|
2084
2141
|
to
|
2085
2142
|
.attr( "data-url", fileUrl )
|
2086
2143
|
.appendTo( $.mobile.pageContainer );
|
2087
2144
|
|
2088
2145
|
enhancePage();
|
2089
|
-
transitionPages();
|
2146
|
+
setTimeout(function() { transitionPages() }, 0);
|
2090
2147
|
},
|
2091
2148
|
error: function() {
|
2092
2149
|
$.mobile.pageLoading( true );
|
@@ -2142,22 +2199,37 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2142
2199
|
|
2143
2200
|
//click routing - direct to HTTP or Ajax, accordingly
|
2144
2201
|
$( "a" ).live( "click", function(event) {
|
2145
|
-
|
2202
|
+
|
2146
2203
|
var $this = $(this),
|
2147
|
-
|
2148
|
-
|
2149
|
-
|
2150
|
-
//check if it's external
|
2151
|
-
isExternal = path.isExternal( url ) || $this.is( "[rel='external']" ),
|
2204
|
+
|
2205
|
+
//get href, if defined, otherwise fall to null #
|
2206
|
+
href = $this.attr( "href" ) || "#",
|
2152
2207
|
|
2208
|
+
//get href, remove same-domain protocol and host
|
2209
|
+
url = path.clean( href ),
|
2210
|
+
|
2211
|
+
//rel set to external
|
2212
|
+
isRelExternal = $this.is( "[rel='external']" ),
|
2213
|
+
|
2214
|
+
//rel set to external
|
2215
|
+
isEmbeddedPage = path.isEmbeddedPage( url ),
|
2216
|
+
|
2217
|
+
//check for protocol or rel and its not an embedded page
|
2218
|
+
//TODO overlap in logic from isExternal, rel=external check should be
|
2219
|
+
// moved into more comprehensive isExternalLink
|
2220
|
+
isExternal = path.isExternal( url ) || isRelExternal && !isEmbeddedPage,
|
2221
|
+
|
2153
2222
|
//if target attr is specified we mimic _blank... for now
|
2154
|
-
hasTarget = $this.is( "[target]" )
|
2155
|
-
|
2223
|
+
hasTarget = $this.is( "[target]" ),
|
2224
|
+
|
2225
|
+
//if data-ajax attr is set to false, use the default behavior of a link
|
2226
|
+
hasAjaxDisabled = $this.is( "[data-ajax='false']" );
|
2227
|
+
|
2156
2228
|
//if there's a data-rel=back attr, go back in history
|
2157
2229
|
if( $this.is( "[data-rel='back']" ) ){
|
2158
2230
|
window.history.back();
|
2159
2231
|
return false;
|
2160
|
-
}
|
2232
|
+
}
|
2161
2233
|
|
2162
2234
|
if( url === "#" ){
|
2163
2235
|
//for links created purely for interaction - ignore
|
@@ -2166,7 +2238,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2166
2238
|
|
2167
2239
|
$activeClickedLink = $this.closest( ".ui-btn" ).addClass( $.mobile.activeBtnClass );
|
2168
2240
|
|
2169
|
-
if( isExternal || hasTarget || !$.mobile.ajaxEnabled ||
|
2241
|
+
if( isExternal || hasAjaxDisabled || hasTarget || !$.mobile.ajaxEnabled ||
|
2170
2242
|
// TODO: deprecated - remove at 1.0
|
2171
2243
|
!$.mobile.ajaxLinksEnabled ){
|
2172
2244
|
//remove active link class if external (then it won't be there if you come back)
|
@@ -2176,6 +2248,9 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2176
2248
|
if( hasTarget ){
|
2177
2249
|
window.open( url );
|
2178
2250
|
}
|
2251
|
+
else if( hasAjaxDisabled ){
|
2252
|
+
return;
|
2253
|
+
}
|
2179
2254
|
else{
|
2180
2255
|
location.href = url;
|
2181
2256
|
}
|
@@ -2184,11 +2259,11 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2184
2259
|
//use ajax
|
2185
2260
|
var transition = $this.data( "transition" ),
|
2186
2261
|
direction = $this.data("direction"),
|
2187
|
-
reverse = direction && direction == "reverse" ||
|
2262
|
+
reverse = direction && direction == "reverse" ||
|
2188
2263
|
// deprecated - remove by 1.0
|
2189
2264
|
$this.data( "back" );
|
2190
|
-
|
2191
|
-
//this may need to be more specific as we use data-rel more
|
2265
|
+
|
2266
|
+
//this may need to be more specific as we use data-rel more
|
2192
2267
|
nextPageRole = $this.attr( "data-rel" );
|
2193
2268
|
|
2194
2269
|
//if it's a relative href, prefix href with base url
|
@@ -2204,45 +2279,30 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2204
2279
|
});
|
2205
2280
|
|
2206
2281
|
|
2207
|
-
|
2208
2282
|
//hashchange event handler
|
2209
|
-
$window.bind( "hashchange", function(e, triggered) {
|
2210
|
-
|
2211
|
-
// TODO: deprecated - remove at 1.0
|
2212
|
-
// only links need to be checked here, as forms don't trigger a hashchange event (they just silently update the hash)
|
2213
|
-
!$.mobile.ajaxLinksEnabled ) ){
|
2214
|
-
return;
|
2215
|
-
}
|
2216
|
-
|
2283
|
+
$window.bind( "hashchange", function( e, triggered ) {
|
2284
|
+
//find first page via hash
|
2217
2285
|
var to = path.stripHash( location.hash ),
|
2218
|
-
transition
|
2219
|
-
|
2220
|
-
|
2221
|
-
if(
|
2222
|
-
|
2223
|
-
!$.mobile.activePage.is( ".ui-dialog" )
|
2286
|
+
//transition is false if it's the first page, undefined otherwise (and may be overridden by default)
|
2287
|
+
transition = $.mobile.urlHistory.stack.length === 0 ? false : undefined;
|
2288
|
+
|
2289
|
+
//if listening is disabled (either globally or temporarily), or it's a dialog hash
|
2290
|
+
if( !$.mobile.hashListeningEnabled || !urlHistory.ignoreNextHashChange ||
|
2291
|
+
urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 && !$.mobile.activePage.is( ".ui-dialog" )
|
2292
|
+
){
|
2293
|
+
if( !urlHistory.ignoreNextHashChange ){
|
2294
|
+
urlHistory.ignoreNextHashChange = true;
|
2295
|
+
}
|
2224
2296
|
return;
|
2225
|
-
}
|
2297
|
+
}
|
2226
2298
|
|
2227
|
-
//if to is defined,
|
2299
|
+
//if to is defined, load it
|
2228
2300
|
if ( to ){
|
2229
2301
|
$.mobile.changePage( to, transition, undefined, false, true );
|
2230
2302
|
}
|
2231
|
-
//there's no hash,
|
2232
|
-
|
2233
|
-
|
2234
|
-
$.mobile.changePage( $.mobile.startPage, transition, true, false, true );
|
2235
|
-
}
|
2236
|
-
//probably the first page - show it
|
2237
|
-
else{
|
2238
|
-
urlHistory.addNew( "" );
|
2239
|
-
$.mobile.startPage.trigger("pagebeforeshow", {prevPage: $('')});
|
2240
|
-
$.mobile.startPage.addClass( $.mobile.activePageClass );
|
2241
|
-
$.mobile.pageLoading( true );
|
2242
|
-
|
2243
|
-
if( $.mobile.startPage.trigger("pageshow", {prevPage: $('')}) !== false ){
|
2244
|
-
reFocus($.mobile.startPage);
|
2245
|
-
}
|
2303
|
+
//there's no hash, go to the first page in the dom
|
2304
|
+
else {
|
2305
|
+
$.mobile.changePage( $.mobile.firstPage, transition, true, false, true );
|
2246
2306
|
}
|
2247
2307
|
});
|
2248
2308
|
})( jQuery );
|
@@ -2333,11 +2393,11 @@ $.fn.buttonMarkup.defaults = {
|
|
2333
2393
|
|
2334
2394
|
var attachEvents = function() {
|
2335
2395
|
$(".ui-btn:not(.ui-disabled)").live({
|
2336
|
-
mousedown: function() {
|
2396
|
+
"touchstart mousedown": function() {
|
2337
2397
|
var theme = $(this).attr( "data-theme" );
|
2338
2398
|
$(this).removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
|
2339
2399
|
},
|
2340
|
-
mouseup: function() {
|
2400
|
+
"touchmove touchend mouseup": function() {
|
2341
2401
|
var theme = $(this).attr( "data-theme" );
|
2342
2402
|
$(this).removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
|
2343
2403
|
},
|
@@ -3108,7 +3168,7 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3108
3168
|
overlayTheme: 'a',
|
3109
3169
|
hidePlaceholderMenuItems: true,
|
3110
3170
|
closeText: 'Close',
|
3111
|
-
|
3171
|
+
nativeMenu: false
|
3112
3172
|
},
|
3113
3173
|
_create: function(){
|
3114
3174
|
|
@@ -3118,28 +3178,18 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3118
3178
|
|
3119
3179
|
select = this.element
|
3120
3180
|
.wrap( "<div class='ui-select'>" ),
|
3121
|
-
|
3122
|
-
selectID = select.attr( "id" ),
|
3123
|
-
|
3124
|
-
isMultiple = self.isMultiple = select[0].multiple,
|
3125
|
-
|
3126
|
-
options = select.find("option"),
|
3127
|
-
|
3181
|
+
|
3182
|
+
selectID = select.attr( "id" ),
|
3183
|
+
|
3128
3184
|
label = $( "label[for="+ selectID +"]" ).addClass( "ui-select" ),
|
3129
3185
|
|
3130
|
-
|
3131
|
-
|
3132
|
-
menuId = selectID + "-menu",
|
3133
|
-
|
3134
|
-
thisPage = select.closest( ".ui-page" ),
|
3135
|
-
|
3136
|
-
button = $( "<a>", {
|
3186
|
+
button = ( self.options.nativeMenu ? $( "<div/>" ) : $( "<a>", {
|
3137
3187
|
"href": "#",
|
3138
3188
|
"role": "button",
|
3139
3189
|
"id": buttonId,
|
3140
3190
|
"aria-haspopup": "true",
|
3141
3191
|
"aria-owns": menuId
|
3142
|
-
})
|
3192
|
+
}) )
|
3143
3193
|
.text( $( select[0].options.item(select[0].selectedIndex) ).text() )
|
3144
3194
|
.insertBefore( select )
|
3145
3195
|
.buttonMarkup({
|
@@ -3151,61 +3201,81 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3151
3201
|
shadow: o.shadow,
|
3152
3202
|
iconshadow: o.iconshadow
|
3153
3203
|
}),
|
3154
|
-
|
3155
|
-
|
3156
|
-
|
3157
|
-
|
3158
|
-
|
3159
|
-
|
3160
|
-
|
3161
|
-
|
3162
|
-
|
3163
|
-
|
3164
|
-
|
3165
|
-
|
3166
|
-
|
3167
|
-
|
3168
|
-
|
3169
|
-
|
3170
|
-
|
3171
|
-
|
3172
|
-
|
3173
|
-
|
3174
|
-
|
3175
|
-
|
3176
|
-
|
3177
|
-
|
3178
|
-
|
3179
|
-
|
3180
|
-
|
3181
|
-
|
3182
|
-
|
3183
|
-
|
3184
|
-
|
3185
|
-
|
3186
|
-
|
3187
|
-
|
3188
|
-
.
|
3189
|
-
|
3190
|
-
|
3191
|
-
|
3192
|
-
})
|
3193
|
-
|
3194
|
-
|
3195
|
-
|
3196
|
-
|
3197
|
-
|
3198
|
-
|
3199
|
-
|
3200
|
-
|
3201
|
-
|
3202
|
-
|
3203
|
-
|
3204
|
-
|
3205
|
-
|
3206
|
-
|
3207
|
-
|
3208
|
-
|
3204
|
+
|
3205
|
+
//multi select or not
|
3206
|
+
isMultiple = self.isMultiple = select[0].multiple;
|
3207
|
+
|
3208
|
+
//Opera does not properly support opacity on select elements
|
3209
|
+
//In Mini, it hides the element, but not its text
|
3210
|
+
//On the desktop,it seems to do the opposite
|
3211
|
+
//for these reasons, using the nativeMenu option results in a full native select in Opera
|
3212
|
+
if( o.nativeMenu && window.opera && window.opera.version ){
|
3213
|
+
select.addClass( "ui-select-nativeonly" );
|
3214
|
+
}
|
3215
|
+
|
3216
|
+
//vars for non-native menus
|
3217
|
+
if( !o.nativeMenu ){
|
3218
|
+
var options = select.find("option"),
|
3219
|
+
|
3220
|
+
buttonId = selectID + "-button",
|
3221
|
+
|
3222
|
+
menuId = selectID + "-menu",
|
3223
|
+
|
3224
|
+
thisPage = select.closest( ".ui-page" ),
|
3225
|
+
|
3226
|
+
//button theme
|
3227
|
+
theme = /ui-btn-up-([a-z])/.exec( button.attr("class") )[1],
|
3228
|
+
|
3229
|
+
menuPage = $( "<div data-role='dialog' data-theme='"+ o.menuPageTheme +"'>" +
|
3230
|
+
"<div data-role='header'>" +
|
3231
|
+
"<div class='ui-title'>" + label.text() + "</div>"+
|
3232
|
+
"</div>"+
|
3233
|
+
"<div data-role='content'></div>"+
|
3234
|
+
"</div>" )
|
3235
|
+
.appendTo( $.mobile.pageContainer )
|
3236
|
+
.page(),
|
3237
|
+
|
3238
|
+
menuPageContent = menuPage.find( ".ui-content" ),
|
3239
|
+
|
3240
|
+
menuPageClose = menuPage.find( ".ui-header a" ),
|
3241
|
+
|
3242
|
+
screen = $( "<div>", {"class": "ui-selectmenu-screen ui-screen-hidden"})
|
3243
|
+
.appendTo( thisPage ),
|
3244
|
+
|
3245
|
+
listbox = $( "<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all pop ui-body-" + o.overlayTheme } )
|
3246
|
+
.insertAfter(screen),
|
3247
|
+
|
3248
|
+
list = $( "<ul>", {
|
3249
|
+
"class": "ui-selectmenu-list",
|
3250
|
+
"id": menuId,
|
3251
|
+
"role": "listbox",
|
3252
|
+
"aria-labelledby": buttonId,
|
3253
|
+
"data-theme": theme
|
3254
|
+
})
|
3255
|
+
.appendTo( listbox ),
|
3256
|
+
|
3257
|
+
header = $( "<div>", {
|
3258
|
+
"class": "ui-header ui-bar-" + theme
|
3259
|
+
})
|
3260
|
+
.prependTo( listbox ),
|
3261
|
+
|
3262
|
+
headerTitle = $( "<h1>", {
|
3263
|
+
"class": "ui-title"
|
3264
|
+
})
|
3265
|
+
.appendTo( header ),
|
3266
|
+
|
3267
|
+
headerClose = $( "<a>", {
|
3268
|
+
"data-iconpos": "notext",
|
3269
|
+
"data-icon": "delete",
|
3270
|
+
"text": o.closeText,
|
3271
|
+
"href": "#",
|
3272
|
+
"class": "ui-btn-left"
|
3273
|
+
})
|
3274
|
+
.appendTo( header )
|
3275
|
+
.buttonMarkup(),
|
3276
|
+
|
3277
|
+
menuType;
|
3278
|
+
} //end non native vars
|
3209
3279
|
|
3210
3280
|
// add counter for multi selects
|
3211
3281
|
if( isMultiple ){
|
@@ -3215,6 +3285,15 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3215
3285
|
.appendTo( button );
|
3216
3286
|
}
|
3217
3287
|
|
3288
|
+
//disable if specified
|
3289
|
+
if( o.disabled ){ this.disable(); }
|
3290
|
+
|
3291
|
+
//events on native select
|
3292
|
+
select
|
3293
|
+
.change(function(){
|
3294
|
+
self.refresh();
|
3295
|
+
});
|
3296
|
+
|
3218
3297
|
//expose to other methods
|
3219
3298
|
$.extend(self, {
|
3220
3299
|
select: select,
|
@@ -3235,36 +3314,25 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3235
3314
|
headerClose:headerClose,
|
3236
3315
|
headerTitle:headerTitle,
|
3237
3316
|
placeholder: ''
|
3238
|
-
});
|
3239
|
-
|
3240
|
-
//create list from select, update state
|
3241
|
-
self.refresh();
|
3242
|
-
|
3243
|
-
//disable if specified
|
3244
|
-
if( o.disabled ){ this.disable(); }
|
3245
|
-
|
3246
|
-
//events on native select
|
3247
|
-
select
|
3248
|
-
.change(function(){
|
3249
|
-
self.refresh();
|
3250
|
-
});
|
3317
|
+
});
|
3251
3318
|
|
3252
3319
|
//support for using the native select menu with a custom button
|
3253
|
-
if( o.
|
3320
|
+
if( o.nativeMenu ){
|
3254
3321
|
|
3255
3322
|
select
|
3256
3323
|
.appendTo(button)
|
3257
3324
|
.bind( "touchstart mousedown", function( e ){
|
3258
3325
|
//add active class to button
|
3259
3326
|
button.addClass( $.mobile.activeBtnClass );
|
3260
|
-
|
3261
|
-
//ensure button isn't clicked
|
3262
|
-
e.stopPropagation();
|
3263
3327
|
})
|
3264
3328
|
.bind( "focus mouseover", function(){
|
3265
3329
|
button.trigger( "mouseover" );
|
3266
3330
|
})
|
3267
|
-
.bind( "
|
3331
|
+
.bind( "touchmove", function(){
|
3332
|
+
//remove active class on scroll/touchmove
|
3333
|
+
button.removeClass( $.mobile.activeBtnClass );
|
3334
|
+
})
|
3335
|
+
.bind( "change blur mouseout", function(){
|
3268
3336
|
button
|
3269
3337
|
.trigger( "mouseout" )
|
3270
3338
|
.removeClass( $.mobile.activeBtnClass );
|
@@ -3272,6 +3340,9 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3272
3340
|
|
3273
3341
|
button.attr( "tabindex", "-1" );
|
3274
3342
|
} else {
|
3343
|
+
|
3344
|
+
//create list from select, update state
|
3345
|
+
self.refresh();
|
3275
3346
|
|
3276
3347
|
select
|
3277
3348
|
.attr( "tabindex", "-1" )
|
@@ -3306,62 +3377,67 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3306
3377
|
$( this ).data( "moved", true );
|
3307
3378
|
}
|
3308
3379
|
});
|
3309
|
-
|
3310
|
-
|
3311
|
-
|
3312
|
-
|
3313
|
-
|
3314
|
-
|
3315
|
-
|
3316
|
-
|
3317
|
-
|
3318
|
-
|
3319
|
-
|
3320
|
-
|
3321
|
-
|
3322
|
-
|
3323
|
-
|
3324
|
-
|
3325
|
-
|
3326
|
-
|
3327
|
-
|
3328
|
-
|
3329
|
-
|
3330
|
-
|
3331
|
-
|
3332
|
-
|
3333
|
-
|
3334
|
-
|
3335
|
-
|
3336
|
-
|
3337
|
-
|
3338
|
-
|
3339
|
-
}
|
3340
|
-
|
3341
|
-
event.preventDefault();
|
3342
|
-
});
|
3343
|
-
|
3344
|
-
//events on "screen" overlay + close button
|
3345
|
-
screen
|
3346
|
-
.add( headerClose )
|
3347
|
-
.add( menuPageClose )
|
3348
|
-
.bind("click", function(event){
|
3349
|
-
self.close();
|
3350
|
-
event.preventDefault();
|
3351
|
-
|
3352
|
-
// if the dialog's close icon was clicked, prevent the dialog's close
|
3353
|
-
// handler from firing. selectmenu's should take precedence
|
3354
|
-
if( $.contains(menuPageClose[0], event.target) ){
|
3355
|
-
event.stopImmediatePropagation();
|
3380
|
+
|
3381
|
+
|
3382
|
+
//events for list items
|
3383
|
+
list.delegate("li:not(.ui-disabled, .ui-li-divider)", "click", function(event){
|
3384
|
+
// clicking on the list item fires click on the link in listview.js.
|
3385
|
+
// to prevent this handler from firing twice if the link isn't clicked on,
|
3386
|
+
// short circuit unless the target is the link
|
3387
|
+
if( !$(event.target).is("a") ){ return; }
|
3388
|
+
|
3389
|
+
// index of option tag to be selected
|
3390
|
+
var newIndex = list.find( "li:not(.ui-li-divider)" ).index( this ),
|
3391
|
+
option = self.optionElems.eq( newIndex )[0];
|
3392
|
+
|
3393
|
+
// toggle selected status on the tag for multi selects
|
3394
|
+
option.selected = isMultiple ? !option.selected : true;
|
3395
|
+
|
3396
|
+
// toggle checkbox class for multiple selects
|
3397
|
+
if( isMultiple ){
|
3398
|
+
$(this)
|
3399
|
+
.find('.ui-icon')
|
3400
|
+
.toggleClass('ui-icon-checkbox-on', option.selected)
|
3401
|
+
.toggleClass('ui-icon-checkbox-off', !option.selected);
|
3402
|
+
}
|
3403
|
+
|
3404
|
+
// trigger change
|
3405
|
+
select.trigger( "change" );
|
3406
|
+
|
3407
|
+
//hide custom select for single selects only
|
3408
|
+
if( !isMultiple ){
|
3409
|
+
self.close();
|
3356
3410
|
}
|
3411
|
+
|
3412
|
+
event.preventDefault();
|
3357
3413
|
});
|
3414
|
+
|
3415
|
+
//events on "screen" overlay + close button
|
3416
|
+
screen
|
3417
|
+
.add( headerClose )
|
3418
|
+
.add( menuPageClose )
|
3419
|
+
.bind("click", function(event){
|
3420
|
+
self.close();
|
3421
|
+
event.preventDefault();
|
3422
|
+
|
3423
|
+
// if the dialog's close icon was clicked, prevent the dialog's close
|
3424
|
+
// handler from firing. selectmenu's should take precedence
|
3425
|
+
if( $.contains(menuPageClose[0], event.target) ){
|
3426
|
+
event.stopImmediatePropagation();
|
3427
|
+
}
|
3428
|
+
});
|
3429
|
+
}
|
3430
|
+
|
3431
|
+
|
3358
3432
|
},
|
3359
3433
|
|
3360
3434
|
_buildList: function(){
|
3361
3435
|
var self = this,
|
3362
|
-
optgroups = [],
|
3363
3436
|
o = this.options,
|
3364
|
-
placeholder = this.placeholder
|
3437
|
+
placeholder = this.placeholder,
|
3438
|
+
optgroups = [],
|
3439
|
+
lis = [],
|
3440
|
+
dataIcon = self.isMultiple ? "checkbox-off" : "false";
|
3365
3441
|
|
3366
3442
|
self.list.empty().filter('.ui-listview').listview('destroy');
|
3367
3443
|
|
@@ -3369,7 +3445,10 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3369
3445
|
self.select.find( "option" ).each(function( i ){
|
3370
3446
|
var $this = $(this),
|
3371
3447
|
$parent = $this.parent(),
|
3372
|
-
text = $this.text()
|
3448
|
+
text = $this.text(),
|
3449
|
+
anchor = "<a href='#'>"+ text +"</a>",
|
3450
|
+
classes = [],
|
3451
|
+
extraAttrs = [];
|
3373
3452
|
|
3374
3453
|
// are we inside an optgroup?
|
3375
3454
|
if( $parent.is("optgroup") ){
|
@@ -3377,46 +3456,29 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3377
3456
|
|
3378
3457
|
// has this optgroup already been built yet?
|
3379
3458
|
if( $.inArray(optLabel, optgroups) === -1 ){
|
3380
|
-
|
3381
|
-
"data-role":"list-divider",
|
3382
|
-
"text": optLabel
|
3383
|
-
}).appendTo( self.list );
|
3384
|
-
|
3459
|
+
lis.push( "<li data-role='list-divider'>"+ optLabel +"</li>" );
|
3385
3460
|
optgroups.push( optLabel );
|
3386
3461
|
}
|
3387
3462
|
}
|
3388
|
-
|
3389
|
-
|
3390
|
-
"role": "",
|
3391
|
-
"href": "#",
|
3392
|
-
"text": text
|
3393
|
-
}),
|
3394
|
-
|
3395
|
-
item = $( "<li>", { "data-icon": false });
|
3396
|
-
|
3463
|
+
|
3464
|
+
//find placeholder text
|
3397
3465
|
if( !this.getAttribute('value') || text.length == 0 || $this.data('placeholder') ){
|
3398
3466
|
if( o.hidePlaceholderMenuItems ){
|
3399
|
-
|
3467
|
+
classes.push( "ui-selectmenu-placeholder" );
|
3400
3468
|
}
|
3401
|
-
|
3402
3469
|
placeholder = self.placeholder = text;
|
3403
3470
|
}
|
3404
3471
|
|
3405
|
-
// multiple select defaults
|
3406
|
-
if( self.isMultiple ){
|
3407
|
-
item.data('icon', 'checkbox-off');
|
3408
|
-
}
|
3409
|
-
|
3410
3472
|
// support disabled option tags
|
3411
3473
|
if( this.disabled ){
|
3412
|
-
|
3413
|
-
|
3474
|
+
classes.push( "ui-disabled" );
|
3475
|
+
extraAttrs.push( "aria-disabled='true'" );
|
3414
3476
|
}
|
3415
3477
|
|
3416
|
-
|
3417
|
-
.append( anchor )
|
3418
|
-
.appendTo( self.list );
|
3478
|
+
lis.push( "<li data-icon='"+ dataIcon +"' class='"+ classes.join(" ") + "' " + extraAttrs.join(" ") +">"+ anchor +"</li>" )
|
3419
3479
|
});
|
3480
|
+
|
3481
|
+
self.list.html( lis.join(" ") );
|
3420
3482
|
|
3421
3483
|
// hide header close link for single selects
|
3422
3484
|
if( !this.isMultiple ){
|
@@ -3446,7 +3508,7 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3446
3508
|
return options.index( this );
|
3447
3509
|
}).get();
|
3448
3510
|
|
3449
|
-
if( forceRebuild || select[0].options.length > self.list.find('li').length ){
|
3511
|
+
if( !self.options.nativeMenu && ( forceRebuild || select[0].options.length > self.list.find('li').length )){
|
3450
3512
|
self._buildList();
|
3451
3513
|
}
|
3452
3514
|
|
@@ -3466,28 +3528,30 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3466
3528
|
if( isMultiple ){
|
3467
3529
|
self.buttonCount[ selected.length > 1 ? 'show' : 'hide' ]().text( selected.length );
|
3468
3530
|
}
|
3469
|
-
|
3470
|
-
self.
|
3471
|
-
.
|
3472
|
-
|
3473
|
-
|
3474
|
-
|
3475
|
-
|
3476
|
-
|
3477
|
-
|
3478
|
-
|
3479
|
-
|
3480
|
-
|
3481
|
-
|
3482
|
-
|
3483
|
-
|
3531
|
+
|
3532
|
+
if( !self.options.nativeMenu ){
|
3533
|
+
self.list
|
3534
|
+
.find( 'li:not(.ui-li-divider)' )
|
3535
|
+
.removeClass( $.mobile.activeBtnClass )
|
3536
|
+
.attr( 'aria-selected', false )
|
3537
|
+
.each(function( i ){
|
3538
|
+
if( $.inArray(i, indicies) > -1 ){
|
3539
|
+
var item = $(this).addClass( $.mobile.activeBtnClass );
|
3540
|
+
|
3541
|
+
// aria selected attr
|
3542
|
+
item.find( 'a' ).attr( 'aria-selected', true );
|
3543
|
+
|
3544
|
+
// multiple selects: add the "on" checkbox state to the icon
|
3545
|
+
if( isMultiple ){
|
3546
|
+
item.find('.ui-icon').removeClass('ui-icon-checkbox-off').addClass('ui-icon-checkbox-on');
|
3547
|
+
}
|
3484
3548
|
}
|
3485
|
-
}
|
3486
|
-
|
3549
|
+
});
|
3550
|
+
}
|
3487
3551
|
},
|
3488
3552
|
|
3489
3553
|
open: function(){
|
3490
|
-
if( this.options.disabled ){ return; }
|
3554
|
+
if( this.options.disabled || this.options.nativeMenu ){ return; }
|
3491
3555
|
|
3492
3556
|
var self = this,
|
3493
3557
|
menuHeight = self.list.outerHeight(),
|
@@ -3516,11 +3580,18 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3516
3580
|
});
|
3517
3581
|
}
|
3518
3582
|
|
3519
|
-
self.menuPage.one('pageshow',
|
3583
|
+
self.menuPage.one('pageshow', function() {
|
3584
|
+
// silentScroll() is called whenever a page is shown to restore
|
3585
|
+
// any previous scroll position the page may have had. We need to
|
3586
|
+
// wait for the "silentscroll" event before setting focus to avoid
|
3587
|
+
// the browser's "feature" which offsets rendering to make sure
|
3588
|
+
// whatever has focus is in view.
|
3589
|
+
$(window).one("silentscroll", function(){ focusMenuItem(); });
|
3590
|
+
});
|
3520
3591
|
|
3521
3592
|
self.menuType = "page";
|
3522
3593
|
self.menuPageContent.append( self.list );
|
3523
|
-
$.mobile.changePage(self.menuPage, 'pop', false,
|
3594
|
+
$.mobile.changePage(self.menuPage, 'pop', false, true);
|
3524
3595
|
}
|
3525
3596
|
else {
|
3526
3597
|
self.menuType = "overlay";
|
@@ -3565,7 +3636,7 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
|
|
3565
3636
|
},
|
3566
3637
|
|
3567
3638
|
close: function(){
|
3568
|
-
if( this.options.disabled || !this.isOpen ){ return; }
|
3639
|
+
if( this.options.disabled || !this.isOpen || this.options.nativeMenu ){ return; }
|
3569
3640
|
var self = this;
|
3570
3641
|
|
3571
3642
|
function focusButton(){
|
@@ -4215,6 +4286,8 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
4215
4286
|
return;
|
4216
4287
|
}
|
4217
4288
|
|
4289
|
+
var itemTheme = item.data("theme") || o.theme;
|
4290
|
+
|
4218
4291
|
var a = item.find( "a" );
|
4219
4292
|
|
4220
4293
|
if ( a.length ) {
|
@@ -4227,7 +4300,7 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
4227
4300
|
corners: false,
|
4228
4301
|
iconpos: "right",
|
4229
4302
|
icon: a.length > 1 || icon === false ? false : icon || "arrow-r",
|
4230
|
-
theme:
|
4303
|
+
theme: itemTheme
|
4231
4304
|
});
|
4232
4305
|
|
4233
4306
|
a.first().addClass( "ui-link-inherit" );
|
@@ -4245,7 +4318,7 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
4245
4318
|
.buttonMarkup({
|
4246
4319
|
shadow: false,
|
4247
4320
|
corners: false,
|
4248
|
-
theme:
|
4321
|
+
theme: itemTheme,
|
4249
4322
|
icon: false,
|
4250
4323
|
iconpos: false
|
4251
4324
|
})
|
@@ -4269,7 +4342,7 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
4269
4342
|
}
|
4270
4343
|
|
4271
4344
|
} else {
|
4272
|
-
itemClass += " ui-li-static ui-btn-up-" +
|
4345
|
+
itemClass += " ui-li-static ui-btn-up-" + itemTheme;
|
4273
4346
|
}
|
4274
4347
|
|
4275
4348
|
|
@@ -4288,7 +4361,8 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
4288
4361
|
self._removeCorners( item.next() );
|
4289
4362
|
}
|
4290
4363
|
|
4291
|
-
}
|
4364
|
+
}
|
4365
|
+
if ( pos === li.length - 1 ) {
|
4292
4366
|
itemClass += " ui-corner-bottom";
|
4293
4367
|
|
4294
4368
|
item
|