2016-01-15 132 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上面提到的,我同意这一点评论。高兴地解释为什么你做的没有工作,但可能有更好的方法来实现你正在寻找的东西。