假设我有这个($ = jquery):
$.fn.my_function = function() {
function foo()
{
//do something
};
function bar()
{
//do something other
};
}
我使用$('.my_class').my_function();
现在,我需要在回调某些事件时调用foo和bar。
我怎么称呼他们?
答案 0 :(得分:7)
你必须以某种方式将它们暴露给“外部世界”。目前,它们仅在my_function
内可见,因此您无法从其他任何地方拨打电话。
最天真的解决方法是:
var foo;
var bar;
$.fn.my_function = function() {
foo = function() {
//stuff
};
bar = function() {
//stuff
};
};
可以应用相同的概念将引用放在任何对您的使用有意义的地方。
答案 1 :(得分:7)
您似乎正在尝试构建一个jQuery插件。您应该将插件的方法约束到私有范围,并且还应该通过jQuery选择器迭代给插件的元素,并使用jQuery的“each”返回它们以保留链接能力:
// wrap the plugin code inside an anonymous function
// to keep the global namespace clean
(function($){
$.fn.my_function = function() {
return this.each(function(){
function foo() {
// stuff here
}
function bar() {
// stuff here
}
// now you can use your foo and bar which ever way you want
// inside the plugin
$(this).focus(function(event){
// do some stuff
...
// call the function defined previously in the plugin code
foo();
});
$(this).blur(function(event){
// do some stuff
...
// call the function defined previously in the plugin code
bar();
});
});
};
})(jQuery);
您可能想看看这些文章,了解有关jQuery插件开发的更多信息: http://www.learningjquery.com/2007/10/a-plugin-development-pattern
http://docs.jquery.com/Plugins/Authoring
但是,如果你只做一些“实用程序”类型的函数,你可以将它们绑定到jQuery命名空间,如下所示:
$.foo = function(){
// do stuff
};
$.bar = function(){
// do stuff
};
答案 2 :(得分:2)
HTML
<p id="hello">aaa</p>
<p id="hola">sss</p>
<div id='result'></div>
JS
$.fn.my_function = function()
{
this.foo = function(xref) {
$("#result").append("<div>"+xref+".foo " + $(this).html() +"</div>");
};
this.bar = function(xref) {
$("#result").append("<div>"+xref+".bar " + $(this).html() +"</div>");
};
return this;
};
var ee1 = $("#hello").my_function();
var ee2 = $("#hola").my_function();
ee1.bar("ee1");
ee2.bar("ee2");
$("#hello").html("hello hellboy");
ee1.foo("ee1");
ee2.foo("ee2");
$("#result").append("<hr />");
ee1.bar("ee1");
ee2.bar("ee2");
$("#hola").html("hola hellboy");
ee1.foo("ee1");
ee2.foo("ee2");
答案 3 :(得分:0)
另一种处理这种情况的方法,如果你想从其他地方调用你的插件方法(可能是一个不同的文件等)很有用,那就是把插件逻辑写成一个类,然后在里面实例化那个类jQuery插件,将实例存储在$.data
中。
(function($) {
var Animal = function(el, settings) {
this.$el = $(el);
this.settings = settings;
this.foo();
};
Animal.prototype.eat = function() {
// Do stuff
if (this.settings.isVegetarian) {
console.log('I eat plants');
} else {
console.log('I eat meat');
}
};
Animal.prototype.play = function() {
// Do other stuff but return this.$el so you can maintain chain
return this.$el;
};
// Create jQuery plugin
var pluginName = 'myPlugin';
$.fn[pluginName] = function(options) {
// Defaults
var settings = $.extend({
isVegetarian: true,
}, options );
return this.each(function() {
if (!$.data(this, pluginName)) {
// Store plugin instace with element (this),
// so public methods can be called later:
// $('.el').data('myPlugin').eat();
$.data(this, pluginName, new Animal(this, settings));
}
});
};
}(jQuery));
然后当你想要调用你的插件时,它就像正常一样:
$('.dog).myPlugin();
并调用方法:
$('.dog').data('myPlugin').eat();