2016-01-15 111 views
5

我創建了一個簡單的jQuery擴展(這是我的第一個擴展)。創建jQuery擴展。範圍問題

(function($){ 
    var MyClass = function(opt){ 
    //.. 
    }; 
    //one of the methods of my extension 
    $.fn.myExtension = function(opt){ 
    this._ext = new MyClass(opt); 
    return this; 
    }; 
    $.fn.myExtensionOtherMethod = function(){ 
    if(this._ext){ 
     //do something .. 
    } 
    return this; 
    }; 
}(jQuery)); 

//using .. 
$(document).ready(function(){ 
    $('#selector').myExtension({ 
    //options .. 
    }); 
    $('#selector').myExtensionOtherMethod(); 
}); 

當調用方法$('#selector').myExtensionOtherMethod();this不包含this._ext變量。我知道這是其他範圍,但我知道有兩種方法訪問該變量的方法。我可以做到嗎?

+0

您的最終目標是什麼?您希望爲每個匹配選擇器的元素創建一個myClass的新實例或選項,還是您的擴展將使用的myClass的單​​個實例,無論選擇哪個元素? –

+0

您每次使用'$('#selector')'時都會創建一個不同的對象。 – charlietfl

+1

你想完成什麼?使用'data()'可能會有所幫助 – charlietfl

回答

2

這是不是一個真正的範圍問題。這是因爲jQuery原型$.fn爲您提供了一個jQuery對象this。即使您每次將新的jQuery對象設置爲上下文時都選擇相同的元素,以便屬性消失。您可以將該屬性放在DOM元素上並實現您想要的結果。

(function($) { 
    var MyClass = function(opt) {}; 
    //one of the methods of my extension 
    $.fn.myExtension = function(opt) { 
     this[0]._ext = new MyClass(opt); 
     return this; 
    }; 
    $.fn.myExtensionOtherMethod = function() { 
     if (this[0]._ext) { 
      //do something .. 
     } 
     return this; 
    }; 
}(jQuery)); 

//using .. 
$(document).ready(function() { 
    $('#selector').myExtension({ 
     //options .. 
    }); 
    $('#selector').myExtensionOtherMethod(); 
}); 

這只是上面的一個簡單例子。如果你的選擇器找到多個元素,你應該循環它們。但是我只抓住了第一個索引,因爲你是通過ID選擇的。

小提琴:https://jsfiddle.net/AtheistP3ace/gd1ehk0d/

正如@charlietfl上面提到的,我同意這一點評論。高興地解釋爲什麼你做的沒有工作,但可能有更好的方法來實現你正在尋找的東西。