pjax_rails 0.1.8 → 0.1.9
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/CHANGELOG +4 -0
- data/lib/assets/javascripts/pjax/jquery_pjax.js +130 -83
- data/pjax_rails-0.1.8.gem +0 -0
- data/pjax_rails.gemspec +1 -1
- metadata +4 -3
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
*0.1.9*
|
2
|
+
|
3
|
+
* Use latest jquery-pjax JavaScript code [2011-08-29 version, see https://github.com/defunkt/jquery-pjax/commits/master]
|
4
|
+
|
1
5
|
*0.1.8*
|
2
6
|
|
3
7
|
* Expand the selector to allow data-skip-pjax to be applied to a container and have that affect all its children [Sam Stephenson]
|
@@ -1,6 +1,8 @@
|
|
1
|
-
//
|
1
|
+
// jquery.pjax.js
|
2
2
|
// copyright chris wanstrath
|
3
|
-
// https://github.com/defunkt/pjax
|
3
|
+
// https://github.com/defunkt/jquery-pjax
|
4
|
+
|
5
|
+
(function($){
|
4
6
|
|
5
7
|
// When called on a link, fetches the href with ajax into the
|
6
8
|
// container specified as the first parameter or with the data-pjax
|
@@ -27,6 +29,13 @@ $.fn.pjax = function( container, options ) {
|
|
27
29
|
else
|
28
30
|
options = $.isPlainObject(container) ? container : {container:container}
|
29
31
|
|
32
|
+
// We can't persist $objects using the history API so we must use
|
33
|
+
// a String selector. Bail if we got anything else.
|
34
|
+
if ( options.container && typeof options.container !== 'string' ) {
|
35
|
+
throw "pjax container must be a string selector!"
|
36
|
+
return false
|
37
|
+
}
|
38
|
+
|
30
39
|
return this.live('click', function(event){
|
31
40
|
// Middle click, cmd click, and ctrl click should open
|
32
41
|
// links in a new tab as normal.
|
@@ -35,7 +44,9 @@ $.fn.pjax = function( container, options ) {
|
|
35
44
|
|
36
45
|
var defaults = {
|
37
46
|
url: this.href,
|
38
|
-
container: $(this).attr('data-pjax')
|
47
|
+
container: $(this).attr('data-pjax'),
|
48
|
+
clickedElement: $(this),
|
49
|
+
fragment: null
|
39
50
|
}
|
40
51
|
|
41
52
|
$.pjax($.extend({}, defaults, options))
|
@@ -53,7 +64,7 @@ $.fn.pjax = function( container, options ) {
|
|
53
64
|
//
|
54
65
|
// Accepts these extra keys:
|
55
66
|
//
|
56
|
-
// container - Where to stick the response body.
|
67
|
+
// container - Where to stick the response body. Must be a String.
|
57
68
|
// $(container).html(xhr.responseBody)
|
58
69
|
// push - Whether to pushState the URL. Defaults to true (of course).
|
59
70
|
// replace - Want to use replaceState instead? That's cool.
|
@@ -64,102 +75,126 @@ $.fn.pjax = function( container, options ) {
|
|
64
75
|
// console.log( xhr.readyState )
|
65
76
|
//
|
66
77
|
// Returns whatever $.ajax returns.
|
67
|
-
$.pjax = function( options ) {
|
78
|
+
var pjax = $.pjax = function( options ) {
|
68
79
|
var $container = $(options.container),
|
69
80
|
success = options.success || $.noop
|
70
81
|
|
71
82
|
// We don't want to let anyone override our success handler.
|
72
83
|
delete options.success
|
73
84
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
$
|
93
|
-
|
94
|
-
|
95
|
-
// If we got no data or an entire web page, go directly
|
96
|
-
// to the page and let normal error handling happen.
|
97
|
-
if ( !$.trim(data) || /<html/i.test(data) )
|
85
|
+
// We can't persist $objects using the history API so we must use
|
86
|
+
// a String selector. Bail if we got anything else.
|
87
|
+
if ( typeof options.container !== 'string' )
|
88
|
+
throw "pjax container must be a string selector!"
|
89
|
+
|
90
|
+
options = $.extend(true, {}, pjax.defaults, options)
|
91
|
+
|
92
|
+
if ( $.isFunction(options.url) ) {
|
93
|
+
options.url = options.url()
|
94
|
+
}
|
95
|
+
|
96
|
+
options.context = $container
|
97
|
+
|
98
|
+
options.success = function(data){
|
99
|
+
if ( options.fragment ) {
|
100
|
+
// If they specified a fragment, look for it in the response
|
101
|
+
// and pull it out.
|
102
|
+
var $fragment = $(data).find(options.fragment)
|
103
|
+
if ( $fragment.length )
|
104
|
+
data = $fragment.children()
|
105
|
+
else
|
98
106
|
return window.location = options.url
|
107
|
+
} else {
|
108
|
+
// If we got no data or an entire web page, go directly
|
109
|
+
// to the page and let normal error handling happen.
|
110
|
+
if ( !$.trim(data) || /<html/i.test(data) )
|
111
|
+
return window.location = options.url
|
112
|
+
}
|
99
113
|
|
100
|
-
|
101
|
-
|
114
|
+
// Make it happen.
|
115
|
+
this.html(data)
|
102
116
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
117
|
+
// If there's a <title> tag in the response, use it as
|
118
|
+
// the page's title.
|
119
|
+
var oldTitle = document.title,
|
120
|
+
title = $.trim( this.find('title').remove().text() )
|
121
|
+
if ( title ) document.title = title
|
108
122
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
123
|
+
var state = {
|
124
|
+
pjax: options.container,
|
125
|
+
fragment: options.fragment,
|
126
|
+
timeout: options.timeout
|
127
|
+
}
|
113
128
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
if (
|
125
|
-
window.history.replaceState(
|
126
|
-
|
127
|
-
// this extra replaceState before first push ensures good back
|
128
|
-
// button behavior
|
129
|
-
if ( !$.pjax.active ) {
|
130
|
-
window.history.replaceState($.extend({}, state, {url:null}), oldTitle)
|
131
|
-
$.pjax.active = true
|
132
|
-
}
|
133
|
-
|
134
|
-
window.history.pushState(state, document.title, options.url)
|
129
|
+
// If there are extra params, save the complete URL in the state object
|
130
|
+
var query = $.param(options.data)
|
131
|
+
if ( query != "_pjax=true" )
|
132
|
+
state.url = options.url + (/\?/.test(options.url) ? "&" : "?") + query
|
133
|
+
|
134
|
+
if ( options.replace ) {
|
135
|
+
window.history.replaceState(state, document.title, options.url)
|
136
|
+
} else if ( options.push ) {
|
137
|
+
// this extra replaceState before first push ensures good back
|
138
|
+
// button behavior
|
139
|
+
if ( !pjax.active ) {
|
140
|
+
window.history.replaceState($.extend({}, state, {url:null}), oldTitle)
|
141
|
+
pjax.active = true
|
135
142
|
}
|
136
143
|
|
137
|
-
|
138
|
-
if ( (options.replace || options.push) && window._gaq )
|
139
|
-
_gaq.push(['_trackPageview'])
|
140
|
-
|
141
|
-
// Invoke their success handler if they gave us one.
|
142
|
-
success.apply(this, arguments)
|
144
|
+
window.history.pushState(state, document.title, options.url)
|
143
145
|
}
|
144
|
-
}
|
145
146
|
|
146
|
-
|
147
|
+
// Google Analytics support
|
148
|
+
if ( (options.replace || options.push) && window._gaq )
|
149
|
+
_gaq.push(['_trackPageview'])
|
147
150
|
|
148
|
-
|
149
|
-
|
151
|
+
// If the URL has a hash in it, make sure the browser
|
152
|
+
// knows to navigate to the hash.
|
153
|
+
var hash = window.location.hash.toString()
|
154
|
+
if ( hash !== '' ) {
|
155
|
+
window.location.href = hash
|
156
|
+
}
|
157
|
+
|
158
|
+
// Invoke their success handler if they gave us one.
|
159
|
+
success.apply(this, arguments)
|
150
160
|
}
|
151
161
|
|
152
162
|
// Cancel the current request if we're already pjaxing
|
153
|
-
var xhr =
|
163
|
+
var xhr = pjax.xhr
|
154
164
|
if ( xhr && xhr.readyState < 4) {
|
155
165
|
xhr.onreadystatechange = $.noop
|
156
166
|
xhr.abort()
|
157
167
|
}
|
158
168
|
|
159
|
-
|
160
|
-
|
169
|
+
pjax.options = options
|
170
|
+
pjax.xhr = $.ajax(options)
|
171
|
+
$(document).trigger('pjax', [pjax.xhr, options])
|
172
|
+
|
173
|
+
return pjax.xhr
|
174
|
+
}
|
175
|
+
|
161
176
|
|
162
|
-
|
177
|
+
pjax.defaults = {
|
178
|
+
timeout: 650,
|
179
|
+
push: true,
|
180
|
+
replace: false,
|
181
|
+
// We want the browser to maintain two separate internal caches: one for
|
182
|
+
// pjax'd partial page loads and one for normal page loads. Without
|
183
|
+
// adding this secret parameter, some browsers will often confuse the two.
|
184
|
+
data: { _pjax: true },
|
185
|
+
type: 'GET',
|
186
|
+
dataType: 'html',
|
187
|
+
beforeSend: function(xhr){
|
188
|
+
this.trigger('start.pjax', [xhr, pjax.options])
|
189
|
+
xhr.setRequestHeader('X-PJAX', 'true')
|
190
|
+
},
|
191
|
+
error: function(xhr, textStatus, errorThrown){
|
192
|
+
if ( textStatus !== 'abort' )
|
193
|
+
window.location = pjax.options.url
|
194
|
+
},
|
195
|
+
complete: function(xhr){
|
196
|
+
this.trigger('end.pjax', [xhr, pjax.options])
|
197
|
+
}
|
163
198
|
}
|
164
199
|
|
165
200
|
|
@@ -172,7 +207,7 @@ var popped = ('state' in window.history), initialURL = location.href
|
|
172
207
|
//
|
173
208
|
// You probably shouldn't use pjax on pages with other pushState
|
174
209
|
// stuff yet.
|
175
|
-
$(window).bind('popstate', function(event)
|
210
|
+
$(window).bind('popstate', function(event){
|
176
211
|
// Ignore inital popstate that some browsers fire on page load
|
177
212
|
var initialPop = !popped && location.href == initialURL
|
178
213
|
popped = true
|
@@ -181,11 +216,12 @@ $(window).bind('popstate', function(event) {
|
|
181
216
|
var state = event.state
|
182
217
|
|
183
218
|
if ( state && state.pjax ) {
|
184
|
-
var
|
185
|
-
if ( $container.length )
|
219
|
+
var container = state.pjax
|
220
|
+
if ( $(container+'').length )
|
186
221
|
$.pjax({
|
187
222
|
url: state.url || location.href,
|
188
|
-
|
223
|
+
fragment: state.fragment,
|
224
|
+
container: container,
|
189
225
|
push: false,
|
190
226
|
timeout: state.timeout
|
191
227
|
})
|
@@ -197,12 +233,23 @@ $(window).bind('popstate', function(event) {
|
|
197
233
|
|
198
234
|
// Add the state property to jQuery's event object so we can use it in
|
199
235
|
// $(window).bind('popstate')
|
200
|
-
if ( $.
|
236
|
+
if ( $.inArray('state', $.event.props) < 0 )
|
201
237
|
$.event.props.push('state')
|
202
238
|
|
203
239
|
|
240
|
+
// Is pjax supported by this browser?
|
241
|
+
$.support.pjax =
|
242
|
+
window.history && window.history.pushState && window.history.replaceState
|
243
|
+
// pushState isn't reliable on iOS yet.
|
244
|
+
&& !navigator.userAgent.match(/(iPod|iPhone|iPad|WebApps\/.+CFNetwork)/)
|
245
|
+
|
246
|
+
|
204
247
|
// Fall back to normalcy for older browsers.
|
205
|
-
if (
|
206
|
-
$.pjax =
|
248
|
+
if ( !$.support.pjax ) {
|
249
|
+
$.pjax = function( options ) {
|
250
|
+
window.location = $.isFunction(options.url) ? options.url() : options.url
|
251
|
+
}
|
207
252
|
$.fn.pjax = function() { return this }
|
208
|
-
}
|
253
|
+
}
|
254
|
+
|
255
|
+
})(jQuery);
|
Binary file
|
data/pjax_rails.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pjax_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-08-29 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jquery-rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &2152605760 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2152605760
|
25
25
|
description:
|
26
26
|
email: david@loudthinking.com
|
27
27
|
executables: []
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- ./lib/pjax.rb
|
37
37
|
- ./lib/pjax_rails.rb
|
38
38
|
- ./pjax_rails-0.1.7.gem
|
39
|
+
- ./pjax_rails-0.1.8.gem
|
39
40
|
- ./pjax_rails.gemspec
|
40
41
|
- ./README.md
|
41
42
|
homepage:
|