默认只有window支持resize事件,但有时我们需要为div等元素添加resize事件

代码见下面,原理是在元素内添加一个内嵌html,然后监听这个内嵌html的resize事件

import { Injectable } from '@angular/core';

@Injectable()
export class ResizeEventService {
isIE: boolean; constructor() {
this.isIE = /Trident/.test(navigator.userAgent);
} addResizeListener(element: any, fn: any) {
const self = this;
if (!element.__resizeListeners__ || element.__resizeListeners__.length === 0) {
      element.__resizeListeners__ = [];
if (getComputedStyle(element).position === 'static') { element.style.position = 'relative'; }
const obj = element.__resizeTrigger__ = document.createElement('object') as any;
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 = function() {
this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
this.contentDocument.defaultView.addEventListener('resize', self.resizeListener);
};
obj.type = 'text/html';
if (this.isIE) { element.appendChild(obj); }
obj.data = 'about:blank';
if (!this.isIE) { element.appendChild(obj); } }
element.__resizeListeners__.push(fn);
} removeResizeListener(element: any, fn: any) {
if (!element.__resizeListeners__) {
return;
}
element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
if (!element.__resizeListeners__.length) {
element.__resizeTrigger__.contentDocument.defaultView.removeEventListener('resize', this.resizeListener);
element.__resizeTrigger__ = !element.removeChild(element.__resizeTrigger__);
}
} private resizeListener(e: Event) {
const win = e.target || e.srcElement as any;
if (win.__resizeRAF__) { window.cancelAnimationFrame(win.__resizeRAF__); }
win.__resizeRAF__ = window.requestAnimationFrame(function() {
const trigger = win.__resizeTrigger__;
trigger.__resizeListeners__.forEach(function(fn: any) {
fn.call(trigger, e);
});
});
}
}

为网页元素增加resize事件的更多相关文章

  1. 怎样给div增加resize事件

    当浏览器窗口被调整到一个新的高度或宽度时,就会触发resize事件,这个事件在window上面触发,那么如何给div元素增加resize事件,监听div的高度或宽度的改变呢? 先来回答另一个问题,监听 ...

  2. resize([[data],fn]) 当调整浏览器窗口的大小时,发生 resize 事件。

    resize([[data],fn]) 概述 当调整浏览器窗口的大小时,发生 resize 事件.   参数 fnFunctionV1.0 在每一个匹配元素的resize事件中绑定的处理函数.直线电机 ...

  3. 【JS 常用操作】全选、给后来元素增加事件

    11 //全选 $("#allCheckbox").click(function () { var checkedStatus = this.checked; //alert(ch ...

  4. HTML5中新增加的结构元素、网页元素和全局属性

    HTML5新增的结构元素(新增的都是块元素,独占一行) 1) header 定义了文档的头部区域 <header> <h1>网站标题<h1> </header ...

  5. JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置

    日常的网页开发调试工作中,经常需要知道指定的某个网页元素绑定了哪些事件以及绑定代码的位置,下面介绍三种用来跟踪页面中的事件的方法. 1.使用firefox调试 我们可以使用firefox的debug工 ...

  6. IE 的resize事件问题

    window的resize事件,真的让人无语! 我在动态设置元素的HTML内容后,窗口高度变化了,可是却不触发resize事件. 但是我在访问document.documentElement.scro ...

  7. webBrowser中操作网页元素全攻略

    原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...

  8. JS监听div的resize事件

    原文地址:http://zhangyiheng.com/blog/articles/div_resize.html 需求 开发过程中经常遇到的一个问题就是如何监听一个div的size变化. 比如我用c ...

  9. 利用canvas将网页元素生成图片并保存在本地

    利用canvas将网页元素生成图片并保存在本地 首先引入三个文件: 1.<script type="text/javascript" src="js/html2ca ...

随机推荐

  1. 设置全局theme及读取theme方法

    在web.config中设置了默认的Theme,其部分如下的配置节点: <system.web> <pages theme="Default" controlRe ...

  2. 【c++】输出文件的每个单词、行

    假设文件内容为 1. hello1 hello2 hello3 hello4 2. dsfjdosi 3. skfskj ksdfls 输出每个单词 代码 #include <iostream& ...

  3. Rsyslog+ELK日志分析系统搭建总结1.0(测试环境)

    因为工作需求,最近在搭建日志分析系统,这里主要搭建的是系统日志分析系统,即rsyslog+elk. 因为目前仍为测试环境,这里说一下搭建的基础架构,后期上生产线再来更新最后的架构图,大佬们如果有什么见 ...

  4. Swift函数_inout参数

    //无inout参数的函数 func changeName(var name:String){ name = "Hello" println(name) } let payerNa ...

  5. isnull函数

    isnull是判断一个字段是否为空值,返回一个特定的值 列: isnull(a,0)  如果a字段有空值返回0 没有空值就返回a的本身 isnull(a,1)=2 字段a有空值返回1,判断isnull ...

  6. Java复习第三天

    Day06 1.二维数组定义格式? (1)元素是一维数组的数组. (2)格式: A:数据类型[][] 数组名 = new 数据类型[m][n]; B:数据类型[][] 数组名 = new 数据类型[m ...

  7. C++(笔)001.

    1.编程范式 编程范式是指计算机编程的基本风格,C++可容纳多种程度范式,如面向对象编程.泛型编程及传统的过程式编程. 2.与C相比较 C++在C语言的基础上新加的特性如下: a.类和对象.继承 b. ...

  8. 【每日一linux命令】

    参考文章 1.[每日一linux命令]

  9. IO流之 commons-IO

    commons-IO 导入classpath 加入classpath的第三方jar包内的class文件才能在项目中使用 创建lib文件夹 将commons-io.jar拷贝到lib文件夹 右键点击co ...

  10. JavaScript中实现DI的原理(二)

    JavaScript中实现DI的原理 在JavaScript中实现DI,看起来难,实际上原理很简单,它的核心技术是Function对象的toString().我们都知道,对一个函数对象执行toStri ...