$.fn.createPromiseEvent

http://stackoverflow.com/questions/5226376/jquery-special-event-with-deferred-is-firing-twice-on-initial-trigger

by Benjamin Lupton

HTML

<button id="first">first</button>
<button id="promise">promise</button>
<button id="second">second</button>
<button id="trigger">trigger</button>
<button id="third">third</button>
<div id="result"></div>

JavaScript

(function(window,undefined){

    /**
     * Creates a Promise Event
     * For instance onDomReady is a promise event, all events bound to it after it's initial trigger are fired immediately
     * @version 1.0.0
     * @date March 08, 2011
     * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
     * @author Benjamin Arthur Lupton {@link http://balupton.com}
     * @copyright 2011 Benjamin Arthur Lupton {@link http://balupton.com}
     * @license MIT License {@link http://creativecommons.org/licenses/MIT/}
     * @param {String} eventName
     * @return {jQuery}
     */
    $.fn.firedPromiseEvent = $.fn.firedPromiseEvent || function(eventName){
        return $(this).data('defer-'+eventName+'-resolved') ? true : false;
    };

    /**
     * Creates a Promise Event
     * For instance onDomReady is a promise event, all events bound to it after it's initial trigger are fired immediately
     * @version 1.0.0
     * @date March 08, 2011
     * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
     * @author Benjamin Arthur Lupton {@link http://balupton.com}
     * @copyright 2011 Benjamin Arthur Lupton {@link http://balupton.com}
     * @license MIT License {@link http://creativecommons.org/licenses/MIT/}
     * @param {String} eventName
     * @return {jQuery}
     */
    $.fn.createPromiseEvent = $.fn.createPromiseEvent || function(eventName){
        // Prepare
        var $this = $(this);

        // Check
        if ( typeof $this.data('defer-'+eventName+'-resolved') !== 'undefined' ) {
            // Promise event already created
            return $this;
        }
        $this.data('defer-'+eventName+'-resolved',false);

        // Handle
        var events = $.fn.createPromiseEvent.events = $.fn.createPromiseEvent.events || {
            // Bind the event
            bind: function(callback){
                var $this = $(this);
                   return $this.bind(eventName,callback);
           ...