好的,这是我第一次尝试创建一个jQuery插件,所以我目前正在修改教程。
到目前为止我已经
了(function($)
{
$.tippedOff = function(selector, settings)
{
var config = {
'top':0,
'left':0,
'wait':3000
};
if(settings){$.extend(config, settings);}
var $elem = $(selector);
if($elem.length > 0)
{
$elem.each(function()
{
$(this).css({"color":"#F00"});
})
}
return this;
};
})(jQuery);
适用于更改所提供元素的文本颜色。然而。我想为插件生效的元素添加功能。例如悬停或点击事件。但是我现在无法理解这个想法,因为selector
可以是任何东西。所以它并不像我可以通过普通的jQuery方法那样硬编码某些东西。
那么,在那之后,我如何在渲染之后将这种类型的功能添加到事物中?
答案 0 :(得分:20)
创建插件时,很容易使事情过于复杂,所以尽量保持简洁。
我向您提供了tippedOff
插件的 两个 示例。这也是两个插件的jsfiddle demo。
第一个按原样使用原始代码(无意义的更改):
$.tippedOff = function(selector, settings)
{
var config = {
'top':0,
'left':0,
'wait':3000
};
if(settings){$.extend(config, settings);}
var $elem = $(selector);
if($elem.length > 0)
{
$elem.each(function()
{
//bind mouseenter, mouseleave, click event
$(this).css({"color":"#F00"})
.mouseenter(function(){
$(this).css({"color":"green"});
})
.mouseleave(function(){
$(this).css({"color":"#F00"});
})
.click(function(){
$(this).html('clicked');
});
})
}
return this;
};
然而,这个是基于您的原始代码。基本上,我使用these tips重建了原始代码。这就是我亲自去做的事情。我还向您提供了以下细分所做的更改。 (重大改变):
$.fn.tippedOff = function(settings) {
var config = $.extend( {
'top':0,
'left':0,
'wait':3000,
'color': 'orange',
'hoverColor': 'blue'
}, settings);
return this.each(function() {
$this = $(this);
$this.css({ 'color': config.color})
.mouseenter(function(){
$this.css({ 'color': config.hoverColor });
})
.mouseleave(function(){
$this.css({ 'color': config.color });
})
.click(function(){
$this.html('clicked');
});
});
}
原始代码:
$.tippedOff = function(selector, settings) {
<强> 更改: 强>
$.fn.tippedOff = function( settings ) {
<强>注释:强>
$.tippedOff
和$.fn.tippedOff
之间的差异非常大!将插件添加到$.fn
命名空间而不是$
命名空间将阻止您必须提供selector
并简化生活。
我个人喜欢this answer,其中@Chad声明:
我遵循的经验法则是:使用$。当它不是DOM相关(如ajax),并使用$ .fn。当它对使用选择器(如DOM / XML元素)抓取的元素进行操作时。
原始代码:
if(settings){$.extend(config, settings);}
<强> 更改: 强>
var config = $.extend( {
'top':0,
'left':0,
'wait':3000
}, settings);
<强>注释:强>
拥有if
语句是多余的。 .extend()
为您完成所有工作。
原始代码:
var $elem = $(selector);
if($elem.length > 0)
{
$elem.each(function()
{
$(this).css({"color":"#F00"});
})
}
return this;
<强> 更改: 强>
return this.each(function() {
$this = $(this);
$this.css({ 'color': config.color});
});
<强>注释:强>
使用return this.each(function(){})
是一种很好的做法,并保持可链接性。不仅如此,您将不再需要担心selector
的长度。
*注意:如果您要添加其他活动,请在插件中使用不同的methods
:jQuery Doc Reference - Authoring Plugins。
我希望这有帮助,如果您有任何问题,请告诉我们!
答案 1 :(得分:4)
我没有足够的声誉来评论并完全同意知识渊博的Dom。我只想在更改的代码中添加,最好使用 var 关键字创建本地变量:
var $this = $(this);
这将使插件更好,并允许您将插件应用于页面的多个元素,例如:
$('#testX').tippedOff2();
$('#testY').tippedOff2();
$('#testZ').tippedOff2();