rails-ajax 0.2.0.20130731 → 0.3.0.20130913

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/AUTHORS.rdoc CHANGED
@@ -4,7 +4,9 @@
4
4
  * 0.1.1.20120710
5
5
  * 0.1.2.20130211
6
6
  * 0.2.0.20130731
7
+ * 0.3.0.20130913
7
8
 
8
9
  = LoveIsGrief (https://github.com/LoveIsGrief)
9
10
 
10
11
  * 0.2.0.20130731
12
+ * 0.3.0.20130913
data/ChangeLog CHANGED
@@ -1,5 +1,10 @@
1
1
  = Rails-Ajax Release History
2
2
 
3
+ == 0.3.0.20130913 (Beta)
4
+
5
+ * Implemented use_rails_ajax switch.
6
+ * Do not mess with user Ajax anymore
7
+
3
8
  == 0.2.0.20130731 (Beta)
4
9
 
5
10
  * Added support for Rails 4
data/ReleaseInfo CHANGED
@@ -2,7 +2,7 @@
2
2
  # This file has been generated by RubyPackager during a delivery.
3
3
  # More info about RubyPackager: http://rubypackager.sourceforge.net
4
4
  {
5
- :version => '0.2.0.20130731',
5
+ :version => '0.3.0.20130913',
6
6
  :tags => [ 'Beta' ],
7
7
  :dev_status => 'Beta'
8
8
  }
@@ -1,300 +1,300 @@
1
- //--
2
- // Copyright (c) 2012 Muriel Salvan (muriel@x-aeon.com)
3
- // Licensed under the terms specified in LICENSE file. No warranty is provided.
4
- //++
5
-
6
- <% if (RailsAjax.config.Enabled) %>
7
-
8
- //=========================================
9
- // Browser detection code (removed from jQuery >=1.9):
10
- // Can be removed along with setFavicon as soon as Firefox corrects bug: https://bugzilla.mozilla.org/show_bug.cgi?id=519028
11
- var matched, browser;
12
-
13
- // Use of jQuery.browser is frowned upon.
14
- // More details: http://api.jquery.com/jQuery.browser
15
- // jQuery.uaMatch maintained for back-compat
16
- jQuery.uaMatch = function( ua ) {
17
- ua = ua.toLowerCase();
18
-
19
- var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
20
- /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
21
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
22
- /(msie) ([\w.]+)/.exec( ua ) ||
23
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
24
- [];
25
-
26
- return {
27
- browser: match[ 1 ] || "",
28
- version: match[ 2 ] || "0"
29
- };
30
- };
31
-
32
- matched = jQuery.uaMatch( navigator.userAgent );
33
- browser = {};
34
-
35
- if ( matched.browser ) {
36
- browser[ matched.browser ] = true;
37
- browser.version = matched.version;
38
- }
39
-
40
- // Chrome is Webkit, but Webkit is also Safari.
41
- if ( browser.chrome ) {
42
- browser.webkit = true;
43
- } else if ( browser.webkit ) {
44
- browser.safari = true;
45
- }
46
-
47
- jQuery.browser = browser;
48
- //===========================================
49
-
50
-
51
-
52
- // Encapsulate everything in a nice namespace
53
- var railsAjax = {
54
-
55
- // Initialization, to be called just once when the DOM is ready
56
- init: function() {
57
- try {
58
- // Register bindings to every Rails remote element
59
- railsAjax.attachAjaxToElements('*[data-remote=true]');
60
- var lRootURL = History.getRootUrl();
61
- jQuery(window).bind('statechange', function() {
62
- try {
63
- var lState = History.getState();
64
- <%= 'alert(\'[RailsAjax] History statechange triggered #\' + lState.data.id + \' via \' + lState.data.type + \' to \' + lState.url.replace(lRootURL, \'/\') + \' (anchor: \' + lState.data.anchor + \')\');' if (RailsAjax.config.DebugAlerts) %>
65
- jQuery.ajax({
66
- // TODO (History.js): Remove the anchor attribute when History.js handles anchors correctly.
67
- anchor: lState.data.anchor,
68
- // Get back all parameters set by Rails' jquery-ujs
69
- type: lState.data.type,
70
- data: lState.data.data,
71
- dataType: lState.data.dataType,
72
- crossDomain: lState.data.crossDomain,
73
- // Set the URL to query
74
- url: lState.url.replace(lRootURL, '/'),
75
- // And the callbacks
76
- // TODO (History.js): Remove the beforeSend callback when anchors will be handled correctly by History.js
77
- beforeSend: function(ioXHR, iSettings) {
78
- // Remember the anchor used
79
- ioXHR.anchor = iSettings.anchor;
80
- },
81
- success: function(iData, iStatus, iXHR) {
82
- railsAjax.ajaxSuccess(iXHR, iData);
83
- },
84
- error: function(iXHR, iStatus, iError) {
85
- railsAjax.ajaxError(iXHR, iError);
86
- }
87
- });
88
- } catch (iError) {
89
- alert('[RailsAjax] Exception in statechange callback: ' + iError.name + ' - ' + iError.message);
90
- }
91
- });
92
- } catch (iError) {
93
- alert('[RailsAjax] Exception during railsAjax initialization: ' + iError.name + ' - ' + iError.message);
94
- }
95
- },
96
-
97
- // Attach Ajax delegations to elements needing them
98
- //
99
- // Parameters::
100
- // * *iCSSSelector* (_String_): CSS selector of elements needing attachment
101
- attachAjaxToElements: function(iCSSSelector) {
102
- try {
103
- <%= 'alert(\'[RailsAjax] Attach Ajax bindings to elements \' + iCSSSelector + \' (\' + jQuery(iCSSSelector).length + \' elements)\');' if (RailsAjax.config.DebugAlerts) %>
104
- jQuery(document)
105
- .delegate(iCSSSelector, 'ajax:beforeSend', function(iEvent, ioXHR, iSettings) {
106
- try {
107
- var lThis = jQuery(this);
108
- var lURL = ((lThis.is('a')) ? lThis.attr('href') : lThis.attr('action'));
109
- <%= 'alert(\'[RailsAjax] Ajax before send. URL=\' + lURL + \' Method=\' + iSettings.type + \' Data=\' + iSettings.data);' if (RailsAjax.config.DebugAlerts) %>
110
- var lContinue = true;
111
- if (railsAjax.beforeSend != undefined) {
112
- try {
113
- lContinue = (railsAjax.beforeSend(ioXHR, iSettings) != false);
114
- } catch (iUserError) {
115
- alert('[RailsAjax] Exception in user callback railsAjax.beforeSend: ' + iUserError.name + ' - ' + iUserError.message);
116
- }
117
- }
118
- <%= 'alert(\'[RailsAjax] Continue on the Ajax load ? \' + lContinue);' if (RailsAjax.config.DebugAlerts) %>
119
- if (lContinue) {
120
- railsAjax.pushNewState(lURL,
121
- {
122
- // Replicate the whole Rails' jquery-ujs parameters, as we will need to pass them to the new ajax options object created during onstatechange event.
123
- type: iSettings.type,
124
- data: iSettings.data,
125
- dataType: iSettings.dataType,
126
- crossDomain: iSettings.crossDomain
127
- },
128
- false
129
- );
130
- }
131
- // Cancel AJAX processing right now.
132
- // It will be taken care of by the changestate event.
133
- return false;
134
- } catch (iError) {
135
- alert('[RailsAjax] Exception while ajax:beforeSend: ' + iError.name + ' - ' + iError.message);
136
- }
137
- })
138
- } catch (iError) {
139
- alert('[RailsAjax] Exception while binding Ajax events to elements ' + iCSSSelector + ': ' + iError.name + ' - ' + iError.message);
140
- }
141
- },
142
-
143
- // Callback called when Ajax call is successfull
144
- //
145
- // Parameters::
146
- // * *iXHR* (_Object_): The XHR object responsible for the Ajax call
147
- // * *iData* (_String_): The received data
148
- ajaxSuccess: function(iXHR, iData) {
149
- try {
150
- <%= 'alert(\'[RailsAjax] Ajax success. Loading data: \' + iData);' if (RailsAjax.config.DebugAlerts) %>
151
-
152
- // 1. Change the window's title if needed
153
- if ('page_title' in iData) {
154
- document.title = iData.page_title;
155
- }
156
-
157
- // 2. Replace HTML data, and execute scripts in the same time
158
- jQuery.each(iData.div_contents, function(iCSSSelector, iContent) {
159
- // This replaces HTML content and also executes scripts (even document.ready ones)
160
- jQuery(iCSSSelector).html(iContent);
161
- });
162
-
163
- // 3. Scroll to anchor if needed
164
- if (iXHR.anchor) {
165
- railsAjax.scrollToAnchor(iXHR.anchor);
166
- }
167
-
168
- // 4. For Firefox only, workaround a bug by setting the Favicon
169
- if (jQuery.browser.mozilla) {
170
- railsAjax.setFavicon();
171
- }
172
-
173
- // 5. Execute scripts that were added
174
- if ('js_to_execute' in iData) {
175
- jQuery.each(iData.js_to_execute, function(iIdx, iJS) {
176
- <%= 'alert(\'[RailsAjax] Execute script #\' + iIdx + \':\\n\' + iJS);' if (RailsAjax.config.DebugAlerts) %>
177
- try {
178
- eval(iJS);
179
- } catch (iError) {
180
- alert('[RailsAjax] Exception while executing Ajax script: ' + iError.name + ' - ' + iError.message + '\nScript:\n' + iJS);
181
- }
182
- });
183
- }
184
-
185
- // 6. Call user callbacks
186
- if (railsAjax.success != undefined) {
187
- try {
188
- railsAjax.success(iXHR, iData);
189
- } catch (iUserError) {
190
- alert('[RailsAjax] Exception in user callback railsAjax.success: ' + iUserError.name + ' - ' + iUserError.message);
191
- }
192
- }
193
- if (railsAjax.complete != undefined) {
194
- try {
195
- railsAjax.complete(iXHR);
196
- } catch (iUserError) {
197
- alert('[RailsAjax] Exception in user callback railsAjax.complete: ' + iUserError.name + ' - ' + iUserError.message);
198
- }
199
- }
200
-
201
- // 7. Handle redirects
202
- if ('redirect_to' in iData) {
203
- railsAjax.pushNewState(iData.redirect_to, {}, true);
204
- }
205
-
206
- } catch (iError) {
207
- alert('[RailsAjax] Exception while Ajax success callback: ' + iError.name + ' - ' + iError.message);
208
- }
209
- },
210
-
211
- // Callback called when Ajax call has failed
212
- //
213
- // Parameters::
214
- // * *iXHR* (_Object_): The xhr object
215
- // * *iError* (_Object_): The error
216
- ajaxError: function(iXHR, iError) {
217
- if (railsAjax.error != undefined) {
218
- try {
219
- railsAjax.error(iXHR, iError);
220
- } catch (iUserError) {
221
- alert('[RailsAjax] Exception in user callback railsAjax.error: ' + iUserError.name + ' - ' + iUserError.message);
222
- }
223
- }
224
- if (railsAjax.complete != undefined) {
225
- try {
226
- railsAjax.complete(iXHR);
227
- } catch (iUserError) {
228
- alert('[RailsAjax] Exception in user callback railsAjax.complete: ' + iUserError.name + ' - ' + iUserError.message);
229
- }
230
- }
231
- },
232
-
233
- // Used to identify states in debugging logs
234
- <%= 'gStateID: 0,' if (RailsAjax.config.DebugAlerts) %>
235
-
236
- // Push a new History state
237
- //
238
- // Parameters::
239
- // * *iURL* (_String_): The URL to be pushed
240
- // * *iData* (_Object_): The state object to store with it
241
- // * *iReplaceState* (_Boolean_): Do we replace the current state ?
242
- pushNewState: function(iURL, iData, iReplaceState) {
243
- try {
244
- // Remove the hash if it is present, as otherwise anchorchange is triggered and statechange ignored.
245
- // We don't want to handle anchorchange callback as it is unable to get the real History state correctly.
246
- // TODO (History.js): Correct bug https://github.com/balupton/history.js/issues/42 and https://github.com/balupton/history.js/issues/173, then remove this special hash and anchor treatment
247
- var lSplittedURL = iURL.split('#');
248
- var lState = jQuery.extend(
249
- {
250
- // Used to identify states in debugging logs
251
- <%= 'id: railsAjax.gStateID,' if (RailsAjax.config.DebugAlerts) %>
252
- anchor: lSplittedURL[1]
253
- },
254
- iData
255
- );
256
- if (iReplaceState) {
257
- History.replaceState(lState, null, lSplittedURL[0]);
258
- } else {
259
- History.pushState(lState, null, lSplittedURL[0]);
260
- }
261
- <%= 'railsAjax.gStateID = railsAjax.gStateID + 1;' if (RailsAjax.config.DebugAlerts) %>
262
- } catch (iError) {
263
- alert('[RailsAjax] Exception in pushNewState: ' + iError.name + ' - ' + iError.message);
264
- }
265
- },
266
-
267
- // Scroll the web page to display a given anchor.
268
- // An anchor is either a div id, or a named "a"
269
- //
270
- // Parameters::
271
- // * *iAnchor* (_String_): Anchor name
272
- scrollToAnchor: function(iAnchor) {
273
- var lDivElement = jQuery('div#' + iAnchor)[0]
274
- if (lDivElement != undefined) {
275
- lDivElement.scrollIntoView(true);
276
- } else {
277
- var lLstElements = window.document.getElementsByName(iAnchor);
278
- if (lLstElements.length > 0) {
279
- lLstElements[0].scrollIntoView(true);
280
- } else {
281
- alert('[RailsAjax] No anchor named ' + iAnchor);
282
- }
283
- }
284
- },
285
-
286
- // Reload the favicon.
287
- // This is needed to workaround a Firefox bug: http://kilianvalkhof.com/2010/javascript/the-case-of-the-disappearing-favicon/
288
- setFavicon: function() {
289
- var link = jQuery('link[type="image/x-icon"]').remove().attr('href');
290
- jQuery('<link href="'+ link +'" rel="shortcut icon" type="image/x-icon" />').appendTo('head');
291
- }
292
-
293
- };
294
-
295
- // Initialize everything once the DOM is loaded and ready
296
- jQuery(document).ready(function(){
297
- railsAjax.init();
298
- });
299
-
300
- <% end %>
1
+ //--
2
+ // Copyright (c) 2012 Muriel Salvan (muriel@x-aeon.com)
3
+ // Licensed under the terms specified in LICENSE file. No warranty is provided.
4
+ //++
5
+
6
+ <% if (RailsAjax.config.Enabled) %>
7
+
8
+ //=========================================
9
+ // Browser detection code (removed from jQuery >=1.9):
10
+ // Can be removed along with setFavicon as soon as Firefox corrects bug: https://bugzilla.mozilla.org/show_bug.cgi?id=519028
11
+ var matched, browser;
12
+
13
+ // Use of jQuery.browser is frowned upon.
14
+ // More details: http://api.jquery.com/jQuery.browser
15
+ // jQuery.uaMatch maintained for back-compat
16
+ jQuery.uaMatch = function( ua ) {
17
+ ua = ua.toLowerCase();
18
+
19
+ var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
20
+ /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
21
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
22
+ /(msie) ([\w.]+)/.exec( ua ) ||
23
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
24
+ [];
25
+
26
+ return {
27
+ browser: match[ 1 ] || "",
28
+ version: match[ 2 ] || "0"
29
+ };
30
+ };
31
+
32
+ matched = jQuery.uaMatch( navigator.userAgent );
33
+ browser = {};
34
+
35
+ if ( matched.browser ) {
36
+ browser[ matched.browser ] = true;
37
+ browser.version = matched.version;
38
+ }
39
+
40
+ // Chrome is Webkit, but Webkit is also Safari.
41
+ if ( browser.chrome ) {
42
+ browser.webkit = true;
43
+ } else if ( browser.webkit ) {
44
+ browser.safari = true;
45
+ }
46
+
47
+ jQuery.browser = browser;
48
+ //===========================================
49
+
50
+
51
+
52
+ // Encapsulate everything in a nice namespace
53
+ var railsAjax = {
54
+
55
+ // Initialization, to be called just once when the DOM is ready
56
+ init: function() {
57
+ try {
58
+ // Register bindings to every Rails remote element
59
+ railsAjax.attachAjaxToElements('*[data-rails-ajax-remote=true]');
60
+ var lRootURL = History.getRootUrl();
61
+ jQuery(window).bind('statechange', function() {
62
+ try {
63
+ var lState = History.getState();
64
+ <%= 'alert(\'[RailsAjax] History statechange triggered #\' + lState.data.id + \' via \' + lState.data.type + \' to \' + lState.url.replace(lRootURL, \'/\') + \' (anchor: \' + lState.data.anchor + \')\');' if (RailsAjax.config.DebugAlerts) %>
65
+ jQuery.ajax({
66
+ // TODO (History.js): Remove the anchor attribute when History.js handles anchors correctly.
67
+ anchor: lState.data.anchor,
68
+ // Get back all parameters set by Rails' jquery-ujs
69
+ type: lState.data.type,
70
+ data: lState.data.data,
71
+ dataType: lState.data.dataType,
72
+ crossDomain: lState.data.crossDomain,
73
+ // Set the URL to query
74
+ url: lState.url.replace(lRootURL, '/'),
75
+ // And the callbacks
76
+ // TODO (History.js): Remove the beforeSend callback when anchors will be handled correctly by History.js
77
+ beforeSend: function(ioXHR, iSettings) {
78
+ // Remember the anchor used
79
+ ioXHR.anchor = iSettings.anchor;
80
+ },
81
+ success: function(iData, iStatus, iXHR) {
82
+ railsAjax.ajaxSuccess(iXHR, iData);
83
+ },
84
+ error: function(iXHR, iStatus, iError) {
85
+ railsAjax.ajaxError(iXHR, iError);
86
+ }
87
+ });
88
+ } catch (iError) {
89
+ alert('[RailsAjax] Exception in statechange callback: ' + iError.name + ' - ' + iError.message);
90
+ }
91
+ });
92
+ } catch (iError) {
93
+ alert('[RailsAjax] Exception during railsAjax initialization: ' + iError.name + ' - ' + iError.message);
94
+ }
95
+ },
96
+
97
+ // Attach Ajax delegations to elements needing them
98
+ //
99
+ // Parameters::
100
+ // * *iCSSSelector* (_String_): CSS selector of elements needing attachment
101
+ attachAjaxToElements: function(iCSSSelector) {
102
+ try {
103
+ <%= 'alert(\'[RailsAjax] Attach Ajax bindings to elements \' + iCSSSelector + \' (\' + jQuery(iCSSSelector).length + \' elements)\');' if (RailsAjax.config.DebugAlerts) %>
104
+ jQuery(document)
105
+ .delegate(iCSSSelector, 'ajax:beforeSend', function(iEvent, ioXHR, iSettings) {
106
+ try {
107
+ var lThis = jQuery(this);
108
+ var lURL = ((lThis.is('a')) ? lThis.attr('href') : lThis.attr('action'));
109
+ <%= 'alert(\'[RailsAjax] Ajax before send. URL=\' + lURL + \' Method=\' + iSettings.type + \' Data=\' + iSettings.data);' if (RailsAjax.config.DebugAlerts) %>
110
+ var lContinue = true;
111
+ if (railsAjax.beforeSend != undefined) {
112
+ try {
113
+ lContinue = (railsAjax.beforeSend(ioXHR, iSettings) != false);
114
+ } catch (iUserError) {
115
+ alert('[RailsAjax] Exception in user callback railsAjax.beforeSend: ' + iUserError.name + ' - ' + iUserError.message);
116
+ }
117
+ }
118
+ <%= 'alert(\'[RailsAjax] Continue on the Ajax load ? \' + lContinue);' if (RailsAjax.config.DebugAlerts) %>
119
+ if (lContinue) {
120
+ railsAjax.pushNewState(lURL,
121
+ {
122
+ // Replicate the whole Rails' jquery-ujs parameters, as we will need to pass them to the new ajax options object created during onstatechange event.
123
+ type: iSettings.type,
124
+ data: iSettings.data,
125
+ dataType: iSettings.dataType,
126
+ crossDomain: iSettings.crossDomain
127
+ },
128
+ false
129
+ );
130
+ }
131
+ // Cancel AJAX processing right now.
132
+ // It will be taken care of by the changestate event.
133
+ return false;
134
+ } catch (iError) {
135
+ alert('[RailsAjax] Exception while ajax:beforeSend: ' + iError.name + ' - ' + iError.message);
136
+ }
137
+ })
138
+ } catch (iError) {
139
+ alert('[RailsAjax] Exception while binding Ajax events to elements ' + iCSSSelector + ': ' + iError.name + ' - ' + iError.message);
140
+ }
141
+ },
142
+
143
+ // Callback called when Ajax call is successfull
144
+ //
145
+ // Parameters::
146
+ // * *iXHR* (_Object_): The XHR object responsible for the Ajax call
147
+ // * *iData* (_String_): The received data
148
+ ajaxSuccess: function(iXHR, iData) {
149
+ try {
150
+ <%= 'alert(\'[RailsAjax] Ajax success. Loading data: \' + iData);' if (RailsAjax.config.DebugAlerts) %>
151
+
152
+ // 1. Change the window's title if needed
153
+ if ('page_title' in iData) {
154
+ document.title = iData.page_title;
155
+ }
156
+
157
+ // 2. Replace HTML data, and execute scripts in the same time
158
+ jQuery.each(iData.div_contents, function(iCSSSelector, iContent) {
159
+ // This replaces HTML content and also executes scripts (even document.ready ones)
160
+ jQuery(iCSSSelector).html(iContent);
161
+ });
162
+
163
+ // 3. Scroll to anchor if needed
164
+ if (iXHR.anchor) {
165
+ railsAjax.scrollToAnchor(iXHR.anchor);
166
+ }
167
+
168
+ // 4. For Firefox only, workaround a bug by setting the Favicon
169
+ if (jQuery.browser.mozilla) {
170
+ railsAjax.setFavicon();
171
+ }
172
+
173
+ // 5. Execute scripts that were added
174
+ if ('js_to_execute' in iData) {
175
+ jQuery.each(iData.js_to_execute, function(iIdx, iJS) {
176
+ <%= 'alert(\'[RailsAjax] Execute script #\' + iIdx + \':\\n\' + iJS);' if (RailsAjax.config.DebugAlerts) %>
177
+ try {
178
+ eval(iJS);
179
+ } catch (iError) {
180
+ alert('[RailsAjax] Exception while executing Ajax script: ' + iError.name + ' - ' + iError.message + '\nScript:\n' + iJS);
181
+ }
182
+ });
183
+ }
184
+
185
+ // 6. Call user callbacks
186
+ if (railsAjax.success != undefined) {
187
+ try {
188
+ railsAjax.success(iXHR, iData);
189
+ } catch (iUserError) {
190
+ alert('[RailsAjax] Exception in user callback railsAjax.success: ' + iUserError.name + ' - ' + iUserError.message);
191
+ }
192
+ }
193
+ if (railsAjax.complete != undefined) {
194
+ try {
195
+ railsAjax.complete(iXHR);
196
+ } catch (iUserError) {
197
+ alert('[RailsAjax] Exception in user callback railsAjax.complete: ' + iUserError.name + ' - ' + iUserError.message);
198
+ }
199
+ }
200
+
201
+ // 7. Handle redirects
202
+ if ('redirect_to' in iData) {
203
+ railsAjax.pushNewState(iData.redirect_to, {}, true);
204
+ }
205
+
206
+ } catch (iError) {
207
+ alert('[RailsAjax] Exception while Ajax success callback: ' + iError.name + ' - ' + iError.message);
208
+ }
209
+ },
210
+
211
+ // Callback called when Ajax call has failed
212
+ //
213
+ // Parameters::
214
+ // * *iXHR* (_Object_): The xhr object
215
+ // * *iError* (_Object_): The error
216
+ ajaxError: function(iXHR, iError) {
217
+ if (railsAjax.error != undefined) {
218
+ try {
219
+ railsAjax.error(iXHR, iError);
220
+ } catch (iUserError) {
221
+ alert('[RailsAjax] Exception in user callback railsAjax.error: ' + iUserError.name + ' - ' + iUserError.message);
222
+ }
223
+ }
224
+ if (railsAjax.complete != undefined) {
225
+ try {
226
+ railsAjax.complete(iXHR);
227
+ } catch (iUserError) {
228
+ alert('[RailsAjax] Exception in user callback railsAjax.complete: ' + iUserError.name + ' - ' + iUserError.message);
229
+ }
230
+ }
231
+ },
232
+
233
+ // Used to identify states in debugging logs
234
+ <%= 'gStateID: 0,' if (RailsAjax.config.DebugAlerts) %>
235
+
236
+ // Push a new History state
237
+ //
238
+ // Parameters::
239
+ // * *iURL* (_String_): The URL to be pushed
240
+ // * *iData* (_Object_): The state object to store with it
241
+ // * *iReplaceState* (_Boolean_): Do we replace the current state ?
242
+ pushNewState: function(iURL, iData, iReplaceState) {
243
+ try {
244
+ // Remove the hash if it is present, as otherwise anchorchange is triggered and statechange ignored.
245
+ // We don't want to handle anchorchange callback as it is unable to get the real History state correctly.
246
+ // TODO (History.js): Correct bug https://github.com/balupton/history.js/issues/42 and https://github.com/balupton/history.js/issues/173, then remove this special hash and anchor treatment
247
+ var lSplittedURL = iURL.split('#');
248
+ var lState = jQuery.extend(
249
+ {
250
+ // Used to identify states in debugging logs
251
+ <%= 'id: railsAjax.gStateID,' if (RailsAjax.config.DebugAlerts) %>
252
+ anchor: lSplittedURL[1]
253
+ },
254
+ iData
255
+ );
256
+ if (iReplaceState) {
257
+ History.replaceState(lState, null, lSplittedURL[0]);
258
+ } else {
259
+ History.pushState(lState, null, lSplittedURL[0]);
260
+ }
261
+ <%= 'railsAjax.gStateID = railsAjax.gStateID + 1;' if (RailsAjax.config.DebugAlerts) %>
262
+ } catch (iError) {
263
+ alert('[RailsAjax] Exception in pushNewState: ' + iError.name + ' - ' + iError.message);
264
+ }
265
+ },
266
+
267
+ // Scroll the web page to display a given anchor.
268
+ // An anchor is either a div id, or a named "a"
269
+ //
270
+ // Parameters::
271
+ // * *iAnchor* (_String_): Anchor name
272
+ scrollToAnchor: function(iAnchor) {
273
+ var lDivElement = jQuery('div#' + iAnchor)[0]
274
+ if (lDivElement != undefined) {
275
+ lDivElement.scrollIntoView(true);
276
+ } else {
277
+ var lLstElements = window.document.getElementsByName(iAnchor);
278
+ if (lLstElements.length > 0) {
279
+ lLstElements[0].scrollIntoView(true);
280
+ } else {
281
+ alert('[RailsAjax] No anchor named ' + iAnchor);
282
+ }
283
+ }
284
+ },
285
+
286
+ // Reload the favicon.
287
+ // This is needed to workaround a Firefox bug: http://kilianvalkhof.com/2010/javascript/the-case-of-the-disappearing-favicon/
288
+ setFavicon: function() {
289
+ var link = jQuery('link[type="image/x-icon"]').remove().attr('href');
290
+ jQuery('<link href="'+ link +'" rel="shortcut icon" type="image/x-icon" />').appendTo('head');
291
+ }
292
+
293
+ };
294
+
295
+ // Initialize everything once the DOM is loaded and ready
296
+ jQuery(document).ready(function(){
297
+ railsAjax.init();
298
+ });
299
+
300
+ <% end %>
@@ -4,6 +4,7 @@ RailsAjax::configure do
4
4
  # Enable or disable RailsAjax.
5
5
  # If disabled, RailsAjax methods will be useless, and corresponding JavaScript will be removed.
6
6
  # When changing this switch, you have to:
7
+ # * Remove the tmp/cache directory
7
8
  # * Precompile your assets in production mode
8
9
  # * Restart your server
9
10
  enable true
@@ -24,7 +24,7 @@ module RailsAjax
24
24
  attr_reader :FlashContainers
25
25
 
26
26
  # Debug alerts ?
27
- #
27
+ #
28
28
  # _Boolean_
29
29
  attr_reader :DebugAlerts
30
30
 
@@ -17,7 +17,10 @@ module RailsAjax
17
17
  lArgs = _normalize_args(*iArgs, &iBlock)
18
18
  if ((request.xhr?) and
19
19
  (!lArgs.has_key?(:partial)) and
20
- (!lArgs.has_key?(:layout)))
20
+ (!lArgs.has_key?(:layout)) and
21
+ (!lArgs.has_key?(:json)) and
22
+ (params['format'] != 'json') and
23
+ (self.content_type != 'application/json'))
21
24
  logger.debug "[RailsAjax] render: iArgs=#{iArgs.inspect} iBlock?#{iBlock != nil} flash=#{flash.inspect} | Normalized arguments: #{lArgs.inspect}"
