解决iframe实时获取资源页面显示空白的问题

本文介绍了在使用iframe时遇到的用户体验问题,即用户离开页面后再返回,iframe内容未显示。作者提出通过检测页面可见性、元素宽高来判断iframe是否已加载,并使用定时器进行重新加载的解决方案。在页面不可见时,会清除定时器以优化资源使用。
摘要由CSDN通过智能技术生成

1、问题起源

  在使用公司平台开发的时候,内部窗口使用的是iframe,iframe内部的内容是通过定时器一分钟一次获取最新的数据渲染在页面上。
  以上看起来是没有什么问题,但是会造成用户体验问题:

  • 当用户打开其他页面后,超过一分钟后,定时器已经调用了一次,但是用户在返回到那个页面,iframe的内容是一个空白的白板。使用F12在浏览器的开发者模式里面,DOM结构里面的innerHtml是有内容的,但是不知道为什么没有显示出来。我也很懵逼!


2、解决方式

  • (1)判断用户是否还在平台页面
  • (2)获取iframe内部展示信息的DOM元素的信息
  • (3)实时检测该元素的宽高来判断数据信息是否渲染出来了
  • (4)通过定时器来判断元素的宽高,如果为0,则重新加载一次方法渲染页面
  • (5)用户离开平台页面后清除定时器


3、代码实现

// 判断该页面在浏览器是否可见,获取可见状态
// document.visibilityState: 只读属性,它的值是 visible,hidden,prerender 或者 unloaded 之一。
// 如果网页可见会返回 visible,隐藏则返回 hidden。
let page_state = document.visibilityState;
let timer_yxh = null;
let o_yxh = document.getElementById('tableList');


if (page_state == 'visible') {
	// 当页面可见的时候开启定时器,监控iframe资源是否加载出来,
	// 在这里通过元素的宽高来判断,内容是否加载出来
	timer_yxh = setInterval(() => {
		
		// 只能通过行内样式才能获取到。获取到的元素宽高不包括padding和border
		// console.log('div 宽高', o_yxh.style.width, o_yxh.style.height) 

		// 元素的宽度包含padding不包含border
		console.log('client 宽高', o_yxh.clientWidth, o_yxh.clientHeight)
		// console.log('scroll 宽高', o_yxh.scrollWidth, o_yxh.scrollHeight)

		// 元素的宽度包含padding和border
		// console.log('offset 宽高', o_yxh.offsetWidth, o_yxh.offsetHeight)

		console.log('=====================================================')

		// 在定时器内部实时获取元素的宽度,在外部获取可能会造成数据不准确
		var client_W = o_yxh.clientWidth;

		// 如果元素宽度为0,则说明该iframe的内容没有显示出来
		if (client_W === 0) {
			// console.log("调用了方法,重新渲染页面dom结构和inner HTML内容")

			// 渲染数据的方法
			testFunction();
		}

	}, 3000)
} else {
	// 如果页面不可见将清除定时器
	clearInterval(timer_yxh)
}

结语

   以上方法是我解决问题的方法,如需借鉴,请作为参考;因为可能场景不一样,可能会不生效。可能我还是太菜了,如果有更好的方法,请各位大佬评论留言,不吝赐教,谢谢!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当在网页中嵌套使用iframe时,可能会遇到一些问题,如样式冲突、无法调整大小、页面加载速度慢等。下面介绍一些解决iframe嵌套页面问题的方法。 首先,针对样式冲突问题,可以使用CSS命名空间(CSS Namespaces)来解决。通过添加命名空间前缀,可以确保不同iframe中的元素样式不会相互冲突。这样可以避免样式被覆盖,保证每个iframe中的样式独立。 其次,针对调整iframe大小问题,可以使用JavaScript来动态调整iframe的大小。通过监听iframe内部内容的高度变化,并将高度值传递给父页面,从而实现自适应调整iframe的大小。这样可以确保iframe始终能够显示完整的内容,提高用户体验。 另外,针对页面加载速度慢的问题,可以通过延迟加载或者懒加载来提升性能。即在页面初次加载时,只加载展示iframe的占位符,并不加载真正的内容。当用户需要查看或者操作iframe时,再加载对应的内容。这样可以减少初次加载的数据量,提高页面加载速度。 此外,还可以考虑使用无需iframe的其他技术来实现类似的功能,如Ajax、Vue.js等。这些技术可以通过异步加载内容或者组件来避免使用iframe,从而减少了嵌套页面问题。 综上所述,处理iframe嵌套页面问题需要使用CSS命名空间、动态调整大小、延迟加载或懒加载等方法。同时也可以考虑使用其他技术来避免使用iframe带来的问题。通过采取这些方法,可以更好地解决iframe嵌套页面问题,提升用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天界程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值