Mercurial > hg > ChinaGisRestApi
comparison gis_gui/lib/jquery.livequery.js @ 63:7f008e782563
add gui files to product via FileSystemSite
author | casties |
---|---|
date | Fri, 05 Nov 2010 18:52:55 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
62:3905385c8854 | 63:7f008e782563 |
---|---|
1 /*! Copyright (c) 2008 Brandon Aaron (http://brandonaaron.net) | |
2 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) | |
3 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. | |
4 * | |
5 * Version: 1.0.3 | |
6 * Requires jQuery 1.1.3+ | |
7 * Docs: http://docs.jquery.com/Plugins/livequery | |
8 */ | |
9 | |
10 (function($) { | |
11 | |
12 $.extend($.fn, { | |
13 livequery: function(type, fn, fn2) { | |
14 var self = this, q; | |
15 | |
16 // Handle different call patterns | |
17 if ($.isFunction(type)) | |
18 fn2 = fn, fn = type, type = undefined; | |
19 | |
20 // See if Live Query already exists | |
21 $.each( $.livequery.queries, function(i, query) { | |
22 if ( self.selector == query.selector && self.context == query.context && | |
23 type == query.type && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) ) | |
24 // Found the query, exit the each loop | |
25 return (q = query) && false; | |
26 }); | |
27 | |
28 // Create new Live Query if it wasn't found | |
29 q = q || new $.livequery(this.selector, this.context, type, fn, fn2); | |
30 | |
31 // Make sure it is running | |
32 q.stopped = false; | |
33 | |
34 // Run it immediately for the first time | |
35 q.run(); | |
36 | |
37 // Contnue the chain | |
38 return this; | |
39 }, | |
40 | |
41 expire: function(type, fn, fn2) { | |
42 var self = this; | |
43 | |
44 // Handle different call patterns | |
45 if ($.isFunction(type)) | |
46 fn2 = fn, fn = type, type = undefined; | |
47 | |
48 // Find the Live Query based on arguments and stop it | |
49 $.each( $.livequery.queries, function(i, query) { | |
50 if ( self.selector == query.selector && self.context == query.context && | |
51 (!type || type == query.type) && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) && !this.stopped ) | |
52 $.livequery.stop(query.id); | |
53 }); | |
54 | |
55 // Continue the chain | |
56 return this; | |
57 } | |
58 }); | |
59 | |
60 $.livequery = function(selector, context, type, fn, fn2) { | |
61 this.selector = selector; | |
62 this.context = context || document; | |
63 this.type = type; | |
64 this.fn = fn; | |
65 this.fn2 = fn2; | |
66 this.elements = []; | |
67 this.stopped = false; | |
68 | |
69 // The id is the index of the Live Query in $.livequery.queries | |
70 this.id = $.livequery.queries.push(this)-1; | |
71 | |
72 // Mark the functions for matching later on | |
73 fn.$lqguid = fn.$lqguid || $.livequery.guid++; | |
74 if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++; | |
75 | |
76 // Return the Live Query | |
77 return this; | |
78 }; | |
79 | |
80 $.livequery.prototype = { | |
81 stop: function() { | |
82 var query = this; | |
83 | |
84 if ( this.type ) | |
85 // Unbind all bound events | |
86 this.elements.unbind(this.type, this.fn); | |
87 else if (this.fn2) | |
88 // Call the second function for all matched elements | |
89 this.elements.each(function(i, el) { | |
90 query.fn2.apply(el); | |
91 }); | |
92 | |
93 // Clear out matched elements | |
94 this.elements = []; | |
95 | |
96 // Stop the Live Query from running until restarted | |
97 this.stopped = true; | |
98 }, | |
99 | |
100 run: function() { | |
101 // Short-circuit if stopped | |
102 if ( this.stopped ) return; | |
103 var query = this; | |
104 | |
105 var oEls = this.elements, | |
106 els = $(this.selector, this.context), | |
107 nEls = els.not(oEls); | |
108 | |
109 // Set elements to the latest set of matched elements | |
110 this.elements = els; | |
111 | |
112 if (this.type) { | |
113 // Bind events to newly matched elements | |
114 nEls.bind(this.type, this.fn); | |
115 | |
116 // Unbind events to elements no longer matched | |
117 if (oEls.length > 0) | |
118 $.each(oEls, function(i, el) { | |
119 if ( $.inArray(el, els) < 0 ) | |
120 $.event.remove(el, query.type, query.fn); | |
121 }); | |
122 } | |
123 else { | |
124 // Call the first function for newly matched elements | |
125 nEls.each(function() { | |
126 query.fn.apply(this); | |
127 }); | |
128 | |
129 // Call the second function for elements no longer matched | |
130 if ( this.fn2 && oEls.length > 0 ) | |
131 $.each(oEls, function(i, el) { | |
132 if ( $.inArray(el, els) < 0 ) | |
133 query.fn2.apply(el); | |
134 }); | |
135 } | |
136 } | |
137 }; | |
138 | |
139 $.extend($.livequery, { | |
140 guid: 0, | |
141 queries: [], | |
142 queue: [], | |
143 running: false, | |
144 timeout: null, | |
145 | |
146 checkQueue: function() { | |
147 if ( $.livequery.running && $.livequery.queue.length ) { | |
148 var length = $.livequery.queue.length; | |
149 // Run each Live Query currently in the queue | |
150 while ( length-- ) | |
151 $.livequery.queries[ $.livequery.queue.shift() ].run(); | |
152 } | |
153 }, | |
154 | |
155 pause: function() { | |
156 // Don't run anymore Live Queries until restarted | |
157 $.livequery.running = false; | |
158 }, | |
159 | |
160 play: function() { | |
161 // Restart Live Queries | |
162 $.livequery.running = true; | |
163 // Request a run of the Live Queries | |
164 $.livequery.run(); | |
165 }, | |
166 | |
167 registerPlugin: function() { | |
168 $.each( arguments, function(i,n) { | |
169 // Short-circuit if the method doesn't exist | |
170 if (!$.fn[n]) return; | |
171 | |
172 // Save a reference to the original method | |
173 var old = $.fn[n]; | |
174 | |
175 // Create a new method | |
176 $.fn[n] = function() { | |
177 // Call the original method | |
178 var r = old.apply(this, arguments); | |
179 | |
180 // Request a run of the Live Queries | |
181 $.livequery.run(); | |
182 | |
183 // Return the original methods result | |
184 return r; | |
185 } | |
186 }); | |
187 }, | |
188 | |
189 run: function(id) { | |
190 if (id != undefined) { | |
191 // Put the particular Live Query in the queue if it doesn't already exist | |
192 if ( $.inArray(id, $.livequery.queue) < 0 ) | |
193 $.livequery.queue.push( id ); | |
194 } | |
195 else | |
196 // Put each Live Query in the queue if it doesn't already exist | |
197 $.each( $.livequery.queries, function(id) { | |
198 if ( $.inArray(id, $.livequery.queue) < 0 ) | |
199 $.livequery.queue.push( id ); | |
200 }); | |
201 | |
202 // Clear timeout if it already exists | |
203 if ($.livequery.timeout) clearTimeout($.livequery.timeout); | |
204 // Create a timeout to check the queue and actually run the Live Queries | |
205 $.livequery.timeout = setTimeout($.livequery.checkQueue, 20); | |
206 }, | |
207 | |
208 stop: function(id) { | |
209 if (id != undefined) | |
210 // Stop are particular Live Query | |
211 $.livequery.queries[ id ].stop(); | |
212 else | |
213 // Stop all Live Queries | |
214 $.each( $.livequery.queries, function(id) { | |
215 $.livequery.queries[ id ].stop(); | |
216 }); | |
217 } | |
218 }); | |
219 | |
220 // Register core DOM manipulation methods | |
221 $.livequery.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove'); | |
222 | |
223 // Run Live Queries when the Document is ready | |
224 $(function() { $.livequery.play(); }); | |
225 | |
226 | |
227 // Save a reference to the original init method | |
228 var init = $.prototype.init; | |
229 | |
230 // Create a new init method that exposes two new properties: selector and context | |
231 $.prototype.init = function(a,c) { | |
232 // Call the original init and save the result | |
233 var r = init.apply(this, arguments); | |
234 | |
235 // Copy over properties if they exist already | |
236 if (a && a.selector) | |
237 r.context = a.context, r.selector = a.selector; | |
238 | |
239 // Set properties | |
240 if ( typeof a == 'string' ) | |
241 r.context = c || document, r.selector = a; | |
242 | |
243 // Return the result | |
244 return r; | |
245 }; | |
246 | |
247 // Give the init function the jQuery prototype for later instantiation (needed after Rev 4091) | |
248 $.prototype.init.prototype = $.prototype; | |
249 | |
250 })(jQuery); |