22
25
 
23
26
  # If we have a redirection, use redirect_to
@@ -25,7 +28,6 @@ module RailsAjax
25
28
  # Complete arguments if needed
26
29
  # We don't want a special layout for Ajax requests: this was asked using AJAX for a page to be displayed in the main content
27
30
  lArgs[:layout] = false
28
-
29
31
  # Render
30
32
  lMainPage = nil
31
33
  if (iBlock == nil)
@@ -11,13 +11,13 @@ module RailsAjax
11
11
  # Replaces form_tag with an Ajax updated version
12
12
  def form_tag(url_for_options = {}, options = {}, &block)
13
13
  if (RailsAjax.config.Enabled and
14
- (options[:target] == nil))
14
+ RailsAjax::rails_ajaxifiable?(options))
15
15
  if block_given?
16
- return super(url_for_options, options.merge({:remote => true})) do
16
+ return super(url_for_options, options.merge({ :remote => true, :'data-rails-ajax-remote' => true })) do
17
17
  block.call
18
18
  end
19
19
  else
20
- return super(url_for_options, options.merge({:remote => true}))
20
+ return super(url_for_options, options.merge({ :remote => true, :'data-rails-ajax-remote' => true }))
21
21
  end
22
22
  elsif block_given?
23
23
  return super(url_for_options, options) do
