jQuery插件-如何添加/绑定事件
jQuery Plugin - How to add / bind events
好的,这是我第一次尝试创建一个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方法那样可以硬编码一些特定的东西。
有了那个,我如何在渲染后添加那种类型的功能?
创建插件时,很容易把事情弄得过于复杂,所以尽量让事情保持简单美观。
我已经为您提供了两个 tippedOff
插件的示例。下面是两个插件的jsfiddle演示。
第一个使用原始代码(NO SIGNIFICANT CHANGES MADE):
$.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;
};
这个,然而,是基于您的原始代码。基本上,我使用这些技巧重构了原始代码。这是我个人的做法。我还为您提供了以下更改的细目。():
$.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
,并使生活更简单。
我个人喜欢这个答案,@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
我没有足够的声望点来评论并完全同意Dom的观点,他非常有知识。我只想在更改的代码中添加,最好通过使用var关键字创建一个本地变量:var $this = $(this);
这将使插件更好,并允许您将插件应用于页面中的多个元素,例如:$('#testX').tippedOff2();
$('#testY').tippedOff2();
$('#testZ').tippedOff2();
- 在何处和何时添加具有数据绑定的元素
- 动态添加/复制表单时绑定到表单提交事件
- EmberJS - 在创建对象后添加绑定
- 主干.js绑定到集合“添加”呈现视图两次
- 动态地向可观察数组中的特定项添加绑定(例如hasfocus)
- 如果指令包含在另一个指令中,我如何在隔离范围内添加双向数据绑定属性
- 角度指令:绑定'鼠标悬停'事件添加到元素
- 淘汰MVC,绑定模型&将对象添加到模型中
- 如果移除并重新添加DOM元素,则ng单击绑定丢失
- 使用双向绑定将对象从角度视图动态添加/创建到控制器的数组
- 正在删除使用绑定添加的事件侦听器
- 取消绑定由加载jQuery'的外部脚本添加的事件;s的getScript函数
- 在knocket js中应用绑定后,向视图模型添加新属性
- 如何在Jquery中移除和添加OR绑定和取消绑定点击事件
- 将数据绑定添加到引导程序下拉列表
- 使用 Knockout.js 在文本区域中添加数据绑定和静态文本
- AngularJS 如何动态添加 HTML 并绑定到控制器
- 将 jQuery.animate() 添加到 Knockout.js 自定义绑定中
- 反应:将数组绑定到动态添加的字段
- jQuery插件-如何添加/绑定事件