2012-05-13 99 views
2

我想的以下功能:方法自動激活

$('.aclass').MyPluginInit() 
$('.aclass').SomeMethodOfMine() 

但我們如何從第一到第二行?在理想的世界中,我將能夠捕獲第2行中生成的異常(當我試圖調用一個不存在的方法時),循環遍歷$('.aclass')表示的對象集合,並查看屬性(例如,$this),其中包含所述方法,並通過致電.MyPluginInit()放置在那裏。然後我會調用這個方法。

問題是我無法捕捉異常並找到回到它所在的對象的方式。 window.onerror的處理程序會告訴我產生該異常的網址和行號,但我無法將其綁定到對象。

關於我還能如何完成死亡的提升(或者在這種情況下從未出生)的任何想法?

  • ekkis

附:我的確讀過Autovivification and Javascript,但我所要求的有點不同。

+1

很難理解你的意思。你可以編輯它,或繪製圖表? –

回答

0

這是我想出了:把下面的功能在某些庫你包括包括使用它的插件前:

function PluginMaker() { 
    var plugin = url2fn($('script:last').attr('src')); 
    $.fn[plugin] = function (opts) { 
     opts = $.extend(true, {}, $[plugin], opts); 
     for (fn in opts.fx) this[fn] = fxmk(fn); // auto-vivification of methods 
     this.each(function() { if (!this['$' + plugin]) this['$' + plugin] = opts; }); 
     opts.init(opts); // plugin initialisation 
     this.init(opts); // per-object initialisation 
     return this; 
    }; 
    function fxmk(nm) { 
     return function() { 
      var args = arguments; 
      this.each(function() { 
       this['$' + plugin].fx[nm].apply(this, args); 
      }); 
      return this; 
     }; 
    } 
    return plugin; 
} 

然後定義你的插件像這樣:

// -- myplugin.js --------------------------------------------------------------- 

(function ($) { 
    $[PluginMaker()] = { 
     // whatever state data you want to keep for your plugin 
     fx: { 
      MyMethod1: function() { /* within these methods */ }, 
      MyMethod2: function (msg) { /* this refers to the HTML element */ }, 
      // whatever other methods you want to define 
      init: function (opts) { 
       // used for per-element initialisation 
      } 
     }, 
     init: function(opts) { 
      // used for plugin initialisation (one time) 
     } 
    }; 
});  

然後,包括你可以做的插件:

$('.class').MyPlugin({ /* whatever options */ }); 
$('.class').MyMethod1(); 

甚至:

$('#someId').MyMethod2(); 
0
// define your initializer 
function MyPluginInit() { 
    var e; 
    for (e in this) { 

    // give this object the method 
    this[e].SomeMethodOfMine = function() { 
     console.log("Wee!"); 
    } 
    } 
} 

// call init using the array-ish thing returned by jQuery as `this` 
MyPluginInit.call($(".aclass")); 

// to call the method, you need to refer to an *element* in the array 
// this is because we only gave the method to the elements, not to the array itself 
$(".aclass")[0].SomeMethodOfMine(); 

我想不出一個很好的方法來做到這一點,但是這個代碼是有效的,並且不需要任何奇怪的全局異常處理。或者,你是否考慮過修改數組元素的原型?然後,只需要在方法中包含一些邏輯來確定如何在元素未被「初始化」時採取行動。

通常我會建議將SomeMethodOfMine添加到由jQuery返回的對象的原型,但結果是Object,所以它可能不是一個好主意。

+0

感謝您的回覆。亞,不是那裏...必須解除引用並不美觀,不,將它添加到Object原型並不是一個好主意。我確實解決了它。將分開發布,因此我可以將其標記爲答案 – ekkis