From 63c784bd2152ebd80dbe3f0a00e1f4fab3989d45 Mon Sep 17 00:00:00 2001 From: Eric Lien Date: Thu, 30 May 2013 02:53:24 -0700 Subject: [PATCH 1/8] I can't believe it works, but I managed to come up with a new jquery plugin pattern than I don't dispise, using actual prototypes and decent javascript OOP :D --- jquery.eventually.js | 75 +++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/jquery.eventually.js b/jquery.eventually.js index 71108a9..aeeb946 100755 --- a/jquery.eventually.js +++ b/jquery.eventually.js @@ -1,14 +1,11 @@ (function($) { - var methods = { - init : function(){ - return; - }, - before : before, - on : on, - after : after, - trigger : trigger, - }; + function Eventually(methodOrOptions){ + this.version = "1.0.3"; + this.plugin_name = "jQuery.eventually"; + } + + Eventually.prototype.init = function(){ return true; } /** * Private function which actually registers events and a callback to eventually @@ -18,12 +15,14 @@ * @param object data Data to bind pass to event * @param function handler Function to handle the event */ - function registerEvent(jqselections, orig_event, event, data, handler){ - var data = data || {}; + Eventually.prototype.registerEventMY = function(orig_event, event, data, handler){ + var data = data || {}; var handler = handler || function(data){ return; }; //loop over selections, binding handler to event - jqselections.each( + this.each( function(){ + //NOTE!: 'this' refers to a particular dom element in this scope! + //bind handler on our event $(this).on(event, data, handler); @@ -46,10 +45,11 @@ /** * Creates and runs jQuery events on selections */ - function triggerEvent(jqselections, eventname, eventObj){ + Eventually.prototype.triggerEventMY = function(eventname, eventObj){ var e = jQuery.Event(eventname); e.original_event = eventObj; - jqselections.trigger(e); + //running jquerys trigger method on selections! + this.trigger(e); return e; } @@ -59,8 +59,8 @@ * @param object data Data that will be available under event.data property in listener. * @param function handler Function to call when event is triggered that will handle the event */ - function before(event, data, handler) { - registerEvent(this, event, 'befor'+event, data, handler); + Eventually.prototype.beforeMY = function(event, data, handler) { + this.registerEventMY(event, 'before_'+event, data, handler); } /** @@ -69,8 +69,8 @@ * @param object data Data that will be available under event.data property in listener. * @param function handler Function to call when event is triggered that will handle the event */ - function on(event, data, handler) { - registerEvent(this, event, 'on_'+event, data, handler); + Eventually.prototype.onMY = function(event, data, handler) { + this.registerEventMY(event, 'on_'+event, data, handler); } /** @@ -79,8 +79,8 @@ * @param object data Data that will be available under event.data property in listener. * @param function handler Function to call when event is triggered that will handle the event */ - function after(event, data, handler) { - registerEvent(this, event, 'after_'+event, data, handler); + Eventually.prototype.afterMY = function(event, data, handler) { + this.registerEventMY(event, 'after_'+event, data, handler); } /** @@ -91,16 +91,16 @@ * @return bool True if all before and on listeners fired and didn't stop propagation, false otherwise. * This will cause events to stop propagating on actual dom events! */ - function trigger(event, eventObj){ + Eventually.prototype.triggerMY = function(event, eventObj){ var eventObj = eventObj || {}; //create befor and run it - var bevent = triggerEvent(this, 'befor'+event, eventObj); - //if befor was not killed, create and run the on_ + var bevent = this.triggerEventMY('before_'+event, eventObj); + //if before_ was not killed, create and run the on_ if(!bevent.isDefaultPrevented() && !bevent.isPropagationStopped() && !bevent.isImmediatePropagationStopped()){ - var oevent = triggerEvent(this, 'on_'+event, eventObj); + var oevent = this.triggerEventMY('on_'+event, eventObj); //if on_ was not killed, create and run the after_ if(!oevent.isDefaultPrevented() && !oevent.isPropagationStopped() && !oevent.isImmediatePropagationStopped()){ - var aevent = triggerEvent(this, 'after_'+event, eventObj); + var aevent = this.triggerEventMY('after_'+event, eventObj); return true; } } @@ -115,16 +115,27 @@ return false; } - $.fn.eventually = function(methodOrOptions) { - this.version = '1.0.2'; + $.fn.eventually = function(methodOrOptions){ + //extend plugin function with new instance of Object + $.extend(this, new Eventually()); + //possibly do some setup, here, if needed + + //alias and/or register callable methods + this.public = { + 'on': this.onMY, + 'before': this.beforeMY, + 'after': this.afterMY, + 'trigger': this.triggerMY, + }; - if ( methods[methodOrOptions] ) { - return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); + //run public methods or init, or report error (never ever touch any of this!) + if( this.public[ methodOrOptions ] ){ + return this.public[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); }else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ){ // Default to "init" - return methods.init.apply( this, arguments ); + return this.init.apply( this, arguments ); }else{ - $.error( 'Method ' + method + ' does not exist on jQuery.eventually' ); + $.error( 'Method ' + methodOrOptions + ' does not exist on '+this.plugin_name ); } - } + } }(jQuery)); \ No newline at end of file From 4e9be64d52988ef4a159986b2e01f5026dbf4ff8 Mon Sep 17 00:00:00 2001 From: Eric Lien Date: Thu, 30 May 2013 02:55:49 -0700 Subject: [PATCH 2/8] fix versions before merge with master --- eventually.jquery.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eventually.jquery.json b/eventually.jquery.json index 86f078d..2c1c292 100755 --- a/eventually.jquery.json +++ b/eventually.jquery.json @@ -7,7 +7,7 @@ "events", "pub-sub" ], - "version": "1.0.2", + "version": "1.0.3", "author": { "name": "Eric Lien", "email": "liener.meat@gmail.com" diff --git a/package.json b/package.json index 0741d93..c0e203a 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-eventually", "title": "jQuery Event Library ", "description": "Extends the jquery event system to make before and after events automatic and simple", - "version": "1.0.2", + "version": "1.0.3", "homepage": "https://github.com/lienmeat/jquery-eventually", "author": { "name": "Eric Lien", From 9ce07a78118b0b56b7a90e1bdddaf54f34ac1442 Mon Sep 17 00:00:00 2001 From: lienmeat Date: Thu, 30 May 2013 11:17:42 -0700 Subject: [PATCH 3/8] finished refining what I believe to be the best possible jquery plugin template --- jquery.eventually.js | 78 ++++++++++++++++++++++++-------------------- test/test.js | 5 ++- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/jquery.eventually.js b/jquery.eventually.js index aeeb946..1cb5ff1 100755 --- a/jquery.eventually.js +++ b/jquery.eventually.js @@ -1,11 +1,25 @@ (function($) { - function Eventually(methodOrOptions){ - this.version = "1.0.3"; - this.plugin_name = "jQuery.eventually"; + function Eventually(jquery, config){ + //version information + this.version = "1.0.4"; + //name of $.fn. (for own use, and also for $.fn.) + this.plugin_name = "eventually"; + //instance of jquery passed to $.fn. + this.jquery = jquery; + //config passed to $.fn. + this.config = config; + + //register/alias methods $.fn. is allowed to access (init is a given!) + this.public_methods = { + 'on': this.on, + 'before': this.before, + 'after': this.after, + 'trigger': this.trigger, + }; } - Eventually.prototype.init = function(){ return true; } + Eventually.prototype.init = function(){ return this.jquery; } /** * Private function which actually registers events and a callback to eventually @@ -15,11 +29,11 @@ * @param object data Data to bind pass to event * @param function handler Function to handle the event */ - Eventually.prototype.registerEventMY = function(orig_event, event, data, handler){ + Eventually.prototype.registerEvent = function(orig_event, event, data, handler){ var data = data || {}; var handler = handler || function(data){ return; }; //loop over selections, binding handler to event - this.each( + this.jquery.each( function(){ //NOTE!: 'this' refers to a particular dom element in this scope! @@ -45,11 +59,11 @@ /** * Creates and runs jQuery events on selections */ - Eventually.prototype.triggerEventMY = function(eventname, eventObj){ + Eventually.prototype.triggerEvent = function(eventname, eventObj){ var e = jQuery.Event(eventname); e.original_event = eventObj; //running jquerys trigger method on selections! - this.trigger(e); + this.jquery.trigger(e); return e; } @@ -59,8 +73,9 @@ * @param object data Data that will be available under event.data property in listener. * @param function handler Function to call when event is triggered that will handle the event */ - Eventually.prototype.beforeMY = function(event, data, handler) { - this.registerEventMY(event, 'before_'+event, data, handler); + Eventually.prototype.before = function(event, data, handler) { + this.registerEvent(event, 'before_'+event, data, handler); + return this.jquery; } /** @@ -69,8 +84,9 @@ * @param object data Data that will be available under event.data property in listener. * @param function handler Function to call when event is triggered that will handle the event */ - Eventually.prototype.onMY = function(event, data, handler) { - this.registerEventMY(event, 'on_'+event, data, handler); + Eventually.prototype.on = function(event, data, handler) { + this.registerEvent(event, 'on_'+event, data, handler); + return this.jquery; } /** @@ -79,8 +95,9 @@ * @param object data Data that will be available under event.data property in listener. * @param function handler Function to call when event is triggered that will handle the event */ - Eventually.prototype.afterMY = function(event, data, handler) { - this.registerEventMY(event, 'after_'+event, data, handler); + Eventually.prototype.after = function(event, data, handler) { + this.registerEvent(event, 'after_'+event, data, handler); + return this.jquery; } /** @@ -91,16 +108,16 @@ * @return bool True if all before and on listeners fired and didn't stop propagation, false otherwise. * This will cause events to stop propagating on actual dom events! */ - Eventually.prototype.triggerMY = function(event, eventObj){ + Eventually.prototype.trigger = function(event, eventObj){ var eventObj = eventObj || {}; //create befor and run it - var bevent = this.triggerEventMY('before_'+event, eventObj); + var bevent = this.triggerEvent('before_'+event, eventObj); //if before_ was not killed, create and run the on_ if(!bevent.isDefaultPrevented() && !bevent.isPropagationStopped() && !bevent.isImmediatePropagationStopped()){ - var oevent = this.triggerEventMY('on_'+event, eventObj); + var oevent = this.triggerEvent('on_'+event, eventObj); //if on_ was not killed, create and run the after_ if(!oevent.isDefaultPrevented() && !oevent.isPropagationStopped() && !oevent.isImmediatePropagationStopped()){ - var aevent = this.triggerEventMY('after_'+event, eventObj); + var aevent = this.triggerEvent('after_'+event, eventObj); return true; } } @@ -112,30 +129,21 @@ eventObj.preventDefault(); } //return false. This trigger did not complete cleanly. - return false; + return false; } $.fn.eventually = function(methodOrOptions){ - //extend plugin function with new instance of Object - $.extend(this, new Eventually()); - //possibly do some setup, here, if needed - - //alias and/or register callable methods - this.public = { - 'on': this.onMY, - 'before': this.beforeMY, - 'after': this.afterMY, - 'trigger': this.triggerMY, - }; + //Instantiate plugin object with instance of jquery as argument, so it has it, and any config options it might need + var obj = new Eventually(this, methodOrOptions); - //run public methods or init, or report error (never ever touch any of this!) - if( this.public[ methodOrOptions ] ){ - return this.public[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); + //run public methods or init, or report error (Please never touch any of this! It shouldn't need to change!) + if( obj.public_methods[ methodOrOptions ] ){ + return obj.public_methods[ methodOrOptions ].apply( obj, Array.prototype.slice.call( arguments, 1 )); }else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ){ // Default to "init" - return this.init.apply( this, arguments ); + return obj.init.apply( obj, arguments ); }else{ - $.error( 'Method ' + methodOrOptions + ' does not exist on '+this.plugin_name ); + $.error( 'Method ' + methodOrOptions + ' does not exist on '+obj.plugin_name ); } } }(jQuery)); \ No newline at end of file diff --git a/test/test.js b/test/test.js index 4980d28..81ba11e 100755 --- a/test/test.js +++ b/test/test.js @@ -1,9 +1,8 @@ module("eventually"); test("Constructor", function() { - var v1 = $(window).eventually(); - var v2 = $(window).eventually(); - equal( v1, v2, "Calling eventually() multiple times must return the same thing."); + var v1 = $(document).eventually(); + ok( v1.jquery, "Calling eventually() returns jquery instance."); }); test("Basic on() and trigger() test", function() { From 4f84ffaaecd8712dcac936c3150ee88e7e5efdde Mon Sep 17 00:00:00 2001 From: lienmeat Date: Thu, 30 May 2013 11:20:14 -0700 Subject: [PATCH 4/8] added version info cause I forgot on last commit --- eventually.jquery.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eventually.jquery.json b/eventually.jquery.json index 2c1c292..7b3f7f0 100755 --- a/eventually.jquery.json +++ b/eventually.jquery.json @@ -7,7 +7,7 @@ "events", "pub-sub" ], - "version": "1.0.3", + "version": "1.0.4", "author": { "name": "Eric Lien", "email": "liener.meat@gmail.com" diff --git a/package.json b/package.json index c0e203a..e5906a0 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-eventually", "title": "jQuery Event Library ", "description": "Extends the jquery event system to make before and after events automatic and simple", - "version": "1.0.3", + "version": "1.0.4", "homepage": "https://github.com/lienmeat/jquery-eventually", "author": { "name": "Eric Lien", From e0b05910b9f858a0e5f9ced1c6be3337dc119d31 Mon Sep 17 00:00:00 2001 From: Eric Lien Date: Fri, 31 May 2013 10:36:22 -0700 Subject: [PATCH 5/8] Remove link in test/index.html, don't want it. --- test/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.html b/test/index.html index b58afea..15e5c32 100755 --- a/test/index.html +++ b/test/index.html @@ -10,7 +10,7 @@

- jQuery Eventually Plugin Test Suite + jQuery Eventually Plugin Test Suite jQuery 1.7.2 jQuery 1.8.3 From f1d28c22d87c79c41a050e7bc2b811db3c666258 Mon Sep 17 00:00:00 2001 From: Eric Lien Date: Fri, 31 May 2013 10:39:34 -0700 Subject: [PATCH 6/8] Change versions --- eventually.jquery.json | 2 +- jquery.eventually.js | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eventually.jquery.json b/eventually.jquery.json index 7b3f7f0..a440ecb 100755 --- a/eventually.jquery.json +++ b/eventually.jquery.json @@ -7,7 +7,7 @@ "events", "pub-sub" ], - "version": "1.0.4", + "version": "1.0.5", "author": { "name": "Eric Lien", "email": "liener.meat@gmail.com" diff --git a/jquery.eventually.js b/jquery.eventually.js index 1cb5ff1..5280641 100755 --- a/jquery.eventually.js +++ b/jquery.eventually.js @@ -2,7 +2,7 @@ function Eventually(jquery, config){ //version information - this.version = "1.0.4"; + this.version = "1.0.5"; //name of $.fn. (for own use, and also for $.fn.) this.plugin_name = "eventually"; //instance of jquery passed to $.fn. diff --git a/package.json b/package.json index e5906a0..025709e 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-eventually", "title": "jQuery Event Library ", "description": "Extends the jquery event system to make before and after events automatic and simple", - "version": "1.0.4", + "version": "1.0.5", "homepage": "https://github.com/lienmeat/jquery-eventually", "author": { "name": "Eric Lien", From 628151764e2fdd49637ecf5f34c0cf6d182deaab Mon Sep 17 00:00:00 2001 From: Eric Lien Date: Fri, 31 May 2013 11:21:00 -0700 Subject: [PATCH 7/8] fixed bug where too many events were being triggered, sometimes multiple times --- jquery.eventually.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jquery.eventually.js b/jquery.eventually.js index 5280641..5695463 100755 --- a/jquery.eventually.js +++ b/jquery.eventually.js @@ -44,9 +44,9 @@ //on this dom element if(!this.eventually_listeners){ this.eventually_listeners = {}; - }if(!this.eventually_listeners[event]){ + }if(!this.eventually_listeners[orig_event]){ //no eventually listener for this event and element yet, - this.eventually_listeners[event] = true; + this.eventually_listeners[orig_event] = true; //create one $(this).on(orig_event, function(e){ $(this).eventually('trigger', orig_event, e); From 8bf7e9478879a5ccff2197d6f003aba0691209c6 Mon Sep 17 00:00:00 2001 From: Eric Lien Date: Fri, 31 May 2013 11:26:05 -0700 Subject: [PATCH 8/8] fix version numbers after bugfix on duplicate events firing --- eventually.jquery.json | 2 +- jquery.eventually.js | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eventually.jquery.json b/eventually.jquery.json index a440ecb..b34aa42 100755 --- a/eventually.jquery.json +++ b/eventually.jquery.json @@ -7,7 +7,7 @@ "events", "pub-sub" ], - "version": "1.0.5", + "version": "1.0.6", "author": { "name": "Eric Lien", "email": "liener.meat@gmail.com" diff --git a/jquery.eventually.js b/jquery.eventually.js index 5695463..7ac064f 100755 --- a/jquery.eventually.js +++ b/jquery.eventually.js @@ -2,7 +2,7 @@ function Eventually(jquery, config){ //version information - this.version = "1.0.5"; + this.version = "1.0.6"; //name of $.fn. (for own use, and also for $.fn.) this.plugin_name = "eventually"; //instance of jquery passed to $.fn. diff --git a/package.json b/package.json index 025709e..51b1ad9 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-eventually", "title": "jQuery Event Library ", "description": "Extends the jquery event system to make before and after events automatic and simple", - "version": "1.0.5", + "version": "1.0.6", "homepage": "https://github.com/lienmeat/jquery-eventually", "author": { "name": "Eric Lien",