【问题标题】:jQuery Plugin - How to add / bind eventsjQuery 插件 - 如何添加/绑定事件
【发布时间】:2013-04-17 17:13:03
【问题描述】:

好的,这是我第一次尝试创建一个 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 方法那样硬编码一些特定的东西。

那么,有了这个,我该如何在渲染后将这种类型的功能添加到事物中?

【问题讨论】:

  • 就像在插件之外那样做。 $elem.click(handler)
  • 那么我会在下线时向元素添加类或ID或其他任何东西,以便我可以做类似的事情吗?所以我可以依靠一些确定的东西作为选择器吗?
  • 你不需要选择器,你已经选择了元素。
  • 可能是一个愚蠢的问题,但你关注这个 - docs.jquery.com/Plugins/Authoring 吗?在那里,您开始所需的一切都得到了很好的解释。
  • 理想情况下,您希望插件做什么?

标签: javascript jquery jquery-plugins


【解决方案1】:

在创建插件时,很容易让事情变得过于复杂,所以尽量让事情变得简单。

我为您提供了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 的长度。


*注意:如果您想添加其他事件,请在您的插件中使用不同的methodsjQuery Doc Reference - Authoring Plugins

我希望这会有所帮助,如果您有任何问题,请告诉我!

【讨论】:

  • 从这个例子中学到了很多。帮助我开始制作我的第一个插件。非常感谢。我喜欢你为我们其他人打破陷阱的方式。
【解决方案2】:

我没有足够的声望点来评论并完全同意知识渊博的 Dom。我只想在更改后的代码中添加一点,最好使用 var 关键字创建一个 local 变量:
var $this = $(this);
这将使插件更好,并允许您将插件应用于页面的多个元素,例如:
$('#testX').tippedOff2();
$('#testY').tippedOff2();
$('#testZ').tippedOff2();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多