位置: IT常识 - 正文

window.onresize的详细使用($(window).resize)

编辑:rootadmin
window.onresize的详细使用

推荐整理分享window.onresize的详细使用($(window).resize),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:windows resize,window resized,window.onresize 怎么用,$(window).resize,windows.onresize,$(window).resize,window. onresize,window. onresize,内容如对您有帮助,希望把文章链接给更多的朋友!

最近做的项目老是涉及到大小屏切换,但是因为屏幕宽高不一样的原因,老是要计算表格高度

window.onresize:监听window窗口变化,当窗口大小发生变化时,会触发此事件

含义

MDN中的定义是这样子的:

文档视图调整大小时会触发 resize事件。

在js中使用window.onresize = function(){// todo event}在html中使用<body onresize="myFunction()">在vue中的使用

需要注意的是,this在函数中指的是window,而不是vue实例

mounted(){const _this = thiswindow.onresize = function(){_this.width = document.body.clientWidth// todo event}}需要注意的两点:

1、this在函数中不可用,他在函数中不一定指全局上下文

解决办法如下:

const _this = thiswindow.onresize = function(){_this.width = document.body.clientWidth}

2、在谷歌浏览器中,window.onresize会触发两次,网上说是谷歌浏览器的bug

解决办法如下,设定一个标识

let flag = true window.onresize = function () { if (flag) { console.log(new Date(), '窗口改变了') flag = false } let timeId = setTimeout(() => { flag = true timeId = null // 清除延时定时器 }, 1000) }

没使用flag之前

window.onresize的详细使用($(window).resize)

使用之后,如下图,控制台只打印了一遍

注意在项目中的使用

1、window.onresize只能在一个组件中使用,如果多个组件调用则会出现覆盖情况,所以我的解决方案是在App.vue中使用,获取document.documentElement.clientWidth(即浏览器宽度)存放在vuex中,别的组件只需要用computed(计算属性)将vuex的clientWidth获取,然后通过watch监听clientWidth的值,即可触发组件事件

2、由于window.onresize是全局事件,在其他页面改变界面时也会执行,这样可能会出现问题,需要在出这个界面时注销window.onresize事件。

created() { this.$bus.$on('resize', this.$_setTableHeight) window.onresize = function () { console.log(new Date(), '窗口改变了') }},beforeDestroy() { this.$bus.$off('resize', this.$_setTableHeight) window.onresize = null},

注销之后,切换到其他页面,控制台就不会输出以下信息

window.addEventListenermounted() { this.$nextTick(() => { this.onDrawLine() window.addEventListener('resize', this.resize()) }) }, beforeDestroy() { console.log('删除了')// 具名函数使用removeEventListener清除,但是匿名函数不行 window.removeEventListener('resize', this.resize()) },性能优化

window.onresize 在监听窗口变化时,固然起到很好的效果,但是对于网页性能消耗过大。因为html中每个标签的变化,都会触发window.onresize 事件,比如显示/隐藏某个抽屉、添加/删除某个div等等,很有可能会造成循环触发和无限制触发,于是新推出了另外一个事件**ResizeObserver(对element和svgelement元素进行监听)**

MDN定义如下:

ResizeObserver避免了通过回调函数调整大小时,通常创建的无限回调循环和循环依赖项。它只能通过在后续的帧中处理 DOM 中更深层次的元素来做到这一点。如果它的实现遵循规范,则应在绘制前和布局后调用 resize 事件。

MDN示例:https://mdn.github.io/dom-examples/resize-observer/resize-observer-text.html

部分源码如下:

const h1Elem = document.querySelector('h1');const pElem = document.querySelector('p');const divElem = document.querySelector('body > div');const slider = document.querySelector('input[type="range"]');const checkbox = document.querySelector('input[type="checkbox"]');divElem.style.width = '600px';slider.addEventListener('input', () => { divElem.style.width = `${slider.value}px`;})const resizeObserver = new ResizeObserver((entries) => { for (const entry of entries) { if (entry.contentBoxSize) { // Firefox implements `contentBoxSize` as a single content rect, rather than an array const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize; h1Elem.style.fontSize = `${Math.max(1.5, contentBoxSize.inlineSize / 200)}rem`; pElem.style.fontSize = `${Math.max(1, contentBoxSize.inlineSize / 600)}rem`; } else { h1Elem.style.fontSize = `${Math.max(1.5, entry.contentRect.width / 200)}rem`; pElem.style.fontSize = `${Math.max(1, entry.contentRect.width / 600)}rem`; } } console.log('Size changed');});resizeObserver.observe(divElem);checkbox.addEventListener('change', () => { if (checkbox.checked) { resizeObserver.observe(divElem); } else { resizeObserver.unobserve(divElem); }});

副作用:兼容性不强,有些浏览器兼容,具体情况见Can I Use

参考链接:

https://www.cnblogs.com/yxysuanfa/p/6878016.html

https://www.jb51.net/article/245030.htm

https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver

本文链接地址:https://www.jiuchutong.com/zhishi/283956.html 转载请保留说明!

上一篇:【香港回归22周年】 (© ViewStock/Getty Images)(2020香港回归23年)

下一篇:小米路由器2代1T版本 PC端使用远程下载的详细方法(小米路由器2代改8t)

  • 增值税留存比例50
  • 税务登记管理办法2023
  • 中级税务师报名条件
  • 翻唱歌曲发行时怎么把原唱名字改了
  • 账本一般保存几年就可以销毁2004年的规定
  • 已认证未抵扣的进项怎么填写
  • 雇佣外籍劳工
  • 应交税费消费税分录
  • 建筑业咨询费有哪些
  • 印花税,车船税通过应交税金科目吗
  • 固定资产累计折旧借贷方向
  • 员工的油费补贴怎么算
  • 进项较大航天信息怎么填
  • 会计账簿的定义及其作用
  • 转让资产使用权收入属于什么收入
  • 金蝶用户管理怎么设置
  • 计提本月工资记账凭证怎么填
  • 投资收益科目应用
  • 公司注销银行账户流程
  • 免税销售额需要价税分离吗
  • 工会经费80%
  • 未竣工验收已交付使用的工程还需安全监管吗
  • win10禁止使用网络
  • 应收票据借贷方核算什么内容
  • linux用途是什么
  • 路由器密码忘了怎么查到
  • 仓储费用结算方式有哪些
  • 租赁费和场地租赁费区别
  • 退休费用会计分录
  • 洛阿雷城堡,西班牙韦斯卡 (© Sebastian Wasek/Alamy)
  • 生产经营个人所得税速算扣除数表
  • DOMException: Failed to execute ‘insertBefore‘ on ‘Node‘: The node before which the new node ...报错
  • php读取json数组中指定内容
  • php web socket
  • php控制结构
  • thinkphp框架入门
  • vgreduce --removemissing
  • 应交税费为负数在资产负债表里怎么填
  • 新的企业所得税
  • 承税汇票个人能用吗
  • 研发费用资本化可以加计扣除吗
  • 补充医疗保险属于什么
  • 计提工资大于发放工资,所得税汇算要调整吗
  • 红字发票开错可以重开吗
  • 合伙企业分配利润会计分录
  • 库存商品可以领用加工吗
  • 流动资金包括哪些费用
  • 设备维修会计分录如何写
  • 淘宝上买资料可以退吗
  • 玉米收购厂
  • 单位购买公文包合法吗
  • 合作建房土地增值税清算案例
  • 主营业务收入主要反映企业销售商品或劳务获得的收入
  • 住宿发票 抵扣
  • 销售费用的会计科目
  • 经营性现金流量三种算法
  • 应交税费科目账务处理
  • 电子发票怎么截屏
  • 学校固定资产账记法
  • 分公司独立核算和非独立核算哪个好
  • 进项税额转出怎么操作
  • 会计交接事项有哪些
  • mysql5.6 创建用户
  • 注册表regsz是什么意思
  • xp系统怎样设置无线网络连接
  • mac系统终端命令大全
  • imapi.exe
  • xp电脑关机后自动重启是什么原因
  • win7怎么查看电池信息
  • win7菜单栏是什么
  • 电脑迅雷影音在哪个文件夹
  • win7系统咋样
  • jquery 异步请求
  • cocos2dx屏幕适配解决方案
  • js编程代码
  • convert fs
  • javascript含义
  • Linux 中的time函数
  • python常用的内置逻辑判断函数
  • 税务总局和税务局区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设