<cite id="pbjvp"></cite>

        <menuitem id="pbjvp"><em id="pbjvp"></em></menuitem>
        <ins id="pbjvp"></ins>

        <ins id="pbjvp"><video id="pbjvp"><mark id="pbjvp"></mark></video></ins>
        
        

        <output id="pbjvp"><em id="pbjvp"><b id="pbjvp"></b></em></output>

              <i id="pbjvp"><video id="pbjvp"><b id="pbjvp"></b></video></i>
              <mark id="pbjvp"></mark>
              <b id="pbjvp"><em id="pbjvp"><mark id="pbjvp"></mark></em></b>

              Jquery中文网 www.myllop.cn
              Jquery中文网 >  jQuery  >  jquery 教程  >  正文 使用jQuery监听DOM元素大小变化

              使用jQuery监听DOM元素大小变化

              发布时间:2016-09-19   编辑:www.myllop.cn
              jquery中文网为您提供使用jQuery监听DOM元素大小变化等资源,欢迎您收藏本站,我们将为您提供最新的使用jQuery监听DOM元素大小变化资源

              起因

              今天写页面的时候突然有这么个需求,由于父元素(一个DIV)的height是由javascript计算出来的固定的值,而在其中增加了一个多说插件,在用户评论后,子元素(DIV)的height属性增加,导致子元素溢出。但是又不知道如何为多说的评论按钮增加回调函数,于是乎就想到了根据子元素的大小变化来重新计算父元素的height。

              onresize?

              平常,都是在整个浏览器窗口变化时触发一个修改布局的回调函数。使用的是window对象的resize事件,利用:

              window.onresize = callback;
              

              来绑定。但根据resize事件的target是defaultView (window),这里详见MDN的resize文档,也就是说只有window对象有resize事件,于是乎就想到使用jquery自己的事件机制来模拟一个普通元素上的resize事件

              使用jQuery事件的实现思路

              可以想到一种比较简单的方式:
              1. 在元素绑定resize对象时,记录元素的width和height
              2. 使用requestAnimationFrame、setTimeout、setInterval,每隔一段时间查询其width和height,如果和记录的width和height不一样,运行回调函数并更新记录中的width为height

              jQuery插件

              这个功能Ben Alman编写了一个jQuery插件,这是传送门
              该插件的代码(核心部分),详细代码请查看Ben Alman博客的内容:

              (function($, window, undefined) {
                var elems = $([]),
                  jq_resize = $.resize = $.extend($.resize, {}),
                  timeout_id,
                  str_setTimeout = 'setTimeout',
                  str_resize = 'resize',
                  str_data = str_resize + '-special-event',
                  str_delay = 'delay',
                  str_throttle = 'throttleWindow';
                jq_resize[str_delay] = 250;
                jq_resize[str_throttle] = true;
                $.event.special[str_resize] = {
                  setup: function() {
                    if (!jq_resize[str_throttle] && this[str_setTimeout]) {
                      return false;
                    }
                    var elem = $(this);
                    elems = elems.add(elem);
                    $.data(this, str_data, {
                      w: elem.width(),
                      h: elem.height()
                    });
                    if (elems.length === 1) {
                      loopy();
                    }
                  },
                  teardown: function() {
                    if (!jq_resize[str_throttle] && this[str_setTimeout]) {
                      return false;
                    }
                    var elem = $(this);
                    elems = elems.not(elem);
                    elem.removeData(str_data);
                    if (!elems.length) {
                      clearTimeout(timeout_id);
                    }
                  },
                  add: function(handleObj) {
                    if (!jq_resize[str_throttle] && this[str_setTimeout]) {
                      return false;
                    }
                    var old_handler;
                    function new_handler(e, w, h) {
                      var elem = $(this),
                        data = $.data(this, str_data);
                      data.w = w !== undefined ? w : elem.width();
                      data.h = h !== undefined ? h : elem.height();
                      old_handler.apply(this, arguments);
                    }
                    if ($.isFunction(handleObj)) {
                      old_handler = handleObj;
                      return new_handler;
                    } else {
                      old_handler = handleObj.handler;
                      handleObj.handler = new_handler;
                    }
                  }
                };
              
                function loopy() {
                  timeout_id = window[str_setTimeout](function() {
                    elems.each(function() {
                      var elem = $(this),
                        width = elem.width(),
                        height = elem.height(),
                        data = $.data(this, str_data);
                      if (width !== data.w || height !== data.h) {
                        elem.trigger(str_resize, [data.w = width, data.h = height]);
                      }
                    });
                    loopy();
                  }, jq_resize[str_delay]);
                }
              })(jQuery, this);
              

              jQuery为jQuery插件的开发者提供了添加自定义事件的接口,详细可以参考jQuery官方文档,这里就是典型的jQuery自定义事件添加方式,其中有三个钩子:
              1. setup:The setup hook is called the first time an event of a particular type is attached to an element.首次绑定时执行,如果返回 false,使用默认方式绑定事件
              2. teardown:The teardown hook is called when the final event of a particular type is removed from an element.若指定该方法,其在移除事件处理程序(removeEventListener)前执行,如果返回 false,移除默认绑定事件
              3. add:Each time an event handler is added to an element through an API such as .on(), jQuery calls this hook.每一次给元素绑定事件,都会执行这个方法

              setup、teardown和add三个钩子,每个钩子最先做的事都是检测是否该对象为window对象,然后根据window对象特殊处理,因为window对象本身有resize事件

              从setup钩子可以看到,在初始化整个事件处理时,创建一个元素队列,队列中的每隔元素都把width和height放在data中,然后每隔250ms启动loopy函数,在loopy函数中判断是否变化,如果有变,触发回调函数并更新data中的width和height

              从teardown钩子可以看到,在元素移除事件时,只需要将元素从元素队列移除,并清除元素中的data数据。如果是元素队列中的最后一个元素,则不再继续执行loopy

              add钩子中,对回调函数进行了包装

              由此可以看到一个简单的jQuery自定义函数的实现机制

              您可能感兴趣的文章:
              jQuery的运行机制和设计理念分析
              网站如何做到完全不需要jQuery也可以满足简单需求
              jQuery 事件的命名空间简单了解
              jQuery 性能优化指南(2)
              jquery ready函数源代码研究
              不要使用jQuery触发原生事件的方法
              jquery中的事件处理详细介绍
              autoIMG 基于jquery的图片自适应插件代码
              jQuery中的.bind()、.live()和.delegate()之间区别分析
              JQuery UI的拖拽功能实现方法小结

              [关闭]
              246好彩天天免费资枓大全 <二四六03024>| <二四六z资料>| <二四六老地主>| <二四六老地主论坛>| <246天天好彩玄机图>| <246天天好彩票玄机图片>| <246好彩天天免费资枓大全>| <二四六天天好彩彩玄机资枓>| <二四天天正版免费资枓大>| <二四六天天好彩每期文字賧料>| <二四六天天好彩毎期文字资料>| <二四六天天好彩毎期文字图片玄机>| <二四六天天人好彩网手机版>| <二四六天天好彩手机版—每期>| <二四六天天好彩免费网手机板>| <二四六天天好手机版本>| <二四六天天好彩彩玄机资枓>| <246好彩天天免费资枓大全>| <二四六天天好彩彩玄机资枓>| <二四天天正版免费资枓大>| <二四天天正版好彩免费资枓1>| <二四六天天好彩头首页>| <二四六天天网手机版>| <二四六玄机图片天天好彩玄机图>| <图片玄机二四六天天好彩资料大全 www.308k.com>| <二四六天天好彩费网站大全>| <精选二四六天天好彩手机版>| <二四六天天好资料大全168>| <二四六天天好来 资料大全>| <二四六天天好资料大全50期蓝月亮>| <246天天免费彩资料大全>| <二四六天天好彩资枓大全>| <二四天天正版免费资枓大全>| <二四六天天好彩免费全年资枓大全>| <二四六天天免费好彩资料大全>| <二四六天天免费好彩资料图>| <二四六天天免费好彩资料大全168>| <743cc二四六天天好釆免费资料>| <246好彩天天免费资枓大全>| <天下釆彩与你同行资料二四六>| <二四六天天好彩资料246>| <二四六天天玄机资料大全>| <308二四六玄机资料大全二四六天天玄机图资料>| <香港二四六玄机资料>| <3o8k com二四六天天好彩文字资枓>| <246好彩天天免费资枓大全>| <二四六好彩资料大全308kk>| <二四六天天好彩彩免费资料大全>| <743cc二四六天天好釆免费资料>| <734cc期期好彩免费资枓大全>| <二四六好彩正版资料>| <308k二四六天好彩资料大全>| <二四六天天,好彩资料开奖>| <玄机二四六天天彩>| <二四六天天天好彩图片玄机>| <二四六天天好彩玄机图库>| <二四六天天如彩正版免费资料大全>| <二四六天天彩玄机免费资料大全>| <二四六天天好彩每期文资子料大全>| <二四六天天香港好彩资料大全>| <二四六天天好彩资料免费大全送>| <香港二四六天天好彩正版资料大全>| <308k二四六好彩资料大全>| <246天天彩免费资料308k>| <246天天好彩资料app>| <二四六天天好彩app下载>| <500502二四六天天彩>| <天天好彩246app>| <246天天好彩资料app>| <二四六天天好彩一每期文字资料>| <二四六天天好彩图片玄机下载>| <246好彩天天免费资枓大全>| <天下釆彩与你同行资料二四六>| <246免费资料大全天天好彩>| <246免费资料大全开>| <246好彩天天免费资枓大全>| <246天天好·彩免费资料大全>| <246天天好彩正版资>| <246天天好彩免费大全资料308k>| | | <新址246天天好彩>| <新址天天好彩二四六>| <246天天好彩开奖944cc>| <246好彩天天免费资枓大全>| <图玄机246天天好彩资料>| <246天天好彩资料全>| <246天天好彩玄机图片>| <246天天好彩免费944cc>| <246556 民间高手论坛>| <246正版天天好彩免费资枓大全>| <246正板天天好彩免费资枓大全>| <308kcom二四六天天彩>| <246玄机图资料天天好彩>| <246天天好彩免费资料大全308>| <二四六免费资料大全正>| <二四六天空彩资料大全>| <二四六天天好彩兔费咨料大全>| <246zl天天好·彩免费资料大全>| <246zl天天944cc好彩免费资料大全>| <二四六正版免费资料大全743cc>| <二四六天天好彩资料大全首页>| <二四六天天好彩免费资料308k>| <二四六免费资料玄机>| <二四六天天好彩资免费大全资料>| <308k二四六天天好彩i>| <246zl天天好·彩免费资料大全>| <二四六天天好彩网手机版 免费>| <天天好彩246资料308图库>| <246天天免费资料大全开奖结果>| <246天天免费资料大全玄机>| <二四六天天好彩免费资料大全168i>| <二四六天天好彩zl246cc>| <精选好彩二四六天天好彩>| <黄大仙精选二四六天天好彩>| | <蓝月亮精选二四六免费天天好彩>| <二四六天天好彩全年免费玄机料>| <二四六图片玄机资料大全>| <二四六玄机图片花仙子>| <香港二四六玄机资料图>| <二四六天天好采玄机资料大全>| <天天二四六玄机>| <二四六天天好彩免费资枓全免费>| <二四六天天好彩资枓免费>| <玄机图二四六天天好彩免费资料>| <二四六天天彩与你同行开奖>| <246好彩天天免费资枓大全>| <二四六天天手机版玄机图资料大全>| <308kcom二四六天天好彩玄机资料>| <二四六好彩正版资料大全>| <香港二四六天天好彩兔费资>| <308k二四六天天好彩 资料>| <二四六玄机图 彩图102>| <二四六天天彩正版资料>| <香港二四六玄机图>| <香港二四六好彩资料246>| <308kcom二四六玄机资料>| <二四六天天好彩正版文字资料大全>| <246天天好彩免费开奖结果>| <246天天好彩免费开奖资料>| <246天天好彩免费资料正版资料>| <2246天天好彩图片玄机>| <246天天好彩图片机>| <二四六天天网彩手机版>| <246 天天好彩免费资料成语挂牌>| <246天天好彩管家婆资料大全>| <246天天好彩综合资料大全>| <308k二四六天天彩>| <二四六天天彩免费玄机资料>| <新址246天天好彩282cc>| <246天天好彩免费944cc>| | <二四六天天好彩944cc资讯>| <246天天好彩308k每期资料>| <246天天好彩308每期资料>| <二四六好彩免费资料图片玄机>| <新址246正版免费资料大全>| <246天天好彩勉费资料大全246>| <新址246zlcom天天好彩资料>| <新址zl 246天天好彩>| <新址246zl cc天天好彩>| <246天天好彩118图片玄机>| <二四六天天好彩马会开奖结果>| <二四六天天好彩手机版开奖结果>| <二四六天天好彩综合资料大全>| <二四六天天好彩308k con>| <二四六天天好彩308k kom>| <246天天好彩免费资大全>| <新址zl246net天天好彩大全>| <246天天好彩玄机资料手机版>| <246天天好天下天空免费>| <二四六天空釆资料大全>| <二四六兔费天天好彩资料>| <二四六308kcom文字资料>| <246天天好天下彩天空开奖>| <二四六免费资料天下>| <二四六天天好彩308k玄机图>| <二四六天天好彩资料开奖>| <308k二四六天天好彩每期>| <308k二四六天天好彩图片玄机>| <二四六天天好彩246zl免费>| <二四六天天好彩 944cc 彩图>| <蓝月亮精选二四六天天好彩>| <二四六天天好彩资料网手机板>| <二四六天天好彩玄机图手机版>| <二四六论坛图片玄机>| <天天二四六玄机图>| <天天彩246免费资料大全>| <246天天好好彩资料免费大全>| <246天天好好彩资料大全>| <二四六免费大全天天彩308>| <香港二四六论坛308k>| <二四六天天彩正版资料大全>| <二四六论坛玄机资料大全>| <308kcom二四六玄机图片>| <308kcom二四六图片玄机>| <308kcom二四六生活幽默>| <玄机图片二四六好彩网>| <玄机资料二四六好彩资料大全>| <246天天好彩308k每期资料大全>|