Código fuente de WordPress - jquery-plugins (jquery.schedule.js)

1 /*
2 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
3 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
4 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
5 **
6 ** $LastChangedDate$
7 ** $LastChangedRevision$
8 */
9
10 /*
11 * <div id="button">TEST BUTTON</div>
12 * <div id="test"></div>
13 *
14 * <script type="text/javascript">
15 * $(document).ready(
16 * function(){
17 * $('#button').click(function () {
18 * $(this).css("color", "blue").schedule(2000, function (x) {
19 * $(this).css("color", "red");
20 * $("#test").html("test: x = " + x);
21 * }, 42);
22 * });
23 * });
24 * </script>
25 */
26
27 (function($) {
28
29 /* object constructor */
30 $.scheduler = function () {
31 this.bucket = {};
32 return;
33 };
34
35 /* object methods */
36 $.scheduler.prototype = {
37 /* schedule a task */
38 schedule: function () {
39 /* schedule context with default parameters */
40 var ctx = {
41 "id": null, /* unique identifier of high-level schedule */
42 "time": 1000, /* time in milliseconds after which the task is run */
43 "repeat": false, /* whether schedule should be automatically repeated */
44 "protect": false, /* whether schedule should be protected from double scheduling */
45 "obj": null, /* function context object ("this") */
46 "func": function(){}, /* function to call */
47 "args": [] /* function arguments to pass */
48 };
49
50 /* helper function: portable checking whether something is a function */
51 function _isfn (fn) {
52 return (
53 !!fn
54 && typeof fn != "string"
55 && typeof fn[0] == "undefined"
56 && RegExp("function", "i").test(fn + "")
57 );
58 };
59
60 /* parse arguments into context parameters (part 1/4):
61 detect an override object (special case to support jQuery method) */
62 var i = 0;
63 var override = false;
64 if (typeof arguments[i] == "object" && arguments.length > 1) {
65 override = true;
66 i++;
67 }
68
69 /* parse arguments into context parameters (part 2/4):
70 support the flexible way of an associated array */
71 if (typeof arguments[i] == "object") {
72 for (var option in arguments[i])
73 if (typeof ctx[option] != "undefined")
74 ctx[option] = arguments[i][option];
75 i++;
76 }
77
78 /* parse arguments into context parameters (part 3/4):
79 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
80 if ( typeof arguments[i] == "number"
81 || ( typeof arguments[i] == "string"
82 && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
83 ctx["time"] = arguments[i++];
84 if (typeof arguments[i] == "boolean")
85 ctx["repeat"] = arguments[i++];
86 if (typeof arguments[i] == "boolean")
87 ctx["protect"] = arguments[i++];
88 if ( typeof arguments[i] == "object"
89 && typeof arguments[i+1] == "string"
90 && _isfn(arguments[i][arguments[i+1]])) {
91 ctx["obj"] = arguments[i++];
92 ctx["func"] = arguments[i++];
93 }
94 else if ( typeof arguments[i] != "undefined"
95 && ( _isfn(arguments[i])
96 || typeof arguments[i] == "string"))
97 ctx["func"] = arguments[i++];
98 while (typeof arguments[i] != "undefined")
99 ctx["args"].push(arguments[i++]);
100
101 /* parse arguments into context parameters (part 4/4):
102 apply parameters from override object */
103 if (override) {
104 if (typeof arguments[1] == "object") {
105 for (var option in arguments[0])
106 if ( typeof ctx[option] != "undefined"
107 && typeof arguments[1][option] == "undefined")
108 ctx[option] = arguments[0][option];
109 }
110 else {
111 for (var option in arguments[0])
112 if (typeof ctx[option] != "undefined")
113 ctx[option] = arguments[0][option];
114 }
115 i++;
116 }
117
118 /* annotate context with internals */
119 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
120 ctx["_handle"] = null; /* internal: unique handle of low-level task */
121
122 /* determine time value in milliseconds */
123 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
124 if (match && match[0] != "undefined" && match[1] != "undefined")
125 ctx["time"] = String(parseInt(match[1]) *
126 { s: 1000, m: 1000*60, h: 1000*60*60,
127 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
128
129 /* determine unique identifier of task */
130 if (ctx["id"] == null)
131 ctx["id"] = ( String(ctx["repeat"]) + ":"
132 + String(ctx["protect"]) + ":"
133 + String(ctx["time"]) + ":"
134 + String(ctx["obj"]) + ":"
135 + String(ctx["func"]) + ":"
136 + String(ctx["args"]) );
137
138 /* optionally protect from duplicate calls */
139 if (ctx["protect"])
140 if (typeof this.bucket[ctx["id"]] != "undefined")
141 return this.bucket[ctx["id"]];
142
143 /* support execution of methods by name and arbitrary scripts */
144 if (!_isfn(ctx["func"])) {
145 if ( ctx["obj"] != null
146 && typeof ctx["obj"] == "object"
147 && typeof ctx["func"] == "string"
148 && _isfn(ctx["obj"][ctx["func"]]))
149 /* method by name */
150 ctx["func"] = ctx["obj"][ctx["func"]];
151 else
152 /* arbitrary script */
153 ctx["func"] = eval("function () { " + ctx["func"] + " }");
154 }
155
156 /* pass-through to internal scheduling operation */
157 ctx["_handle"] = this._schedule(ctx);
158
159 /* store context into bucket of scheduler object */
160 this.bucket[ctx["id"]] = ctx;
161
162 /* return context */
163 return ctx;
164 },
165
166 /* re-schedule a task */
167 reschedule: function (ctx) {
168 if (typeof ctx == "string")
169 ctx = this.bucket[ctx];
170
171 /* pass-through to internal scheduling operation */
172 ctx["_handle"] = this._schedule(ctx);
173
174 /* return context */
175 return ctx;
176 },
177
178 /* internal scheduling operation */
179 _schedule: function (ctx) {
180 /* closure to act as the call trampoline function */
181 var trampoline = function () {
182 /* jump into function */
183 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
184 (ctx["func"]).apply(obj, ctx["args"]);
185
186 /* either repeat scheduling and keep in bucket or
187 just stop scheduling and delete from scheduler bucket */
188 if ( /* not cancelled from inside... */
189 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
190 && /* ...and repeating requested */
191 ctx["repeat"])
192 (ctx["_scheduler"])._schedule(ctx);
193 else
194 delete (ctx["_scheduler"]).bucket[ctx["id"]];
195 };
196
197 /* schedule task and return handle */
198 return setTimeout(trampoline, ctx["time"]);
199 },
200
201 /* cancel a scheduled task */
202 cancel: function (ctx) {
203 if (typeof ctx == "string")
204 ctx = this.bucket[ctx];
205
206 /* cancel scheduled task */
207 if (typeof ctx == "object") {
208 clearTimeout(ctx["_handle"]);
209 delete this.bucket[ctx["id"]];
210 }
211 }
212 };
213
214 /* integrate a global instance of the scheduler into the global jQuery object */
215 $.extend({
216 scheduler$: new $.scheduler(),
217 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },
218 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
219 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }
220 });
221
222 /* integrate scheduling convinience method into all jQuery objects */
223 $.fn.extend({
224 schedule: function () {
225 var a = [ {} ];
226 for (var i = 0; i < arguments.length; i++)
227 a.push(arguments[i]);
228 return this.each(function () {
229 a[0] = { "id": this, "obj": this };
230 return $.schedule.apply($, a);
231 });
232 }
233 });
234
235 })(jQuery);
236
237 /*
238 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
239 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
240 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
241 **
242 ** $LastChangedDate$
243 ** $LastChangedRevision$
244 */
245
246 /*
247 * <div id="button">TEST BUTTON</div>
248 * <div id="test"></div>
249 *
250 * <script type="text/javascript">
251 * $(document).ready(
252 * function(){
253 * $('#button').click(function () {
254 * $(this).css("color", "blue").schedule(2000, function (x) {
255 * $(this).css("color", "red");
256 * $("#test").html("test: x = " + x);
257 * }, 42);
258 * });
259 * });
260 * </script>
261 */
262
263 (function($) {
264
265 /* object constructor */
266 $.scheduler = function () {
267 this.bucket = {};
268 return;
269 };
270
271 /* object methods */
272 $.scheduler.prototype = {
273 /* schedule a task */
274 schedule: function () {
275 /* schedule context with default parameters */
276 var ctx = {
277 "id": null, /* unique identifier of high-level schedule */
278 "time": 1000, /* time in milliseconds after which the task is run */
279 "repeat": false, /* whether schedule should be automatically repeated */
280 "protect": false, /* whether schedule should be protected from double scheduling */
281 "obj": null, /* function context object ("this") */
282 "func": function(){}, /* function to call */
283 "args": [] /* function arguments to pass */
284 };
285
286 /* helper function: portable checking whether something is a function */
287 function _isfn (fn) {
288 return (
289 !!fn
290 && typeof fn != "string"
291 && typeof fn[0] == "undefined"
292 && RegExp("function", "i").test(fn + "")
293 );
294 };
295
296 /* parse arguments into context parameters (part 1/4):
297 detect an override object (special case to support jQuery method) */
298 var i = 0;
299 var override = false;
300 if (typeof arguments[i] == "object" && arguments.length > 1) {
301 override = true;
302 i++;
303 }
304
305 /* parse arguments into context parameters (part 2/4):
306 support the flexible way of an associated array */
307 if (typeof arguments[i] == "object") {
308 for (var option in arguments[i])
309 if (typeof ctx[option] != "undefined")
310 ctx[option] = arguments[i][option];
311 i++;
312 }
313
314 /* parse arguments into context parameters (part 3/4):
315 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
316 if ( typeof arguments[i] == "number"
317 || ( typeof arguments[i] == "string"
318 && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
319 ctx["time"] = arguments[i++];
320 if (typeof arguments[i] == "boolean")
321 ctx["repeat"] = arguments[i++];
322 if (typeof arguments[i] == "boolean")
323 ctx["protect"] = arguments[i++];
324 if ( typeof arguments[i] == "object"
325 && typeof arguments[i+1] == "string"
326 && _isfn(arguments[i][arguments[i+1]])) {
327 ctx["obj"] = arguments[i++];
328 ctx["func"] = arguments[i++];
329 }
330 else if ( typeof arguments[i] != "undefined"
331 && ( _isfn(arguments[i])
332 || typeof arguments[i] == "string"))
333 ctx["func"] = arguments[i++];
334 while (typeof arguments[i] != "undefined")
335 ctx["args"].push(arguments[i++]);
336
337 /* parse arguments into context parameters (part 4/4):
338 apply parameters from override object */
339 if (override) {
340 if (typeof arguments[1] == "object") {
341 for (var option in arguments[0])
342 if ( typeof ctx[option] != "undefined"
343 && typeof arguments[1][option] == "undefined")
344 ctx[option] = arguments[0][option];
345 }
346 else {
347 for (var option in arguments[0])
348 if (typeof ctx[option] != "undefined")
349 ctx[option] = arguments[0][option];
350 }
351 i++;
352 }
353
354 /* annotate context with internals */
355 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
356 ctx["_handle"] = null; /* internal: unique handle of low-level task */
357
358 /* determine time value in milliseconds */
359 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
360 if (match && match[0] != "undefined" && match[1] != "undefined")
361 ctx["time"] = String(parseInt(match[1]) *
362 { s: 1000, m: 1000*60, h: 1000*60*60,
363 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
364
365 /* determine unique identifier of task */
366 if (ctx["id"] == null)
367 ctx["id"] = ( String(ctx["repeat"]) + ":"
368 + String(ctx["protect"]) + ":"
369 + String(ctx["time"]) + ":"
370 + String(ctx["obj"]) + ":"
371 + String(ctx["func"]) + ":"
372 + String(ctx["args"]) );
373
374 /* optionally protect from duplicate calls */
375 if (ctx["protect"])
376 if (typeof this.bucket[ctx["id"]] != "undefined")
377 return this.bucket[ctx["id"]];
378
379 /* support execution of methods by name and arbitrary scripts */
380 if (!_isfn(ctx["func"])) {
381 if ( ctx["obj"] != null
382 && typeof ctx["obj"] == "object"
383 && typeof ctx["func"] == "string"
384 && _isfn(ctx["obj"][ctx["func"]]))
385 /* method by name */
386 ctx["func"] = ctx["obj"][ctx["func"]];
387 else
388 /* arbitrary script */
389 ctx["func"] = eval("function () { " + ctx["func"] + " }");
390 }
391
392 /* pass-through to internal scheduling operation */
393 ctx["_handle"] = this._schedule(ctx);
394
395 /* store context into bucket of scheduler object */
396 this.bucket[ctx["id"]] = ctx;
397
398 /* return context */
399 return ctx;
400 },
401
402 /* re-schedule a task */
403 reschedule: function (ctx) {
404 if (typeof ctx == "string")
405 ctx = this.bucket[ctx];
406
407 /* pass-through to internal scheduling operation */
408 ctx["_handle"] = this._schedule(ctx);
409
410 /* return context */
411 return ctx;
412 },
413
414 /* internal scheduling operation */
415 _schedule: function (ctx) {
416 /* closure to act as the call trampoline function */
417 var trampoline = function () {
418 /* jump into function */
419 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
420 (ctx["func"]).apply(obj, ctx["args"]);
421
422 /* either repeat scheduling and keep in bucket or
423 just stop scheduling and delete from scheduler bucket */
424 if ( /* not cancelled from inside... */
425 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
426 && /* ...and repeating requested */
427 ctx["repeat"])
428 (ctx["_scheduler"])._schedule(ctx);
429 else
430 delete (ctx["_scheduler"]).bucket[ctx["id"]];
431 };
432
433 /* schedule task and return handle */
434 return setTimeout(trampoline, ctx["time"]);
435 },
436
437 /* cancel a scheduled task */
438 cancel: function (ctx) {
439 if (typeof ctx == "string")
440 ctx = this.bucket[ctx];
441
442 /* cancel scheduled task */
443 if (typeof ctx == "object") {
444 clearTimeout(ctx["_handle"]);
445 delete this.bucket[ctx["id"]];
446 }
447 }
448 };
449
450 /* integrate a global instance of the scheduler into the global jQuery object */
451 $.extend({
452 scheduler$: new $.scheduler(),
453 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },
454 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
455 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }
456 });
457
458 /* integrate scheduling convinience method into all jQuery objects */
459 $.fn.extend({
460 schedule: function () {
461 var a = [ {} ];
462 for (var i = 0; i < arguments.length; i++)
463 a.push(arguments[i]);
464 return this.each(function () {
465 a[0] = { "id": this, "obj": this };
466 return $.schedule.apply($, a);
467 });
468 }
469 });
470
471 })(jQuery);
472
473 /*
474 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
475 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
476 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
477 **
478 ** $LastChangedDate$
479 ** $LastChangedRevision$
480 */
481
482 /*
483 * <div id="button">TEST BUTTON</div>
484 * <div id="test"></div>
485 *
486 * <script type="text/javascript">
487 * $(document).ready(
488 * function(){
489 * $('#button').click(function () {
490 * $(this).css("color", "blue").schedule(2000, function (x) {
491 * $(this).css("color", "red");
492 * $("#test").html("test: x = " + x);
493 * }, 42);
494 * });
495 * });
496 * </script>
497 */
498
499 (function($) {
500
501 /* object constructor */
502 $.scheduler = function () {
503 this.bucket = {};
504 return;
505 };
506
507 /* object methods */
508 $.scheduler.prototype = {
509 /* schedule a task */
510 schedule: function () {
511 /* schedule context with default parameters */
512 var ctx = {
513 "id": null, /* unique identifier of high-level schedule */
514 "time": 1000, /* time in milliseconds after which the task is run */
515 "repeat": false, /* whether schedule should be automatically repeated */
516 "protect": false, /* whether schedule should be protected from double scheduling */
517 "obj": null, /* function context object ("this") */
518 "func": function(){}, /* function to call */
519 "args": [] /* function arguments to pass */
520 };
521
522 /* helper function: portable checking whether something is a function */
523 function _isfn (fn) {
524 return (
525 !!fn
526 && typeof fn != "string"
527 && typeof fn[0] == "undefined"
528 && RegExp("function", "i").test(fn + "")
529 );
530 };
531
532 /* parse arguments into context parameters (part 1/4):
533 detect an override object (special case to support jQuery method) */
534 var i = 0;
535 var override = false;
536 if (typeof arguments[i] == "object" && arguments.length > 1) {
537 override = true;
538 i++;
539 }
540
541 /* parse arguments into context parameters (part 2/4):
542 support the flexible way of an associated array */
543 if (typeof arguments[i] == "object") {
544 for (var option in arguments[i])
545 if (typeof ctx[option] != "undefined")
546 ctx[option] = arguments[i][option];
547 i++;
548 }
549
550 /* parse arguments into context parameters (part 3/4):
551 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
552 if ( typeof arguments[i] == "number"
553 || ( typeof arguments[i] == "string"
554 && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
555 ctx["time"] = arguments[i++];
556 if (typeof arguments[i] == "boolean")
557 ctx["repeat"] = arguments[i++];
558 if (typeof arguments[i] == "boolean")
559 ctx["protect"] = arguments[i++];
560 if ( typeof arguments[i] == "object"
561 && typeof arguments[i+1] == "string"
562 && _isfn(arguments[i][arguments[i+1]])) {
563 ctx["obj"] = arguments[i++];
564 ctx["func"] = arguments[i++];
565 }
566 else if ( typeof arguments[i] != "undefined"
567 && ( _isfn(arguments[i])
568 || typeof arguments[i] == "string"))
569 ctx["func"] = arguments[i++];
570 while (typeof arguments[i] != "undefined")
571 ctx["args"].push(arguments[i++]);
572
573 /* parse arguments into context parameters (part 4/4):
574 apply parameters from override object */
575 if (override) {
576 if (typeof arguments[1] == "object") {
577 for (var option in arguments[0])
578 if ( typeof ctx[option] != "undefined"
579 && typeof arguments[1][option] == "undefined")
580 ctx[option] = arguments[0][option];
581 }
582 else {
583 for (var option in arguments[0])
584 if (typeof ctx[option] != "undefined")
585 ctx[option] = arguments[0][option];
586 }
587 i++;
588 }
589
590 /* annotate context with internals */
591 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
592 ctx["_handle"] = null; /* internal: unique handle of low-level task */
593
594 /* determine time value in milliseconds */
595 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
596 if (match && match[0] != "undefined" && match[1] != "undefined")
597 ctx["time"] = String(parseInt(match[1]) *
598 { s: 1000, m: 1000*60, h: 1000*60*60,
599 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
600
601 /* determine unique identifier of task */
602 if (ctx["id"] == null)
603 ctx["id"] = ( String(ctx["repeat"]) + ":"
604 + String(ctx["protect"]) + ":"
605 + String(ctx["time"]) + ":"
606 + String(ctx["obj"]) + ":"
607 + String(ctx["func"]) + ":"
608 + String(ctx["args"]) );
609
610 /* optionally protect from duplicate calls */
611 if (ctx["protect"])
612 if (typeof this.bucket[ctx["id"]] != "undefined")
613 return this.bucket[ctx["id"]];
614
615 /* support execution of methods by name and arbitrary scripts */
616 if (!_isfn(ctx["func"])) {
617 if ( ctx["obj"] != null
618 && typeof ctx["obj"] == "object"
619 && typeof ctx["func"] == "string"
620 && _isfn(ctx["obj"][ctx["func"]]))
621 /* method by name */
622 ctx["func"] = ctx["obj"][ctx["func"]];
623 else
624 /* arbitrary script */
625 ctx["func"] = eval("function () { " + ctx["func"] + " }");
626 }
627
628 /* pass-through to internal scheduling operation */
629 ctx["_handle"] = this._schedule(ctx);
630
631 /* store context into bucket of scheduler object */
632 this.bucket[ctx["id"]] = ctx;
633
634 /* return context */
635 return ctx;
636 },
637
638 /* re-schedule a task */
639 reschedule: function (ctx) {
640 if (typeof ctx == "string")
641 ctx = this.bucket[ctx];
642
643 /* pass-through to internal scheduling operation */
644 ctx["_handle"] = this._schedule(ctx);
645
646 /* return context */
647 return ctx;
648 },
649
650 /* internal scheduling operation */
651 _schedule: function (ctx) {
652 /* closure to act as the call trampoline function */
653 var trampoline = function () {
654 /* jump into function */
655 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
656 (ctx["func"]).apply(obj, ctx["args"]);
657
658 /* either repeat scheduling and keep in bucket or
659 just stop scheduling and delete from scheduler bucket */
660 if ( /* not cancelled from inside... */
661 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
662 && /* ...and repeating requested */
663 ctx["repeat"])
664 (ctx["_scheduler"])._schedule(ctx);
665 else
666 delete (ctx["_scheduler"]).bucket[ctx["id"]];
667 };
668
669 /* schedule task and return handle */
670 return setTimeout(trampoline, ctx["time"]);
671 },
672
673 /* cancel a scheduled task */
674 cancel: function (ctx) {
675 if (typeof ctx == "string")
676 ctx = this.bucket[ctx];
677
678 /* cancel scheduled task */
679 if (typeof ctx == "object") {
680 clearTimeout(ctx["_handle"]);
681 delete this.bucket[ctx["id"]];
682 }
683 }
684 };
685
686 /* integrate a global instance of the scheduler into the global jQuery object */
687 $.extend({
688 scheduler$: new $.scheduler(),
689 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) },
690 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
691 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) }
692 });
693
694 /* integrate scheduling convinience method into all jQuery objects */
695 $.fn.extend({
696 schedule: function () {
697 var a = [ {} ];
698 for (var i = 0; i < arguments.length; i++)
699 a.push(arguments[i]);
700 return this.each(function () {
701 a[0] = { "id": this, "obj": this };
702 return $.schedule.apply($, a);
703 });
704 }
705 });
706
707 })(jQuery);
708
1  /*
2  **  jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
3  **  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
4  **  Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
5  **
6  **  $LastChangedDate$
7  **  $LastChangedRevision$
8  */
9  
10  /*
11   *  <div id="button">TEST BUTTON</div>
12   *  <div id="test"></div>
13   *
14   *  <script type="text/javascript">
15   *     $(document).ready(
16   *     function(){
17   *         $('#button').click(function () {
18   *             $(this).css("color", "blue").schedule(2000, function (x) {
19   *                 $(this).css("color", "red");
20   *                 $("#test").html("test: x = " + x);
21   *             }, 42);
22   *         });
23   *     });
24   *  </script>
25   */
26  
27  (function($) {
28  
29      /*  object constructor  */
30      $.scheduler = function () {
31          this.bucket = {};
32          return;
33      };
34  
35      /*  object methods  */
36      $.scheduler.prototype = {
37          /*  schedule a task  */
38          schedule: function () {
39              /*  schedule context with default parameters */
40              var ctx = {
41                  "id":         null,         /* unique identifier of high-level schedule */
42                  "time":       1000,         /* time in milliseconds after which the task is run */
43                  "repeat":     false,        /* whether schedule should be automatically repeated */
44                  "protect":    false,        /* whether schedule should be protected from double scheduling */
45                  "obj":        null,         /* function context object ("this") */
46                  "func":       function(){}, /* function to call */
47                  "args":       []            /* function arguments to pass */
48              };
49  
50              /*  helper function: portable checking whether something is a function  */
51              function _isfn (fn) {
52                  return (
53                         !!fn
54                      && typeof fn != "string"
55                      && typeof fn[0] == "undefined"
56                      && RegExp("function", "i").test(fn + "")
57                  );
58              };
59             
60              /*  parse arguments into context parameters (part 1/4):
61                  detect an override object (special case to support jQuery method) */
62              var i = 0;
63              var override = false;
64              if (typeof arguments[i] == "object" && arguments.length > 1) {
65                  override = true;
66                  i++;
67              }
68  
69              /*  parse arguments into context parameters (part 2/4):
70                  support the flexible way of an associated array */
71              if (typeof arguments[i] == "object") {
72                  for (var option in arguments[i])
73                      if (typeof ctx[option] != "undefined")
74                          ctx[option] = arguments[i][option];
75                  i++;
76              }
77  
78              /*  parse arguments into context parameters (part 3/4):
79                  support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
80              if (   typeof arguments[i] == "number"
81                  || (   typeof arguments[i] == "string" 
82                      && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
83                  ctx["time"] = arguments[i++];
84              if (typeof arguments[i] == "boolean")
85                  ctx["repeat"] = arguments[i++];
86              if (typeof arguments[i] == "boolean")
87                  ctx["protect"] = arguments[i++];
88              if (   typeof arguments[i] == "object"
89                  && typeof arguments[i+1] == "string"
90                  && _isfn(arguments[i][arguments[i+1]])) {
91                  ctx["obj"] = arguments[i++];
92                  ctx["func"] = arguments[i++];
93              }
94              else if (   typeof arguments[i] != "undefined"
95                       && (   _isfn(arguments[i]) 
96                           || typeof arguments[i] == "string"))
97                  ctx["func"] = arguments[i++];
98              while (typeof arguments[i] != "undefined")
99                  ctx["args"].push(arguments[i++]);
100  
101              /*  parse arguments into context parameters (part 4/4):
102                  apply parameters from override object */
103              if (override) {
104                  if (typeof arguments[1] == "object") {
105                      for (var option in arguments[0])
106                          if (   typeof ctx[option] != "undefined"
107                              && typeof arguments[1][option] == "undefined")
108                              ctx[option] = arguments[0][option];
109                  }
110                  else {
111                      for (var option in arguments[0])
112                          if (typeof ctx[option] != "undefined")
113                              ctx[option] = arguments[0][option];
114                  }
115                  i++;
116              }
117  
118              /*  annotate context with internals */
119              ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
120              ctx["_handle"]    = null; /* internal: unique handle of low-level task */
121  
122              /*  determine time value in milliseconds */
123              var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
124              if (match && match[0] != "undefined" && match[1] != "undefined")
125                  ctx["time"] = String(parseInt(match[1]) *
126                      { s: 1000, m: 1000*60, h: 1000*60*60,
127                        d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
128  
129              /*  determine unique identifier of task  */
130              if (ctx["id"] == null)
131                  ctx["id"] = (  String(ctx["repeat"])  + ":"
132                               + String(ctx["protect"]) + ":"
133                               + String(ctx["time"])    + ":"
134                               + String(ctx["obj"])     + ":"
135                               + String(ctx["func"])    + ":"
136                               + String(ctx["args"])         );
137  
138              /*  optionally protect from duplicate calls  */
139              if (ctx["protect"])
140                  if (typeof this.bucket[ctx["id"]] != "undefined")
141                      return this.bucket[ctx["id"]];
142  
143              /*  support execution of methods by name and arbitrary scripts  */
144              if (!_isfn(ctx["func"])) {
145                  if (   ctx["obj"] != null
146                      && typeof ctx["obj"] == "object"
147                      && typeof ctx["func"] == "string"
148                      && _isfn(ctx["obj"][ctx["func"]]))
149                      /*  method by name  */
150                      ctx["func"] = ctx["obj"][ctx["func"]];
151                  else
152                      /*  arbitrary script  */
153                      ctx["func"] = eval("function () { " + ctx["func"] + " }");
154              }
155  
156              /*  pass-through to internal scheduling operation  */
157              ctx["_handle"] = this._schedule(ctx);
158  
159              /*  store context into bucket of scheduler object  */
160              this.bucket[ctx["id"]] = ctx;
161  
162              /*  return context  */
163              return ctx;
164          },
165  
166          /*  re-schedule a task  */
167          reschedule: function (ctx) {
168              if (typeof ctx == "string")
169                  ctx = this.bucket[ctx];
170  
171              /*  pass-through to internal scheduling operation  */
172              ctx["_handle"] = this._schedule(ctx);
173  
174              /*  return context  */
175              return ctx;
176          },
177  
178          /*  internal scheduling operation  */
179          _schedule: function (ctx) {
180              /*  closure to act as the call trampoline function  */
181              var trampoline = function () {
182                  /*  jump into function  */
183                  var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
184                  (ctx["func"]).apply(obj, ctx["args"]);
185  
186                  /*  either repeat scheduling and keep in bucket or
187                      just stop scheduling and delete from scheduler bucket  */
188                  if (   /* not cancelled from inside... */
189                         typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
190                      && /* ...and repeating requested */
191                         ctx["repeat"])
192                      (ctx["_scheduler"])._schedule(ctx);
193                  else
194                      delete (ctx["_scheduler"]).bucket[ctx["id"]];
195              };
196  
197              /*  schedule task and return handle  */
198              return setTimeout(trampoline, ctx["time"]);
199          },
200  
201          /*  cancel a scheduled task  */
202          cancel: function (ctx) {
203              if (typeof ctx == "string")
204                  ctx = this.bucket[ctx];
205  
206              /*  cancel scheduled task  */
207              if (typeof ctx == "object") {
208                  clearTimeout(ctx["_handle"]);
209                  delete this.bucket[ctx["id"]];
210              }
211          }
212      };
213  
214      /* integrate a global instance of the scheduler into the global jQuery object */
215      $.extend({
216          scheduler$: new $.scheduler(),
217          schedule:   function () { return $.scheduler$.schedule.apply  ($.scheduler$, arguments) },
218          reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
219          cancel:     function () { return $.scheduler$.cancel.apply    ($.scheduler$, arguments) }
220      });
221  
222      /* integrate scheduling convinience method into all jQuery objects */
223      $.fn.extend({
224          schedule: function () {
225              var a = [ {} ];
226              for (var i = 0; i < arguments.length; i++)
227                  a.push(arguments[i]);
228              return this.each(function () {
229                  a[0] = { "id": this, "obj": this };
230                  return $.schedule.apply($, a);
231              });
232          }
233      });
234  
235  })(jQuery);
236  
237  /*
238  **  jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
239  **  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
240  **  Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
241  **
242  **  $LastChangedDate$
243  **  $LastChangedRevision$
244  */
245  
246  /*
247   *  <div id="button">TEST BUTTON</div>
248   *  <div id="test"></div>
249   *
250   *  <script type="text/javascript">
251   *     $(document).ready(
252   *     function(){
253   *         $('#button').click(function () {
254   *             $(this).css("color", "blue").schedule(2000, function (x) {
255   *                 $(this).css("color", "red");
256   *                 $("#test").html("test: x = " + x);
257   *             }, 42);
258   *         });
259   *     });
260   *  </script>
261   */
262  
263  (function($) {
264  
265      /*  object constructor  */
266      $.scheduler = function () {
267          this.bucket = {};
268          return;
269      };
270  
271      /*  object methods  */
272      $.scheduler.prototype = {
273          /*  schedule a task  */
274          schedule: function () {
275              /*  schedule context with default parameters */
276              var ctx = {
277                  "id":         null,         /* unique identifier of high-level schedule */
278                  "time":       1000,         /* time in milliseconds after which the task is run */
279                  "repeat":     false,        /* whether schedule should be automatically repeated */
280                  "protect":    false,        /* whether schedule should be protected from double scheduling */
281                  "obj":        null,         /* function context object ("this") */
282                  "func":       function(){}, /* function to call */
283                  "args":       []            /* function arguments to pass */
284              };
285  
286              /*  helper function: portable checking whether something is a function  */
287              function _isfn (fn) {
288                  return (
289                         !!fn
290                      && typeof fn != "string"
291                      && typeof fn[0] == "undefined"
292                      && RegExp("function", "i").test(fn + "")
293                  );
294              };
295             
296              /*  parse arguments into context parameters (part 1/4):
297                  detect an override object (special case to support jQuery method) */
298              var i = 0;
299              var override = false;
300              if (typeof arguments[i] == "object" && arguments.length > 1) {
301                  override = true;
302                  i++;
303              }
304  
305              /*  parse arguments into context parameters (part 2/4):
306                  support the flexible way of an associated array */
307              if (typeof arguments[i] == "object") {
308                  for (var option in arguments[i])
309                      if (typeof ctx[option] != "undefined")
310                          ctx[option] = arguments[i][option];
311                  i++;
312              }
313  
314              /*  parse arguments into context parameters (part 3/4):
315                  support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
316              if (   typeof arguments[i] == "number"
317                  || (   typeof arguments[i] == "string" 
318                      && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
319                  ctx["time"] = arguments[i++];
320              if (typeof arguments[i] == "boolean")
321                  ctx["repeat"] = arguments[i++];
322              if (typeof arguments[i] == "boolean")
323                  ctx["protect"] = arguments[i++];
324              if (   typeof arguments[i] == "object"
325                  && typeof arguments[i+1] == "string"
326                  && _isfn(arguments[i][arguments[i+1]])) {
327                  ctx["obj"] = arguments[i++];
328                  ctx["func"] = arguments[i++];
329              }
330              else if (   typeof arguments[i] != "undefined"
331                       && (   _isfn(arguments[i]) 
332                           || typeof arguments[i] == "string"))
333                  ctx["func"] = arguments[i++];
334              while (typeof arguments[i] != "undefined")
335                  ctx["args"].push(arguments[i++]);
336  
337              /*  parse arguments into context parameters (part 4/4):
338                  apply parameters from override object */
339              if (override) {
340                  if (typeof arguments[1] == "object") {
341                      for (var option in arguments[0])
342                          if (   typeof ctx[option] != "undefined"
343                              && typeof arguments[1][option] == "undefined")
344                              ctx[option] = arguments[0][option];
345                  }
346                  else {
347                      for (var option in arguments[0])
348                          if (typeof ctx[option] != "undefined")
349                              ctx[option] = arguments[0][option];
350                  }
351                  i++;
352              }
353  
354              /*  annotate context with internals */
355              ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
356              ctx["_handle"]    = null; /* internal: unique handle of low-level task */
357  
358              /*  determine time value in milliseconds */
359              var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
360              if (match && match[0] != "undefined" && match[1] != "undefined")
361                  ctx["time"] = String(parseInt(match[1]) *
362                      { s: 1000, m: 1000*60, h: 1000*60*60,
363                        d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
364  
365              /*  determine unique identifier of task  */
366              if (ctx["id"] == null)
367                  ctx["id"] = (  String(ctx["repeat"])  + ":"
368                               + String(ctx["protect"]) + ":"
369                               + String(ctx["time"])    + ":"
370                               + String(ctx["obj"])     + ":"
371                               + String(ctx["func"])    + ":"
372                               + String(ctx["args"])         );
373  
374              /*  optionally protect from duplicate calls  */
375              if (ctx["protect"])
376                  if (typeof this.bucket[ctx["id"]] != "undefined")
377                      return this.bucket[ctx["id"]];
378  
379              /*  support execution of methods by name and arbitrary scripts  */
380              if (!_isfn(ctx["func"])) {
381                  if (   ctx["obj"] != null
382                      && typeof ctx["obj"] == "object"
383                      && typeof ctx["func"] == "string"
384                      && _isfn(ctx["obj"][ctx["func"]]))
385                      /*  method by name  */
386                      ctx["func"] = ctx["obj"][ctx["func"]];
387                  else
388                      /*  arbitrary script  */
389                      ctx["func"] = eval("function () { " + ctx["func"] + " }");
390              }
391  
392              /*  pass-through to internal scheduling operation  */
393              ctx["_handle"] = this._schedule(ctx);
394  
395              /*  store context into bucket of scheduler object  */
396              this.bucket[ctx["id"]] = ctx;
397  
398              /*  return context  */
399              return ctx;
400          },
401  
402          /*  re-schedule a task  */
403          reschedule: function (ctx) {
404              if (typeof ctx == "string")
405                  ctx = this.bucket[ctx];
406  
407              /*  pass-through to internal scheduling operation  */
408              ctx["_handle"] = this._schedule(ctx);
409  
410              /*  return context  */
411              return ctx;
412          },
413  
414          /*  internal scheduling operation  */
415          _schedule: function (ctx) {
416              /*  closure to act as the call trampoline function  */
417              var trampoline = function () {
418                  /*  jump into function  */
419                  var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
420                  (ctx["func"]).apply(obj, ctx["args"]);
421  
422                  /*  either repeat scheduling and keep in bucket or
423                      just stop scheduling and delete from scheduler bucket  */
424                  if (   /* not cancelled from inside... */
425                         typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
426                      && /* ...and repeating requested */
427                         ctx["repeat"])
428                      (ctx["_scheduler"])._schedule(ctx);
429                  else
430                      delete (ctx["_scheduler"]).bucket[ctx["id"]];
431              };
432  
433              /*  schedule task and return handle  */
434              return setTimeout(trampoline, ctx["time"]);
435          },
436  
437          /*  cancel a scheduled task  */
438          cancel: function (ctx) {
439              if (typeof ctx == "string")
440                  ctx = this.bucket[ctx];
441  
442              /*  cancel scheduled task  */
443              if (typeof ctx == "object") {
444                  clearTimeout(ctx["_handle"]);
445                  delete this.bucket[ctx["id"]];
446              }
447          }
448      };
449  
450      /* integrate a global instance of the scheduler into the global jQuery object */
451      $.extend({
452          scheduler$: new $.scheduler(),
453          schedule:   function () { return $.scheduler$.schedule.apply  ($.scheduler$, arguments) },
454          reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
455          cancel:     function () { return $.scheduler$.cancel.apply    ($.scheduler$, arguments) }
456      });
457  
458      /* integrate scheduling convinience method into all jQuery objects */
459      $.fn.extend({
460          schedule: function () {
461              var a = [ {} ];
462              for (var i = 0; i < arguments.length; i++)
463                  a.push(arguments[i]);
464              return this.each(function () {
465                  a[0] = { "id": this, "obj": this };
466                  return $.schedule.apply($, a);
467              });
468          }
469      });
470  
471  })(jQuery);
472  
473  /*
474  **  jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
475  **  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com>
476  **  Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
477  **
478  **  $LastChangedDate$
479  **  $LastChangedRevision$
480  */
481  
482  /*
483   *  <div id="button">TEST BUTTON</div>
484   *  <div id="test"></div>
485   *
486   *  <script type="text/javascript">
487   *     $(document).ready(
488   *     function(){
489   *         $('#button').click(function () {
490   *             $(this).css("color", "blue").schedule(2000, function (x) {
491   *                 $(this).css("color", "red");
492   *                 $("#test").html("test: x = " + x);
493   *             }, 42);
494   *         });
495   *     });
496   *  </script>
497   */
498  
499  (function($) {
500  
501      /*  object constructor  */
502      $.scheduler = function () {
503          this.bucket = {};
504          return;
505      };
506  
507      /*  object methods  */
508      $.scheduler.prototype = {
509          /*  schedule a task  */
510          schedule: function () {
511              /*  schedule context with default parameters */
512              var ctx = {
513                  "id":         null,         /* unique identifier of high-level schedule */
514                  "time":       1000,         /* time in milliseconds after which the task is run */
515                  "repeat":     false,        /* whether schedule should be automatically repeated */
516                  "protect":    false,        /* whether schedule should be protected from double scheduling */
517                  "obj":        null,         /* function context object ("this") */
518                  "func":       function(){}, /* function to call */
519                  "args":       []            /* function arguments to pass */
520              };
521  
522              /*  helper function: portable checking whether something is a function  */
523              function _isfn (fn) {
524                  return (
525                         !!fn
526                      && typeof fn != "string"
527                      && typeof fn[0] == "undefined"
528                      && RegExp("function", "i").test(fn + "")
529                  );
530              };
531             
532              /*  parse arguments into context parameters (part 1/4):
533                  detect an override object (special case to support jQuery method) */
534              var i = 0;
535              var override = false;
536              if (typeof arguments[i] == "object" && arguments.length > 1) {
537                  override = true;
538                  i++;
539              }
540  
541              /*  parse arguments into context parameters (part 2/4):
542                  support the flexible way of an associated array */
543              if (typeof arguments[i] == "object") {
544                  for (var option in arguments[i])
545                      if (typeof ctx[option] != "undefined")
546                          ctx[option] = arguments[i][option];
547                  i++;
548              }
549  
550              /*  parse arguments into context parameters (part 3/4):
551                  support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
552              if (   typeof arguments[i] == "number"
553                  || (   typeof arguments[i] == "string" 
554                      && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
555                  ctx["time"] = arguments[i++];
556              if (typeof arguments[i] == "boolean")
557                  ctx["repeat"] = arguments[i++];
558              if (typeof arguments[i] == "boolean")
559                  ctx["protect"] = arguments[i++];
560              if (   typeof arguments[i] == "object"
561                  && typeof arguments[i+1] == "string"
562                  && _isfn(arguments[i][arguments[i+1]])) {
563                  ctx["obj"] = arguments[i++];
564                  ctx["func"] = arguments[i++];
565              }
566              else if (   typeof arguments[i] != "undefined"
567                       && (   _isfn(arguments[i]) 
568                           || typeof arguments[i] == "string"))
569                  ctx["func"] = arguments[i++];
570              while (typeof arguments[i] != "undefined")
571                  ctx["args"].push(arguments[i++]);
572  
573              /*  parse arguments into context parameters (part 4/4):
574                  apply parameters from override object */
575              if (override) {
576                  if (typeof arguments[1] == "object") {
577                      for (var option in arguments[0])
578                          if (   typeof ctx[option] != "undefined"
579                              && typeof arguments[1][option] == "undefined")
580                              ctx[option] = arguments[0][option];
581                  }
582                  else {
583                      for (var option in arguments[0])
584                          if (typeof ctx[option] != "undefined")
585                              ctx[option] = arguments[0][option];
586                  }
587                  i++;
588              }
589  
590              /*  annotate context with internals */
591              ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
592              ctx["_handle"]    = null; /* internal: unique handle of low-level task */
593  
594              /*  determine time value in milliseconds */
595              var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
596              if (match && match[0] != "undefined" && match[1] != "undefined")
597                  ctx["time"] = String(parseInt(match[1]) *
598                      { s: 1000, m: 1000*60, h: 1000*60*60,
599                        d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
600  
601              /*  determine unique identifier of task  */
602              if (ctx["id"] == null)
603                  ctx["id"] = (  String(ctx["repeat"])  + ":"
604                               + String(ctx["protect"]) + ":"
605                               + String(ctx["time"])    + ":"
606                               + String(ctx["obj"])     + ":"
607                               + String(ctx["func"])    + ":"
608                               + String(ctx["args"])         );
609  
610              /*  optionally protect from duplicate calls  */
611              if (ctx["protect"])
612                  if (typeof this.bucket[ctx["id"]] != "undefined")
613                      return this.bucket[ctx["id"]];
614  
615              /*  support execution of methods by name and arbitrary scripts  */
616              if (!_isfn(ctx["func"])) {
617                  if (   ctx["obj"] != null
618                      && typeof ctx["obj"] == "object"
619                      && typeof ctx["func"] == "string"
620                      && _isfn(ctx["obj"][ctx["func"]]))
621                      /*  method by name  */
622                      ctx["func"] = ctx["obj"][ctx["func"]];
623                  else
624                      /*  arbitrary script  */
625                      ctx["func"] = eval("function () { " + ctx["func"] + " }");
626              }
627  
628              /*  pass-through to internal scheduling operation  */
629              ctx["_handle"] = this._schedule(ctx);
630  
631              /*  store context into bucket of scheduler object  */
632              this.bucket[ctx["id"]] = ctx;
633  
634              /*  return context  */
635              return ctx;
636          },
637  
638          /*  re-schedule a task  */
639          reschedule: function (ctx) {
640              if (typeof ctx == "string")
641                  ctx = this.bucket[ctx];
642  
643              /*  pass-through to internal scheduling operation  */
644              ctx["_handle"] = this._schedule(ctx);
645  
646              /*  return context  */
647              return ctx;
648          },
649  
650          /*  internal scheduling operation  */
651          _schedule: function (ctx) {
652              /*  closure to act as the call trampoline function  */
653              var trampoline = function () {
654                  /*  jump into function  */
655                  var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
656                  (ctx["func"]).apply(obj, ctx["args"]);
657  
658                  /*  either repeat scheduling and keep in bucket or
659                      just stop scheduling and delete from scheduler bucket  */
660                  if (   /* not cancelled from inside... */
661                         typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
662                      && /* ...and repeating requested */
663                         ctx["repeat"])
664                      (ctx["_scheduler"])._schedule(ctx);
665                  else
666                      delete (ctx["_scheduler"]).bucket[ctx["id"]];
667              };
668  
669              /*  schedule task and return handle  */
670              return setTimeout(trampoline, ctx["time"]);
671          },
672  
673          /*  cancel a scheduled task  */
674          cancel: function (ctx) {
675              if (typeof ctx == "string")
676                  ctx = this.bucket[ctx];
677  
678              /*  cancel scheduled task  */
679              if (typeof ctx == "object") {
680                  clearTimeout(ctx["_handle"]);
681                  delete this.bucket[ctx["id"]];
682              }
683          }
684      };
685  
686      /* integrate a global instance of the scheduler into the global jQuery object */
687      $.extend({
688          scheduler$: new $.scheduler(),
689          schedule:   function () { return $.scheduler$.schedule.apply  ($.scheduler$, arguments) },
690          reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
691          cancel:     function () { return $.scheduler$.cancel.apply    ($.scheduler$, arguments) }
692      });
693  
694      /* integrate scheduling convinience method into all jQuery objects */
695      $.fn.extend({
696          schedule: function () {
697              var a = [ {} ];
698              for (var i = 0; i < arguments.length; i++)
699                  a.push(arguments[i]);
700              return this.each(function () {
701                  a[0] = { "id": this, "obj": this };
702                  return $.schedule.apply($, a);
703              });
704          }
705      });
706  
707  })(jQuery);
708  
1 /* 2 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 3 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 4 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 5 ** 6 ** $LastChangedDate$ 7 ** $LastChangedRevision$ 8 */ 9 10 /* 11 * <div id="button">TEST BUTTON</div> 12 * <div id="test"></div> 13 * 14 * <script type="text/javascript"> 15 * $(document).ready( 16 * function(){ 17 * $('#button').click(function () { 18 * $(this).css("color", "blue").schedule(2000, function (x) { 19 * $(this).css("color", "red"); 20 * $("#test").html("test: x = " + x); 21 * }, 42); 22 * }); 23 * }); 24 * </script> 25 */ 26 27 (function($) { 28 29 /* object constructor */ 30 $.scheduler = function () { 31 this.bucket = {}; 32 return; 33 }; 34 35 /* object methods */ 36 $.scheduler.prototype = { 37 /* schedule a task */ 38 schedule: function () { 39 /* schedule context with default parameters */ 40 var ctx = { 41 "id": null, /* unique identifier of high-level schedule */ 42 "time": 1000, /* time in milliseconds after which the task is run */ 43 "repeat": false, /* whether schedule should be automatically repeated */ 44 "protect": false, /* whether schedule should be protected from double scheduling */ 45 "obj": null, /* function context object ("this") */ 46 "func": function(){}, /* function to call */ 47 "args": [] /* function arguments to pass */ 48 }; 49 50 /* helper function: portable checking whether something is a function */ 51 function _isfn (fn) { 52 return ( 53 !!fn 54 && typeof fn != "string" 55 && typeof fn[0] == "undefined" 56 && RegExp("function", "i").test(fn + "") 57 ); 58 }; 59 60 /* parse arguments into context parameters (part 1/4): 61 detect an override object (special case to support jQuery method) */ 62 var i = 0; 63 var override = false; 64 if (typeof arguments[i] == "object" && arguments.length > 1) { 65 override = true; 66 i++; 67 } 68 69 /* parse arguments into context parameters (part 2/4): 70 support the flexible way of an associated array */ 71 if (typeof arguments[i] == "object") { 72 for (var option in arguments[i]) 73 if (typeof ctx[option] != "undefined") 74 ctx[option] = arguments[i][option]; 75 i++; 76 } 77 78 /* parse arguments into context parameters (part 3/4): 79 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 80 if ( typeof arguments[i] == "number" 81 || ( typeof arguments[i] == "string" 82 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 83 ctx["time"] = arguments[i++]; 84 if (typeof arguments[i] == "boolean") 85 ctx["repeat"] = arguments[i++]; 86 if (typeof arguments[i] == "boolean") 87 ctx["protect"] = arguments[i++]; 88 if ( typeof arguments[i] == "object" 89 && typeof arguments[i+1] == "string" 90 && _isfn(arguments[i][arguments[i+1]])) { 91 ctx["obj"] = arguments[i++]; 92 ctx["func"] = arguments[i++]; 93 } 94 else if ( typeof arguments[i] != "undefined" 95 && ( _isfn(arguments[i]) 96 || typeof arguments[i] == "string")) 97 ctx["func"] = arguments[i++]; 98 while (typeof arguments[i] != "undefined") 99 ctx["args"].push(arguments[i++]); 100 101 /* parse arguments into context parameters (part 4/4): 102 apply parameters from override object */ 103 if (override) { 104 if (typeof arguments[1] == "object") { 105 for (var option in arguments[0]) 106 if ( typeof ctx[option] != "undefined" 107 && typeof arguments[1][option] == "undefined") 108 ctx[option] = arguments[0][option]; 109 } 110 else { 111 for (var option in arguments[0]) 112 if (typeof ctx[option] != "undefined") 113 ctx[option] = arguments[0][option]; 114 } 115 i++; 116 } 117 118 /* annotate context with internals */ 119 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 120 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 121 122 /* determine time value in milliseconds */ 123 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 124 if (match && match[0] != "undefined" && match[1] != "undefined") 125 ctx["time"] = String(parseInt(match[1]) * 126 { s: 1000, m: 1000*60, h: 1000*60*60, 127 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 128 129 /* determine unique identifier of task */ 130 if (ctx["id"] == null) 131 ctx["id"] = ( String(ctx["repeat"]) + ":" 132 + String(ctx["protect"]) + ":" 133 + String(ctx["time"]) + ":" 134 + String(ctx["obj"]) + ":" 135 + String(ctx["func"]) + ":" 136 + String(ctx["args"]) ); 137 138 /* optionally protect from duplicate calls */ 139 if (ctx["protect"]) 140 if (typeof this.bucket[ctx["id"]] != "undefined") 141 return this.bucket[ctx["id"]]; 142 143 /* support execution of methods by name and arbitrary scripts */ 144 if (!_isfn(ctx["func"])) { 145 if ( ctx["obj"] != null 146 && typeof ctx["obj"] == "object" 147 && typeof ctx["func"] == "string" 148 && _isfn(ctx["obj"][ctx["func"]])) 149 /* method by name */ 150 ctx["func"] = ctx["obj"][ctx["func"]]; 151 else 152 /* arbitrary script */ 153 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 154 } 155 156 /* pass-through to internal scheduling operation */ 157 ctx["_handle"] = this._schedule(ctx); 158 159 /* store context into bucket of scheduler object */ 160 this.bucket[ctx["id"]] = ctx; 161 162 /* return context */ 163 return ctx; 164 }, 165 166 /* re-schedule a task */ 167 reschedule: function (ctx) { 168 if (typeof ctx == "string") 169 ctx = this.bucket[ctx]; 170 171 /* pass-through to internal scheduling operation */ 172 ctx["_handle"] = this._schedule(ctx); 173 174 /* return context */ 175 return ctx; 176 }, 177 178 /* internal scheduling operation */ 179 _schedule: function (ctx) { 180 /* closure to act as the call trampoline function */ 181 var trampoline = function () { 182 /* jump into function */ 183 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 184 (ctx["func"]).apply(obj, ctx["args"]); 185 186 /* either repeat scheduling and keep in bucket or 187 just stop scheduling and delete from scheduler bucket */ 188 if ( /* not cancelled from inside... */ 189 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 190 && /* ...and repeating requested */ 191 ctx["repeat"]) 192 (ctx["_scheduler"])._schedule(ctx); 193 else 194 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 195 }; 196 197 /* schedule task and return handle */ 198 return setTimeout(trampoline, ctx["time"]); 199 }, 200 201 /* cancel a scheduled task */ 202 cancel: function (ctx) { 203 if (typeof ctx == "string") 204 ctx = this.bucket[ctx]; 205 206 /* cancel scheduled task */ 207 if (typeof ctx == "object") { 208 clearTimeout(ctx["_handle"]); 209 delete this.bucket[ctx["id"]]; 210 } 211 } 212 }; 213 214 /* integrate a global instance of the scheduler into the global jQuery object */ 215 $.extend({ 216 scheduler$: new $.scheduler(), 217 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 218 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 219 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 220 }); 221 222 /* integrate scheduling convinience method into all jQuery objects */ 223 $.fn.extend({ 224 schedule: function () { 225 var a = [ {} ]; 226 for (var i = 0; i < arguments.length; i++) 227 a.push(arguments[i]); 228 return this.each(function () { 229 a[0] = { "id": this, "obj": this }; 230 return $.schedule.apply($, a); 231 }); 232 } 233 }); 234 235 })(jQuery); 236 237 /* 238 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 239 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 240 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 241 ** 242 ** $LastChangedDate$ 243 ** $LastChangedRevision$ 244 */ 245 246 /* 247 * <div id="button">TEST BUTTON</div> 248 * <div id="test"></div> 249 * 250 * <script type="text/javascript"> 251 * $(document).ready( 252 * function(){ 253 * $('#button').click(function () { 254 * $(this).css("color", "blue").schedule(2000, function (x) { 255 * $(this).css("color", "red"); 256 * $("#test").html("test: x = " + x); 257 * }, 42); 258 * }); 259 * }); 260 * </script> 261 */ 262 263 (function($) { 264 265 /* object constructor */ 266 $.scheduler = function () { 267 this.bucket = {}; 268 return; 269 }; 270 271 /* object methods */ 272 $.scheduler.prototype = { 273 /* schedule a task */ 274 schedule: function () { 275 /* schedule context with default parameters */ 276 var ctx = { 277 "id": null, /* unique identifier of high-level schedule */ 278 "time": 1000, /* time in milliseconds after which the task is run */ 279 "repeat": false, /* whether schedule should be automatically repeated */ 280 "protect": false, /* whether schedule should be protected from double scheduling */ 281 "obj": null, /* function context object ("this") */ 282 "func": function(){}, /* function to call */ 283 "args": [] /* function arguments to pass */ 284 }; 285 286 /* helper function: portable checking whether something is a function */ 287 function _isfn (fn) { 288 return ( 289 !!fn 290 && typeof fn != "string" 291 && typeof fn[0] == "undefined" 292 && RegExp("function", "i").test(fn + "") 293 ); 294 }; 295 296 /* parse arguments into context parameters (part 1/4): 297 detect an override object (special case to support jQuery method) */ 298 var i = 0; 299 var override = false; 300 if (typeof arguments[i] == "object" && arguments.length > 1) { 301 override = true; 302 i++; 303 } 304 305 /* parse arguments into context parameters (part 2/4): 306 support the flexible way of an associated array */ 307 if (typeof arguments[i] == "object") { 308 for (var option in arguments[i]) 309 if (typeof ctx[option] != "undefined") 310 ctx[option] = arguments[i][option]; 311 i++; 312 } 313 314 /* parse arguments into context parameters (part 3/4): 315 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 316 if ( typeof arguments[i] == "number" 317 || ( typeof arguments[i] == "string" 318 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 319 ctx["time"] = arguments[i++]; 320 if (typeof arguments[i] == "boolean") 321 ctx["repeat"] = arguments[i++]; 322 if (typeof arguments[i] == "boolean") 323 ctx["protect"] = arguments[i++]; 324 if ( typeof arguments[i] == "object" 325 && typeof arguments[i+1] == "string" 326 && _isfn(arguments[i][arguments[i+1]])) { 327 ctx["obj"] = arguments[i++]; 328 ctx["func"] = arguments[i++]; 329 } 330 else if ( typeof arguments[i] != "undefined" 331 && ( _isfn(arguments[i]) 332 || typeof arguments[i] == "string")) 333 ctx["func"] = arguments[i++]; 334 while (typeof arguments[i] != "undefined") 335 ctx["args"].push(arguments[i++]); 336 337 /* parse arguments into context parameters (part 4/4): 338 apply parameters from override object */ 339 if (override) { 340 if (typeof arguments[1] == "object") { 341 for (var option in arguments[0]) 342 if ( typeof ctx[option] != "undefined" 343 && typeof arguments[1][option] == "undefined") 344 ctx[option] = arguments[0][option]; 345 } 346 else { 347 for (var option in arguments[0]) 348 if (typeof ctx[option] != "undefined") 349 ctx[option] = arguments[0][option]; 350 } 351 i++; 352 } 353 354 /* annotate context with internals */ 355 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 356 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 357 358 /* determine time value in milliseconds */ 359 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 360 if (match && match[0] != "undefined" && match[1] != "undefined") 361 ctx["time"] = String(parseInt(match[1]) * 362 { s: 1000, m: 1000*60, h: 1000*60*60, 363 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 364 365 /* determine unique identifier of task */ 366 if (ctx["id"] == null) 367 ctx["id"] = ( String(ctx["repeat"]) + ":" 368 + String(ctx["protect"]) + ":" 369 + String(ctx["time"]) + ":" 370 + String(ctx["obj"]) + ":" 371 + String(ctx["func"]) + ":" 372 + String(ctx["args"]) ); 373 374 /* optionally protect from duplicate calls */ 375 if (ctx["protect"]) 376 if (typeof this.bucket[ctx["id"]] != "undefined") 377 return this.bucket[ctx["id"]]; 378 379 /* support execution of methods by name and arbitrary scripts */ 380 if (!_isfn(ctx["func"])) { 381 if ( ctx["obj"] != null 382 && typeof ctx["obj"] == "object" 383 && typeof ctx["func"] == "string" 384 && _isfn(ctx["obj"][ctx["func"]])) 385 /* method by name */ 386 ctx["func"] = ctx["obj"][ctx["func"]]; 387 else 388 /* arbitrary script */ 389 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 390 } 391 392 /* pass-through to internal scheduling operation */ 393 ctx["_handle"] = this._schedule(ctx); 394 395 /* store context into bucket of scheduler object */ 396 this.bucket[ctx["id"]] = ctx; 397 398 /* return context */ 399 return ctx; 400 }, 401 402 /* re-schedule a task */ 403 reschedule: function (ctx) { 404 if (typeof ctx == "string") 405 ctx = this.bucket[ctx]; 406 407 /* pass-through to internal scheduling operation */ 408 ctx["_handle"] = this._schedule(ctx); 409 410 /* return context */ 411 return ctx; 412 }, 413 414 /* internal scheduling operation */ 415 _schedule: function (ctx) { 416 /* closure to act as the call trampoline function */ 417 var trampoline = function () { 418 /* jump into function */ 419 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 420 (ctx["func"]).apply(obj, ctx["args"]); 421 422 /* either repeat scheduling and keep in bucket or 423 just stop scheduling and delete from scheduler bucket */ 424 if ( /* not cancelled from inside... */ 425 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 426 && /* ...and repeating requested */ 427 ctx["repeat"]) 428 (ctx["_scheduler"])._schedule(ctx); 429 else 430 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 431 }; 432 433 /* schedule task and return handle */ 434 return setTimeout(trampoline, ctx["time"]); 435 }, 436 437 /* cancel a scheduled task */ 438 cancel: function (ctx) { 439 if (typeof ctx == "string") 440 ctx = this.bucket[ctx]; 441 442 /* cancel scheduled task */ 443 if (typeof ctx == "object") { 444 clearTimeout(ctx["_handle"]); 445 delete this.bucket[ctx["id"]]; 446 } 447 } 448 }; 449 450 /* integrate a global instance of the scheduler into the global jQuery object */ 451 $.extend({ 452 scheduler$: new $.scheduler(), 453 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 454 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 455 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 456 }); 457 458 /* integrate scheduling convinience method into all jQuery objects */ 459 $.fn.extend({ 460 schedule: function () { 461 var a = [ {} ]; 462 for (var i = 0; i < arguments.length; i++) 463 a.push(arguments[i]); 464 return this.each(function () { 465 a[0] = { "id": this, "obj": this }; 466 return $.schedule.apply($, a); 467 }); 468 } 469 }); 470 471 })(jQuery); 472 473 /* 474 ** jquery.schedule.js -- jQuery plugin for scheduled/deferred actions 475 ** Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 476 ** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt> 477 ** 478 ** $LastChangedDate$ 479 ** $LastChangedRevision$ 480 */ 481 482 /* 483 * <div id="button">TEST BUTTON</div> 484 * <div id="test"></div> 485 * 486 * <script type="text/javascript"> 487 * $(document).ready( 488 * function(){ 489 * $('#button').click(function () { 490 * $(this).css("color", "blue").schedule(2000, function (x) { 491 * $(this).css("color", "red"); 492 * $("#test").html("test: x = " + x); 493 * }, 42); 494 * }); 495 * }); 496 * </script> 497 */ 498 499 (function($) { 500 501 /* object constructor */ 502 $.scheduler = function () { 503 this.bucket = {}; 504 return; 505 }; 506 507 /* object methods */ 508 $.scheduler.prototype = { 509 /* schedule a task */ 510 schedule: function () { 511 /* schedule context with default parameters */ 512 var ctx = { 513 "id": null, /* unique identifier of high-level schedule */ 514 "time": 1000, /* time in milliseconds after which the task is run */ 515 "repeat": false, /* whether schedule should be automatically repeated */ 516 "protect": false, /* whether schedule should be protected from double scheduling */ 517 "obj": null, /* function context object ("this") */ 518 "func": function(){}, /* function to call */ 519 "args": [] /* function arguments to pass */ 520 }; 521 522 /* helper function: portable checking whether something is a function */ 523 function _isfn (fn) { 524 return ( 525 !!fn 526 && typeof fn != "string" 527 && typeof fn[0] == "undefined" 528 && RegExp("function", "i").test(fn + "") 529 ); 530 }; 531 532 /* parse arguments into context parameters (part 1/4): 533 detect an override object (special case to support jQuery method) */ 534 var i = 0; 535 var override = false; 536 if (typeof arguments[i] == "object" && arguments.length > 1) { 537 override = true; 538 i++; 539 } 540 541 /* parse arguments into context parameters (part 2/4): 542 support the flexible way of an associated array */ 543 if (typeof arguments[i] == "object") { 544 for (var option in arguments[i]) 545 if (typeof ctx[option] != "undefined") 546 ctx[option] = arguments[i][option]; 547 i++; 548 } 549 550 /* parse arguments into context parameters (part 3/4): 551 support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */ 552 if ( typeof arguments[i] == "number" 553 || ( typeof arguments[i] == "string" 554 && arguments[i].match(RegExp("^[0-9]+[smhdw]$")))) 555 ctx["time"] = arguments[i++]; 556 if (typeof arguments[i] == "boolean") 557 ctx["repeat"] = arguments[i++]; 558 if (typeof arguments[i] == "boolean") 559 ctx["protect"] = arguments[i++]; 560 if ( typeof arguments[i] == "object" 561 && typeof arguments[i+1] == "string" 562 && _isfn(arguments[i][arguments[i+1]])) { 563 ctx["obj"] = arguments[i++]; 564 ctx["func"] = arguments[i++]; 565 } 566 else if ( typeof arguments[i] != "undefined" 567 && ( _isfn(arguments[i]) 568 || typeof arguments[i] == "string")) 569 ctx["func"] = arguments[i++]; 570 while (typeof arguments[i] != "undefined") 571 ctx["args"].push(arguments[i++]); 572 573 /* parse arguments into context parameters (part 4/4): 574 apply parameters from override object */ 575 if (override) { 576 if (typeof arguments[1] == "object") { 577 for (var option in arguments[0]) 578 if ( typeof ctx[option] != "undefined" 579 && typeof arguments[1][option] == "undefined") 580 ctx[option] = arguments[0][option]; 581 } 582 else { 583 for (var option in arguments[0]) 584 if (typeof ctx[option] != "undefined") 585 ctx[option] = arguments[0][option]; 586 } 587 i++; 588 } 589 590 /* annotate context with internals */ 591 ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */ 592 ctx["_handle"] = null; /* internal: unique handle of low-level task */ 593 594 /* determine time value in milliseconds */ 595 var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$")); 596 if (match && match[0] != "undefined" && match[1] != "undefined") 597 ctx["time"] = String(parseInt(match[1]) * 598 { s: 1000, m: 1000*60, h: 1000*60*60, 599 d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]); 600 601 /* determine unique identifier of task */ 602 if (ctx["id"] == null) 603 ctx["id"] = ( String(ctx["repeat"]) + ":" 604 + String(ctx["protect"]) + ":" 605 + String(ctx["time"]) + ":" 606 + String(ctx["obj"]) + ":" 607 + String(ctx["func"]) + ":" 608 + String(ctx["args"]) ); 609 610 /* optionally protect from duplicate calls */ 611 if (ctx["protect"]) 612 if (typeof this.bucket[ctx["id"]] != "undefined") 613 return this.bucket[ctx["id"]]; 614 615 /* support execution of methods by name and arbitrary scripts */ 616 if (!_isfn(ctx["func"])) { 617 if ( ctx["obj"] != null 618 && typeof ctx["obj"] == "object" 619 && typeof ctx["func"] == "string" 620 && _isfn(ctx["obj"][ctx["func"]])) 621 /* method by name */ 622 ctx["func"] = ctx["obj"][ctx["func"]]; 623 else 624 /* arbitrary script */ 625 ctx["func"] = eval("function () { " + ctx["func"] + " }"); 626 } 627 628 /* pass-through to internal scheduling operation */ 629 ctx["_handle"] = this._schedule(ctx); 630 631 /* store context into bucket of scheduler object */ 632 this.bucket[ctx["id"]] = ctx; 633 634 /* return context */ 635 return ctx; 636 }, 637 638 /* re-schedule a task */ 639 reschedule: function (ctx) { 640 if (typeof ctx == "string") 641 ctx = this.bucket[ctx]; 642 643 /* pass-through to internal scheduling operation */ 644 ctx["_handle"] = this._schedule(ctx); 645 646 /* return context */ 647 return ctx; 648 }, 649 650 /* internal scheduling operation */ 651 _schedule: function (ctx) { 652 /* closure to act as the call trampoline function */ 653 var trampoline = function () { 654 /* jump into function */ 655 var obj = (ctx["obj"] != null ? ctx["obj"] : ctx); 656 (ctx["func"]).apply(obj, ctx["args"]); 657 658 /* either repeat scheduling and keep in bucket or 659 just stop scheduling and delete from scheduler bucket */ 660 if ( /* not cancelled from inside... */ 661 typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined" 662 && /* ...and repeating requested */ 663 ctx["repeat"]) 664 (ctx["_scheduler"])._schedule(ctx); 665 else 666 delete (ctx["_scheduler"]).bucket[ctx["id"]]; 667 }; 668 669 /* schedule task and return handle */ 670 return setTimeout(trampoline, ctx["time"]); 671 }, 672 673 /* cancel a scheduled task */ 674 cancel: function (ctx) { 675 if (typeof ctx == "string") 676 ctx = this.bucket[ctx]; 677 678 /* cancel scheduled task */ 679 if (typeof ctx == "object") { 680 clearTimeout(ctx["_handle"]); 681 delete this.bucket[ctx["id"]]; 682 } 683 } 684 }; 685 686 /* integrate a global instance of the scheduler into the global jQuery object */ 687 $.extend({ 688 scheduler$: new $.scheduler(), 689 schedule: function () { return $.scheduler$.schedule.apply ($.scheduler$, arguments) }, 690 reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) }, 691 cancel: function () { return $.scheduler$.cancel.apply ($.scheduler$, arguments) } 692 }); 693 694 /* integrate scheduling convinience method into all jQuery objects */ 695 $.fn.extend({ 696 schedule: function () { 697 var a = [ {} ]; 698 for (var i = 0; i < arguments.length; i++) 699 a.push(arguments[i]); 700 return this.each(function () { 701 a[0] = { "id": this, "obj": this }; 702 return $.schedule.apply($, a); 703 }); 704 } 705 }); 706 707 })(jQuery); 708

Contacte con nosotros
¿No puede leer el artículo? ¡Póngase en contacto con nosotros para obtener una respuesta gratuita! Ayuda gratuita para sitios personales y de pequeñas empresas
Tel: 020-2206-9892
QQ咨询:1025174874
(iii) Correo electrónico: info@361sale.com
Horario de trabajo: de lunes a viernes, de 9:30 a 18:30, días festivos libres
© Declaración de reproducción
Este artículo fue escrito por Harry
EL FIN
Si le gusta, apóyela.
felicitaciones0 compartir (alegrías, beneficios, privilegios, etc.) con los demás
comentarios compra de sofás

Por favor, inicie sesión para enviar un comentario

    Sin comentarios