为网页元素增加resize事件
默认只有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事件的更多相关文章
- 怎样给div增加resize事件
当浏览器窗口被调整到一个新的高度或宽度时,就会触发resize事件,这个事件在window上面触发,那么如何给div元素增加resize事件,监听div的高度或宽度的改变呢? 先来回答另一个问题,监听 ...
- resize([[data],fn]) 当调整浏览器窗口的大小时,发生 resize 事件。
resize([[data],fn]) 概述 当调整浏览器窗口的大小时,发生 resize 事件. 参数 fnFunctionV1.0 在每一个匹配元素的resize事件中绑定的处理函数.直线电机 ...
- 【JS 常用操作】全选、给后来元素增加事件
11 //全选 $("#allCheckbox").click(function () { var checkedStatus = this.checked; //alert(ch ...
- HTML5中新增加的结构元素、网页元素和全局属性
HTML5新增的结构元素(新增的都是块元素,独占一行) 1) header 定义了文档的头部区域 <header> <h1>网站标题<h1> </header ...
- JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置
日常的网页开发调试工作中,经常需要知道指定的某个网页元素绑定了哪些事件以及绑定代码的位置,下面介绍三种用来跟踪页面中的事件的方法. 1.使用firefox调试 我们可以使用firefox的debug工 ...
- IE 的resize事件问题
window的resize事件,真的让人无语! 我在动态设置元素的HTML内容后,窗口高度变化了,可是却不触发resize事件. 但是我在访问document.documentElement.scro ...
- webBrowser中操作网页元素全攻略
原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...
- JS监听div的resize事件
原文地址:http://zhangyiheng.com/blog/articles/div_resize.html 需求 开发过程中经常遇到的一个问题就是如何监听一个div的size变化. 比如我用c ...
- 利用canvas将网页元素生成图片并保存在本地
利用canvas将网页元素生成图片并保存在本地 首先引入三个文件: 1.<script type="text/javascript" src="js/html2ca ...
随机推荐
- JSONP原理及简单实现
在web2.0时代,熟练的使用ajax是每个前端攻城师必备的技能.然而由于受到浏览器的限制,ajax不允许跨域通信. JSONP就是就是目前主流的实现跨域通信的解决方案. 虽然在在jquery中,我们 ...
- Django多进程日志文件问题
Django多进程日志文件问题 最近使用Django做一个项目.在部署的时候发现日志文件不能滚动(我使用的是RotatingFileHandler),只有一个日志文件. 查看Log发现一个错误消息:P ...
- httpclient文件下载
http://blog.csdn.net/nupt123456789/article/details/42721003
- Android应用程序开发
第一章 Android应用初体验 1.1应用基础 activity是Android SDK中Activity类的一个具体实例,负责管理用户与信息屏的交互. 应用的功能是通过编写一个个Activity子 ...
- 忘记root密码的解决方法——进入单用户模式修改
(1)在系统还在读秒的时候按任意键,你会看到如下界面: 然后按下‘e’
- nltk模块
1. nltk简介 http://www.nltk.org 2. nltk能做什么? 2.1 搜索文本 单词搜索 相似词搜索 相似关键词识别 词汇分布图 生成文本 from nltk.book imp ...
- 修改npm包管理器的registry为淘宝镜像(npm.taobao.org)<转>
起因 安装了node,安装了npm之后,官方的源实在是 太慢了! 看了看淘宝的npm镜像, http://npm.taobao.org/ 竟然说让我再下载一个cnpm,要不然就每次都得install ...
- 基于语法分析器GOLD Parser开发的数学表达式计算器
最近发现一款文法分析神器,看完官网(http://goldparser.org/)的介绍后感觉很犀利的样子,于是就拿来测试了一番,写了一个数学表达式分析的小程序,支持的数学运算符如下所示:常规运算:+ ...
- Java 基础(8)——流程控制
上次的运算符都消化好了吗?每一天都要用到一些哦~ 以前有提到过一嘴,程序执行都是从上到下执行的,emm,学到这里,感觉这句话是对的也是错的了…… 如果都是一行一行执行下去的话,上节课的例子: 今天不上 ...
- Jvm运行时内存解析
一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...