之前因为有使用resize()事件,而jQuery自带的resize()只能绑定到window对象上,所以搜索到了一份别人写好的自定义resize事件,然而这份代码其实很多地方都有,找不出来源头,发现代码后面有不少知识点,所以便做了一些解析,好好了解一下相关的知识点,不过有时候学的多点,才知道自己的浅薄。
1 整体的代码注释如下
//监听div大小变化 (function($, h, c) { var a = $([]), e = $.resize = $.extend($.resize, {}),//jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象。 i, k = "setTimeout", j = "resize", d = j + "-special-event", b = "delay", f = "throttleWindow"; e[b] = 250; e[f] = true; $.event.special[j] = { setup: function() {//每次绑定一个resize事件就会触发一次 if (!e[f] && this[k]) {//如果e没有构建成功则无法进行接下来的事情,但是不明白this['setTimeout']的含义,大概是因为setTimeout是绑定在window对象中的,如果这个this是window对象就不需要调用自定义的resize事件,使用jquery自带的就可以了,防止多次触发 return false; } var l = $(this); a = a.add(l); $.data(this, d,{w: l.width(),h: l.height()});//向元素添加数据,jquery自带函数 if (a.length === 1) {g();}//只在一开始的时候将resize相关的setTimeout挂上 }, teardown: function() {//每次解绑一个resize事件就会触发一次 if (!e[f] && this[k]) { return false; } var l = $(this); a = a.not(l);//从事件列表移除元素 l.removeData(d);//该元素同时移除相关数据 if (!a.length) {clearTimeout(i);}//如果没有了resize相关元素,停止g() }, add: function(l) { if (!e[f] && this[k]) { return false; } var n; function m(s, o, p) { console.log(arguments) var q = $(this), r = $.data(this, d); r.w = o !== c ? o: q.width();//==和===,以及!=,!==的区别是后者还需要判断类型相同,前面只需要判断值相同 r.h = p !== c ? p: q.height(); n.apply(this, arguments);//Javascrip中每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参 } if ($.isFunction(l)) { n = l; return m; } else { n = l.handler;//l.handler是绑定事件时调用的函数 l.handler = m;//更改为m,m所做的是先更新元素存储的宽和高再调用函数 } }}; function g() { i = h[k](function() { //this['setTimeout'](function,250) a.each(function() { var n = $(this), m = n.width(), l = n.height(), o = $.data(this, d); if (m !== o.w || l !== o.h) { n.trigger(j, [o.w = m, o.h = l]); //大概是当元素当前大小不等于记录的大小,则触发resize事件 } }); g();//等250后再触发一次判断是否resize了,在移除之前不断循环这个过程,隔250一次 },e[b]); } })(jQuery, this);
2 相关知识点
2.1 自调用函数
/*自调用函数,相当于定义了一个匿名函数,同时调用了它并传入参数jQuery, this*/ (function($, h, c) {})(jQuery, this); /*相当于下面的用法*/ var fn = function($, h, c) {}; fn(jQuery, this); /*还有就是三个参数只传入了两个,最后一个输出的是undefine,不明白这样写的意义*/ (function($,a,b){ console.log($); console.log(a); console.log(b); })(jQuery,this);
2.2 $.event.special
https://www.cnblogs.com/aaronjs/p/3481075.html
jQuert.event.special 对象用于某些事件类型的特殊行为和属性。比如 load 事件拥有特殊的 noBubble 属性,可以防止该事件的冒泡而引发一些错误。总的来说,有这样一些方法和属性:
console.log($.event.special)
2.3 然而我至今不是很明白变量c的用法
它传入的是undefine,若是说作为全局变量,但是全程没有赋值,或许是调用的时候有别的用法,但是我并不了解……