之前发布了一篇关于处理‘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()
}
}