<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jquery &#8211; 萧邦的博客</title>
	<atom:link href="https://www.zlhlab.top/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.zlhlab.top</link>
	<description>If not me who, If not now when</description>
	<lastBuildDate>Sun, 21 Jan 2018 14:41:04 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.6</generator>
	<item>
		<title>掌握jQuery插件开发，这篇文章就够了</title>
		<link>https://www.zlhlab.top/%e6%8e%8c%e6%8f%a1jquery%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91%ef%bc%8c%e8%bf%99%e7%af%87%e6%96%87%e7%ab%a0%e5%b0%b1%e5%a4%9f%e4%ba%86/</link>
		
		<dc:creator><![CDATA[萧邦]]></dc:creator>
		<pubDate>Sun, 21 Jan 2018 04:22:34 +0000</pubDate>
				<category><![CDATA[推荐]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquery插件]]></category>
		<guid isPermaLink="false">https://www.zlhlab.top/?p=506</guid>

					<description><![CDATA[在实际开发工作中，总会碰到像滚动，分页，日历等展示效果的业务需求，对于接触过jQuery以及熟悉jQuery使用的人来说，首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求。]]></description>
										<content:encoded><![CDATA[<p>在实际开发工作中，总会碰到像滚动，分页，日历等展示效果的业务需求，对于接触过<code>jQuery</code>以及熟悉<code>jQuery</code>使用的人来说，首先想到的肯定是寻找现有的<code>jQuery</code>插件来满足相应的展示需求。目前页面中常用的一些组件，都有多种<code>jQuery</code>插件可供选择，网络上也有很多专门收集<code>jQuery</code>插件的网站。利用<code>jQuery</code>插件确实可以给我们的开发工作带来便捷，但是如果只是会简单使用，而对其中的原理不甚了解，那么在使用过程中碰到问题或者对插件进行定制开发时就会有诸多疑惑。本文的目的就是可以快速了解<code>jQuery</code>插件的开发原理以及掌握<code>jQuery</code>开发的基本技能。</p>
<p>进行<code>jQuery</code>插件开发前，首先要知道两个问题：什么是<code>jQuery</code>插件？<code>jQuery</code>插件如何使用？</p>
<p>第一个问题，<code>jQuery</code>插件就是用来扩展<code>jQuery</code>原型对象的一个方法，简单来说就是<code>jQuery</code>插件是<code>jQuery</code>对象的一个方法。其实回答了第一个问题，也就知道第二个问题的答案了，<code>jQuery</code>插件的使用方式就是<code>jQuery</code>对象方法的调用。</p>
<p>我们先看个例子：<code>$("a").css("color","red")</code>。我们知道每个<code>jQuery</code>对象都会包含<code>jQuery</code>中定义的DOM操作方法,这里使用<code>$</code>方法来选择a元素，返回一个a元素的<code>jQuery</code>对象，这个对象就可以使用<code>jQuery</code>中定义的DOM操作方法。那么<code>jQuery</code>对象是如何获取这些方法的呢？其实<code>jQuery</code>内部定义了一个<code>jQuery.fn</code>对象，查看<code>jQuery</code>源码可以发现<code>jQuery.fn=jQuery.prototype</code>，也就是说<code>jQuery.fn</code>对象是<code>jQuery</code>的原型对象,<code>jQuery</code>的DOM操作方法都在<code>jQuery.fn</code>对象上定义的，然后<code>jQuery</code>对象就可以通过原型继承这些方法。</p>
<h4>基础版jQuery插件</h4>
<p>知道了上面这些知识，我们就可以来写一个简单的jQuery插件。假如我现在需要一个jQuery插件用来改变标签内容颜色，就可以按下面的方式来实现这个插件：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">$.fn.changeStyle = function(colorStr){
         this.css("color",colorStr);
}
</code></pre>
<p>然后按下面的方式来使用插件：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">$("p").changeStyle("red");
</code></pre>
<p>插件调用的时候，插件内部的this就是当前调用插件的<code>jQuery</code>对象，这样的话每个使用$()方法选择的标签，在调用<code>changeStyle()</code>插件时都会使用<code>css()</code>方法重设<code>color</code>样式。</p>
<h4>满足链式调用的jQuery插件</h4>
<p>链式调用时<code>jQuery</code>的一大特色，一个通用的插件应该遵循<code>jQuery</code>风格，满足链式调用要求。实现链式调用的方式也很简单：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">$.fn.changeStyle = function(colorStr){
         this.css("color",colorStr);
         return this;
}
</code></pre>
<p>然后使用的时候就可以链式调用其他方法了：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">$("p").changeStyle("red").addClass("red-color");
</code></pre>
<p>实现链式调用的关键点就一行代码<code>return this</code>，插件中加了这行代码，那么在插件执行完之后，就会把当前的<code>jQuery</code>对象返回，然后就可以在插件方法后面继续调用其它<code>jQuery</code>方法。</p>
<h4>防止$符号污染的jQuery插件</h4>
<p>有很多js库都会使用$符号，虽然<code>jQuery</code>可以使用<code>jQuery.noConflict()</code>方法交出<code>$</code>符号的使用权，但是如果定义插件的时候，使用<code>$.fn</code>对象来定义的，那么这些插件使用的时候就会受到其它使用<code>$</code>变量的js库的影响。对于这种情况，我们可以使用立即执行函数通过传参的方式封装插件。形式如下：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">(function($){
     $.fn.changeStyle = function(colorStr){
         this.css("color",colorStr);        
         return this;
     }
}(jQuery));
</code></pre>
<p>因为使用了立即执行函数，所以此时的$只属于这个立即执行函数的函数作用域，这样就可以避免<code>$</code>符号的污染。</p>
<h4>可以接受参数的jQuery插件</h4>
<p>继续上面的例子，假如我还想为这个插件添加一个设置标签元素内容文字大小的功能，那么我可以这么来实现：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">(function($){
     $.fn.changeStyle = function(colorStr，fontSize){
            this.css("color",colorStr).css("fontSize",fontSize+"px");        
         return this;
     }
}(jQuery));
</code></pre>
<p>上面这种插件传参方式适用于参数比较少的情况，如果需要传给插件内部的参数比较多，我们可以定义一个参数对象，然后把需要传给插件的参数放在参数对象中。插件定义时如下：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">(function($){
     $.fn.changeStyle = function(option){
         this.css("color",option.colorStr).css("fontSize",option.fontSize+"px");        
         return this;
     }

}(jQuery));
</code></pre>
<p>使用方式：<code>$("p").changeStyle({colorStr:"red",fontSize:14});</code></p>
<p>把参数放到一个对象中传给插件还有一个好处就是我们可以在插件内部为一些参数定义一些缺省值，例如：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">(function($){

     $.fn.changeStyle = function(option){
          var defaultSetting = { colorStr:"green",fontSize:12};
          var setting = $.extend(defaultSetting,option);
          this.css("color",setting.colorStr).css("fontSize",setting.fontSize+"px");        
         return this;
     }
}(jQuery));
</code></pre>
<p>上面的代码用到了<code>$.extend</code>方法，这个方法在这里的用法就是合并两个对象，即把后面一个对象的存在的属性值赋值给第一个对象，具体用法可以参考这里。<code>$.extend</code>方法还有一种作用是用来扩展<code>jQuery</code>对象本身。</p>
<p>这样定义的插件，我们在使用时如果不传<code>fontSize</code>，那么使用这个插件的<code>jQuery</code>对象标签的内容会被设置成默认的12px。</p>
<p>使用方式：<code>$("p").changeStyle({colorStr:"red"});</code></p>
<p>注意：在为插件定义默认参数时，一定要把默认参数写在插件方法内部，这样默认参数的作用域就在插件内部。</p>
<h4>总结</h4>
<p>定义插件的方式除了上面说的用<code>$.fn</code>来定义，还有另外一种方式来定义插件，那就是使用<code>$.fn.extend</code>方法。类似下面的写法：</p>
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-javascript">(function($){
     $.fn.extend({         
         changeStyle:function(option){             
         var defaultSetting = { colorStr:"green",fontSize:12};
         var setting = $.extend(defaultSetting,option);
         this.css("color",setting.colorStr).css("fontSize",setting.fontSize+"px");        
         return this; 
          }
     });
}(jQuery));
</code></pre>
<blockquote><p>
  <strong>PS</strong>:<code>$.extend</code>方法和<code>$.fn.extend</code>方法都可以用来扩展<code>jQuery</code>功能，通过阅读<code>jQuery</code>源码我们可以发现这两个方法的本质区别，那就是<code>$.extend</code>方法是在<code>jQuery</code>全局对象上扩展方法，<code>$.fn.extend</code>方法是在<code>$</code>选择符选择的<code>jQuery</code>对象上扩展方法。所以扩展<code>jQuery</code>的公共方法一般用<code>$.extend</code>方法，定义插件一般用<code>$.fn.extend</code>方法。
</p></blockquote>
<h4>参考资料</h4>
<p>jQuery源码<br />
<a href="http://learn.jquery.com/plugins/basic-plugin-creation/" title="How to Create a Basic Plugin" target="_blank">How to Create a Basic Plugin</a></p>
<p>作者：留七七<br />
链接：<a href="https://www.jianshu.com/p/518d424d4994" title="https://www.jianshu.com/p/518d424d4994" target="_blank">https://www.jianshu.com/p/518d424d4994</a><br />
來源：简书<br />
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
