forked from ToddThomson/jQuery-Mobile-Subpage-Widget
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.mobile.subpage.js
113 lines (92 loc) · 3.7 KB
/
jquery.mobile.subpage.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* jQuery Mobile Framework : "subpage" plugin
* Copyright(c) Achilles Software.
* Authored by Todd J. Thomson, [email protected]
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Based on the jQuery Mobile "listview" plugin.
* Copyright (c) jQuery Project
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/
/*
* Description
*
* A jQuery Mobile widget that allows subpages to be added to pages.
*
* Usage
*
* Add child divs with data-role="subpage" to a parent div with data-role="page".
*
* Notes
*
* Subpages are detached from parent page and added/removed to/from the DOM.
* The functionality provided by this widget is a workaround for the jQuery Mobile
* loadPage() function which only loads the first page in an AJAX response.
*/
(function ($, undefined) {
// Keeps track of the number of subpages per parent page UID
var subpageCountPerPage = {};
$.widget("mobile.subpage", $.mobile.widget, {
options: {
initSelector: ":jqmData(role='subpage')"
},
_create: function () {
var t = this;
this.parentPage = this.element.closest(".ui-page");
// create subpage markup
t.element.addClass(function (i, orig) {
return orig + " ui-subpage ";
});
t._createSubPage();
},
_createSubPage: function () {
var self = this;
var subpage = this.element;
var subpageId = subpage.attr("id");
var parentPage = subpage.closest(".ui-page");
var parentUrl = parentPage.jqmData("url");
var parentId = parentUrl || parentPage[0][$.expando];
if (typeof subpageCountPerPage[parentId] === "undefined") {
subpageCountPerPage[parentId] = -1;
}
var subpageUId = subpageId || ++subpageCountPerPage[parentId];
var subpageId = subpage.attr("id") || subpageUId;
var subpageUrl = (parentUrl || "") + "&" + $.mobile.subPageUrlKey + "=" + subpageUId;
var newPage = subpage.detach();
newPage
.attr("data-" + $.mobile.ns + "url", subpageUrl)
.attr("data-" + $.mobile.ns + "role", 'page')
.appendTo($.mobile.pageContainer);
newPage.page();
// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
// and aren't embedded
if (parentPage.is(":jqmData(external-page='true')") &&
parentPage.data("page").options.domCache === false) {
var newRemove = function (e, ui) {
var nextPage = ui.nextPage, npURL;
if (ui.nextPage) {
npURL = nextPage.jqmData("url");
if (npURL.indexOf(parentUrl + "&" + $.mobile.subPageUrlKey) !== 0) {
self.childPages().remove();
parentPage.remove();
}
}
};
// unbind the original page remove and replace with our specialized version
parentPage
.unbind("pagehide.remove")
.bind("pagehide.remove", newRemove);
}
},
// TODO sort out a better way to track sub pages of the parent page
childPages: function () {
var parentUrl = this.parentPage.jqmData("url");
return $(":jqmData(url^='" + parentUrl + "&" + $.mobile.subPageUrlKey + "')");
}
});
// Auto self-init widgets
$(document).bind("pagecreate create", function (e) {
$($.mobile.subpage.prototype.options.initSelector, e.target).subpage();
});
})(jQuery);