今天看一篇文章,里面的一段代码出现了$.fn,第一次见到这样的写法,于是跑去问度娘。。。代码如下:
$.fn.scrollUnique = function() { return $(this).each(function() { var eventType = 'mousewheel'; // 火狐是DOMMouseScroll事件 if (document.mozHidden !== undefined) { eventType = 'DOMMouseScroll'; } $(this).on(eventType, function(event) { // 一些数据 var scrollTop = this.scrollTop, scrollHeight = this.scrollHeight, height = this.clientHeight; var delta = (event.originalEvent.wheelDelta) ? event.originalEvent.wheelDelta : -(event.originalEvent.detail || 0); if ((delta > 0 && scrollTop <= delta) || (delta < 0 && scrollHeight - height - scrollTop <= -1 * delta)) { // IE浏览器下滚动会跨越边界直接影响父级滚动,因此,临界时候手动边界滚动定位 this.scrollTop = delta > 0? 0: scrollHeight; // 向上滚 || 向下滚 event.preventDefault(); } }); }); };
度娘告诉我,$.fn是指jQuery的命名空间,加上fn上的方法及属性,会对jQuery实例每一个有效。
比如,我们要扩展$.fn.abc(),即$.fn.abc()是对jQuery扩展了一个abc()方法,那么后面你的每一个jQuery实例都可以引用这个方法了。此时,你就可以这样做了:$("div").abc();
这是我自己写的小demo,代码如下:
HTML代码:
<div id="点击我"></div>
JavaScript代码:
<script type="text/javascript"> $(function(){ $.fn.sayHello = function(){ alert("Hello everyone!"); } $("#div").click(function(){ $(this).sayHello(); }); }) </script>
jQuery为开发插件提供了两个方法,分别是:
(1)jQuery.fn.extend(object); //给jQuery对象添加方法
(2)jQuery.extend(object); //为扩展jQuery类本身,为类添加新的方法
fn 是什么东西呢。查看jQuery代码,就不难发现。
jQuery.fn = jQuery.prototype = { init: function( selector, context ) { //...... };
原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦。
虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。
jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn1") 会生成一个 jQuery类的实例。
jQuery.extend(object); 为jQuery类添加类方法,可以理解为添加静态方法。如:
$.extend({ add:function(a,b){return a+b;} });
这样便为jQuery添加一个为 add的“静态方法”,之后便可以在引入jQuery的地方,使用这个方法了,$.add(3,4); //return 7
jQuery.fn.extend(object); 对jQuery.prototype进行的扩展,就是为jQuery类添加“成员函数”。jQuery类的实例可以使用这个“成员函数”。
比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:
JavaScript代码:
$.fn.extend({ alertWhileClick:function(){ $(this).click(function(){ alert($(this).val()); }); } }); $("#input1").alertWhileClick();
$("#input1") 为一个jQuery实例,当它调用成员方法 alertWhileClick后,便实现了扩展,每次被点击时它会先弹出目前编辑里的内容。
真实的开发过程中,当然不会做这么小白的插件,事实上jQuery提拱了丰富的操作文档,事件,CSS ,Ajax、效果的方法,结合这些方法,便可以开发出非常高大上的插件。
知识链接:(function(){})(jQuery)详解
1、名称:自执行匿名函数
2、解释:包围函数(function(){})的第一对括号向脚本返回一个匿名函数,随后一对空括号立即执行返回的匿名函数,括号内为匿名函数的参数。
3、作用:可以用它创建命名空间,只要把自己的所有代码写在这个特殊的函数包装内,那么外部就不能访问,除非你允许(在变量或函数前加上window,这样你的变量或函数就成为全局的了)。
我们来看一个demo:
(function(arg){ alert(arg+100); })(100);
执行结果是:200
总结一下:执行函数的作用主要是 匿名 和 自动执行,代码在解释时就已经在运行了。