javascript - 检测元素是否已通过 javascript 调整大小?

标签 javascript html css

是否可以简单地向某些元素添加事件监听器以检测它们的高度或宽度是否已被修改?我想在不使用像这样密集的东西的情况下做到这一点:

$(window).resize(function() { ... });

理想情况下,我想绑定(bind)到特定元素:

$("#primaryContent p").resize(function() { ... });

似乎在窗口上使用调整大小处理程序是唯一的解决方案,但这感觉有点矫枉过正。它也不考虑以编程方式修改元素尺寸的情况。

最佳答案

我只是想出了一种纯粹基于事件的方法来检测任何可以包含子元素的元素的元素大小调整,我已经粘贴了下面解决方案中的代码。

另见 original blog post ,其中有一些历史细节。此答案的先前版本基于博客文章的先前版本。


以下是启用调整大小事件监听所需的 JavaScript。

(function(){
  var attachEvent = document.attachEvent;
  var isIE = navigator.userAgent.match(/Trident/);
  var requestFrame = (function(){
    var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||
        function(fn){ return window.setTimeout(fn, 20); };
    return function(fn){ return raf(fn); };
  })();

  var cancelFrame = (function(){
    var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame ||
           window.clearTimeout;
    return function(id){ return cancel(id); };
  })();

  function resizeListener(e){
    var win = e.target || e.srcElement;
    if (win.__resizeRAF__) cancelFrame(win.__resizeRAF__);
    win.__resizeRAF__ = requestFrame(function(){
      var trigger = win.__resizeTrigger__;
      trigger.__resizeListeners__.forEach(function(fn){
        fn.call(trigger, e);
      });
    });
  }

  function objectLoad(e){
    this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
    this.contentDocument.defaultView.addEventListener('resize', resizeListener);
  }

  window.addResizeListener = function(element, fn){
    if (!element.__resizeListeners__) {
      element.__resizeListeners__ = [];
      if (attachEvent) {
        element.__resizeTrigger__ = element;
        element.attachEvent('onresize', resizeListener);
      }
      else {
        if (getComputedStyle(element).position == 'static') element.style.position = 'relative';
        var obj = element.__resizeTrigger__ = document.createElement('object'); 
        obj.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1;');
        obj.__resizeElement__ = element;
        obj.onload = objectLoad;
        obj.type = 'text/html';
        if (isIE) element.appendChild(obj);
        obj.data = 'about:blank';
        if (!isIE) element.appendChild(obj);
      }
    }
    element.__resizeListeners__.push(fn);
  };

  window.removeResizeListener = function(element, fn){
    element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
    if (!element.__resizeListeners__.length) {
      if (attachEvent) element.detachEvent('onresize', resizeListener);
      else {
        element.__resizeTrigger__.contentDocument.defaultView.removeEventListener('resize', resizeListener);
        element.__resizeTrigger__ = !element.removeChild(element.__resizeTrigger__);
      }
    }
  }
})();

用法

下面是这个解决方案的伪代码用法:

var myElement = document.getElementById('my_element'),
    myResizeFn = function(){
        /* do something on resize */
    };
addResizeListener(myElement, myResizeFn);
removeResizeListener(myElement, myResizeFn);

演示

http://www.backalleycoder.com/resize-demo.html

关于javascript - 检测元素是否已通过 javascript 调整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315712/

相关文章:

html - 为所有表格数据单元格添加底部边框

javascript - Bootstrap 3 - 在页面滚动上有粘 Accordion 标题

html - 如何改变单选按钮的颜色

javascript - 无法加载图片

java - GWT 日志记录仅显示级别 SERVE

javascript - HTML 表单 - 需要用户能够从下拉列表中选择一个选项,然后在另一个字段中输入数字吗?

Javascript 幻灯片只显示第一张图片,按钮不起作用

javascript - 这些符号在html中是什么意思?

javascript - 如何在 HTML JS 中获取外部文本

javascript - Magento 自定义选项 - 清除输入字段问题