使用MutationObserver代替DOMNodeInserted事件,处理Uncaught SyntaxError: Unexpected token <问题

        之前发布了一篇关于处理‘Uncaught SyntaxError: Unexpected token <’问题的文章,当时使用了DOMNodeInserted事件监听script的插入,现在用新的MutationObserver接口实现:

created() {
	// 检测内容更新 - mutationObserve
	if (MutationObserver) {
		// 检测对象
		const head = document.getElementsByTagName('head')[0]
		// 当观察到变动时执行的回调函数
		const callback = (mutationsList, observer) => {
			// 如果提示已展示
			if (this.releaseInfoVisible === true) return

			for(const mutation of mutationsList) {
				if (mutation.type === 'childList') { // 子节点树变化
					for (const node of mutation.addedNodes) {
						const type = node.nodeName.toLowerCase()
						const url = node.src
						if (type === 'script' && url) {
							const xhr = new XMLHttpRequest()
							xhr.open('get', url)
							xhr.onload = () => {
								const text = xhr.responseText
								if (text.indexOf('<') === 0) {
									this.releaseInfoVisible = true
									const self = this
									this.$modal.info({
										title: '检测到有新的版本发布,需要刷新页面以访问最新内容',
										width: 350,
										okText: '确定',
										onOk() {
											location.reload()
											self.releaseInfoVisible = false
										},
										onCancel() {
											self.releaseInfoVisible = false
										},
									})
								}
							}
							xhr.send()
							return
						}
					}
				}
			}
		}
		// 观察器的配置(需要观察什么变动)
		const config = { attributes: false, childList: true, subtree: false }
		// 创建一个观察器实例并传入回调函数
		this.nodeHeadObserver = new MutationObserver(callback)
		// 以上述配置开始观察目标节点
		this.nodeHeadObserver.observe(head, config)
	}
},
beforeDestroy() {
	// 停止观察
	if (this.nodeHeadObserver) {
		this.nodeHeadObserver.disconnect()
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值