@@ -25,4 +25,16 @@ module RailsAjax
25
25
  @@Configuration.instance_eval(&iProcConfig)
26
26
  end
27
27
 
28
+ # Find if we use rails-ajax for a given set of options applicable to a link
29
+ #
30
+ # Parameters::
31
+ # * *iOptions* (<em>map<Symbol,Object></em>): The options provided to a link (used in link_to or form_tag)
32
+ # Result::
33
+ # * _Boolean_: Would this link be handled by rails-ajax?
34
+ def self.rails_ajaxifiable?(iOptions)
35
+ return ((iOptions[:use_rails_ajax] != false) and # User has not removed rails-ajax voluntarily
36
+ (iOptions[:target] == nil) and # Open in the same window and
37
+ (!iOptions.has_key?(:remote))) # User has not specified Ajax call itself
38
+ end
39
+
28
40
  end
@@ -14,16 +14,18 @@ module RailsAjax
14
14
  lName = args.first
15
15
  lOptions = args.second || {}
16
16
  lHTMLOptions = args.third || {}
17
- if (lHTMLOptions[:target] == nil)
17
+ # Decide if we use rails-ajax or not for this link
18
+ if RailsAjax::rails_ajaxifiable?(lHTMLOptions)
19
+ # Adapt the link
18
20
  if block_given?
19
- return super(lName, lOptions, lHTMLOptions.merge({:remote => true})) do
21
+ return super(lName, lOptions, lHTMLOptions.merge({ :remote => true, :'data-rails-ajax-remote' => true })) do
20
22
  block.call
21
23
  end
22
24
  else
23
- return super(lName, lOptions, lHTMLOptions.merge({:remote => true}))
25
+ return super(lName, lOptions, lHTMLOptions.merge({ :remote => true, :'data-rails-ajax-remote' => true }))
24
26
  end
25
27
  elsif block_given?
26
- # It is specified to open the link in another frame. Don't use AJAX.
28
+ # Don't use Rails-Ajax
27
29
  return super(*args) do
28
30
  block.call
29
31
  end
@@ -31,6 +33,7 @@ module RailsAjax
31
33
  return super(*args)
32
34
  end
33
35
  elsif block_given?
36
+ # Don't use Rails-Ajax
34
37
  return super(*args) do
35
38
  block.call
36
39
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-ajax
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.20130731
4
+ version: 0.3.0.20130913
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-31 00:00:00.000000000 Z
12
+ date: 2013-09-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails