2012-11-21 50 views
0

我想創建一個具有兩種方法,並回調一個jQuery插件,方法工作,但我不能讓工作的回調,回調的範圍混淆了我,jQuery插件使用方法和全局回調

(function($) 
{ 
    var methods = { 

     create: function(options) { 

      var defaults = { 
       width: 320, 
       height: 240, 
       background: '#000', 
       onstop: function(){} 
      }; 

      var options = $.extend(defaults, options); 

      return $(this).each(function(i) { 

       console.log('create'); 

      }); 

     }, 
     stop: function(options) { 

      var defaults = { 
       onstop: function(){} 
      }; 

      var options = $.extend(defaults, options); 

      return $(this).each(function(i) { 

       console.log('stop'); 
       options.onstop.call(); 

      }); 
     } 
    }; 

    $.fn.myplugin = function(option) { 

     if (methods[option]) { 
      return methods[option].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof option === 'object' || ! option) { 
      return methods.create.apply(this, arguments); 
     } else { 
      $.error('Method ' + option + ' does not exist in jQuery.plugin'); 
     }  
    }; 

})(jQuery); 
所以在

<script>

$(document).ready(function(){ 

    $('#start').click(function(){ 
     $('#myvideo').myplugin('create', { onstop: function(){ console.log('on stop'); } }); 
    }); 

    $('#stop').click(function(){ 
     $('#myvideo').myplugin('stop'); 
    }); 

}); 

基本上看來我要打的onStop:函數(){}全局插件

/* ========更新的代碼(見註釋) ======== */

(function($) 
{ 

    var callbacks = { 
     onready: $.Callbacks("once memory unique").add(function() { 
      //console.log('onready'); 
     }), 
     ondeny: $.Callbacks("unique").add(function() { 
      //console.log('ondeny'); 
     }), 
     onerror: $.Callbacks("unique").add(function() { 
      //console.log('onerror'); 
     }), 
     onstop: $.Callbacks("unique").add(function() { 
      //console.log('onstop'); 
     }) 
    }; 

    var methods = { 

     construct: function(){ 
     }, 
     create: function(options) { 

      var defaults = { 
       width: 320, 
       height: 240, 
       background: '#000', 
       onready: function(){}, 
       onstop: function(){} 
      }; 

      var options = $.extend(defaults, options); 

      return this.each(function(i, elements) { 

       for (var prop in options) { 
        if (prop in callbacks) { 
         callbacks[prop].add(options.prop); 
        } 
       } 

       callbacks.onready.fire(); 

      }); 

     }, 
     stop: function() { 

      return this.each(function(i, elements) { 
       callbacks.onstop.fire(); 
      }); 
     } 
    }; 

    $.fn.myplugin = function(option) { 

     if (methods[option]) { 
      return methods[option].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof option === 'object' || ! option) { 
      return methods.construct.apply(this, arguments); 
     } else { 
      $.error('Method ' + option + ' does not exist in jQuery.plugin'); 
     }  
    }; 

})(jQuery); 
+0

回調應該由插件的用戶設置,不是嗎? – Bergi

+0

我想讓他們作爲選項訪問 – user780756

回答

0

我用globalOptions變量來存儲插件初始化選項全球,

這裏的兩個文件來測試的東西出來,作爲stencyl使用。

jquery.plugin.js (函數($){

var pluginName = 'myPlugin'; 

    var globalOptions = ''; 

    var methods = { 

     create: function(options) { 

      var defaults = { 
       backgroundColor: '#000', 
       color: '#fff', 
       oncreate: function(){}, 
       onchangecolor: function(){}, 
       onloadpage: function(page){} 
      }; 

      globalOptions = $.extend(defaults, options); 

      return $(this).each(function(i, elements) { 

       $(elements).data('globalOptions', globalOptions); 

       globalOptions.oncreate(); 

      }); 

     }, 
     changeColor: function(){ 

      return $(this).each(function(i, elements) { 

       globalOptions = $(elements).data('globalOptions'); 
       if (!globalOptions) { $.error('Error: ' + pluginName + ' has not been initialized yet'); return false; } 

       $(this).css('background-color', globalOptions.backgroundColor); 
       $(this).css('color', globalOptions.color); 

       globalOptions.onchangecolor(); 

      }); 
     }, 
     loadPage: function(options){ 

      return $(this).each(function(i, elements) { 

       globalOptions = $(elements).data('globalOptions'); 
       if (!globalOptions) { $.error('Error: ' + pluginName + ' has not been initialized yet'); return false; } 

       globalOptions.onloadpage(options.page); 
       location.href = options.page; 

      }); 
     } 

    }; 

    $.fn.myPlugin = function(option) { 

     if (methods[option]) { 
      return methods[option].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof option === 'object' || ! option) { 
      return methods.create.apply(this, arguments); 
     } else { 
      $.error('Error: Method "' + option + '" does not exist in ' + pluginName); 
      return false; 
     }  
    }; 

})(jQuery); 

的index.html

<!doctype html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Example</title> 
     <script src="jquery.min.js"></script> 
     <script src="jquery.plugin.js"></script> 
     <script> 
$(document).ready(function() { 

    var myElement = $('.container').myPlugin({ 
     color: '#555', 
     backgroundColor: '#ddd', 
     oncreate: function(){ 
      console.log('Callback: create'); 
     }, 
     onchangecolor: function(){ 
      console.log('Callback: onchangecolor'); 
     }, 
     onloadpage: function(page){ 
      console.log('Callback: onloadpage = '+page); 
     } 
    }); 

    $('.color').click(function(event){ 
     myElement.myPlugin('changeColor'); 
    }); 

    $('.page').click(function(event){ 
     myElement.myPlugin('loadPage', { page: '#test' }); 
    }); 

}); 
     </script> 
    </head> 
    <body> 
     <div class="container"> 
      <button class="color">changeColor</button> <button class="page">loadPage</button> 
     </div> 
    </body> 
</html> 

如果任何人有這樣做的更好的方法和方式來增加 「私人」方法,請分享:)

1

我建議使用一些羽翼豐滿jQuery.Callbacks對象:

var callbacks = { 
    onready: $.Callbacks("once memory unique").add(function() { 
     console.log('ready'); 
    }), 
    ondeny: $.Callbacks("unique").add(function() { 
     console.log('deny'); 
    }), 
    onerror: $.Callbacks("unique").add(function() { 
     console.log('error'); 
    }), 
    onstop: $.Callbacks("unique").add(function() { 
     console.log('stop'); 
    }) 
}; 

現在,得到一些新的選擇時,你可以做

for (var prop in options) 
    if (prop in callbacks) 
     callbacks[prop].add(options[prop]); 

並調用它們只是做

callbacks.onstop.fire(/*args*/); 

或者,如果您關心回調的上下文,請使用fireWith

+0

這似乎起初工作,但我忘了我有另一個console.log(),我很好奇什麼是「一次記憶獨特」和「獨特」等等呢? 我添加了回調,如onready:$ .Callbacks(「onready」)。add(function(){console.log('onready');}), 我也將它們添加爲'create'方法中的選項,但他們目前似乎並未開火。仍然搞亂它... – user780756

+0

好吧,我發現了「獨特」等。 更新了我現在所擁有的代碼,仍然回調不會觸發。 \t'$( '#開始')點擊(函數(){ \t \t $( '#MyVideo網站')爲myplugin( '創造',{ \t \t \t onready:。函數(){的console.log( '!on ready!');}, \t \t \t onstop:function(){console.log('!on stop!「); } \t \t}); \t});' 這不記錄 – user780756

+0

糟糕,修正了在回調中添加函數的循環中的一個小問題。順便說一下,我不確定是否要爲應用了插件的每個元素分開回調,因爲您無法使用靜態的'callbacks'對象。在'.each'循環中添加回調也是無用的,因爲它們只會在沒有'unique'標誌的情況下再次添加。 – Bergi