VueJs的项目,里面嵌套了iframe,在360浏览器兼容模式下报错

发布于 2022-09-12 13:39:32 字数 3303 浏览 33 评论 0

公司开发的项目,由于一些业务场景,所以使用了iframe。其他大部分浏览器均正常,但是在360浏览器(版本号:17.0.3904.108)报错。

iframe是我封装的一个组件,代码如下:

<template>
  <div id="pikaz-iframe-container">
    <iframe id="pikazIframe" :src="setting.src" style="{this.hideScrollBar}" frameborder="0" width="100%" />
  </div>
</template>

<script>

export default {
  props: {
    setting: {
      type: Object,
      default: () => {}
    }
  },
  data() {
    return {
      mIframe: null
    }
  },
  computed: {
    // 是否隐藏滚动条
    hideScrollBar() {
      if (this.setting.hideScrolling) {
        if (Object.prototype.toString.call(this.setting.hideScrolling) === '[object String]') {
          return { width: `calc(100% + ${this.setting.hideScrolling})`, 'min-width': '100%', border: 'none' }
        } else {
          return { width: `calc(100% + 18px)`, 'min-width': '100%', border: 'none' }
        }
      }
      return {}
    },
    // iframe参数处理
    attrs() {
      const attr = {}
      Object.keys(this.setting).forEach(key => {
        if (!(key === 'hideScrolling' || key === 'css')) {
          attr[key] = this.setting[key]
        }
        // 处理css样式
        if (key === 'srcdoc' && this.setting.css && this.setting.srcdoc) {
          // 查找head标签
          const pattern = '<head.*(?=>)(.|\n)*?</head>'
          const html = this.setting.srcdoc.match(pattern)[0]
          // 插入style
          const style = `<style>${this.setting.css}</style></head>`
          const newHtml = html.replace('</head>', style)
          const doc = this.setting.srcdoc.replace(html, newHtml)
          attr[key] = doc
        }
      })
      // 设置默认值
      if (!attr.sandbox || attr.sandbox !== '') {
        // 同源文档
        if (this.setting.srcdoc) {
          attr.sandbox = 'allow-scripts'
        } else {
          attr.sandbox = 'allow-same-origin allow-scripts'
        }
      }
      // 无边框
      if (!attr.frameborder) {
        attr.frameborder = 0
      }
      return attr
    }
  },
  watch: {
    setting: {
      handler(val) {
        val && this.iframeOnload()
      },
      immediate: true
    },
    srcdoc: {
      handler(val) {
        val && this.iframeOnload()
      },
      immediate: true
    }
  },
  mounted() {
    this.iframeOnload()
  },
  methods: {
    /**
     * @name: onload
     * @param {type}
     * @return:
     */
    iframeOnload() {
      const _this = this
      _this.$nextTick(() => {
        _this.mIframe = document.getElementById('pikazIframe')
        if (_this.mIframe) {
          document.domain = _this.mIframe.contentDocument.domain
          _this.mIframe.onload = function() {
            _this.$emit('onload', _this.mIframe)
          }
        }
      })
    }
  }
}
</script>

<style scoped lang="scss">
#pikaz-iframe-container::-webkit-scrollbar {
  display: none;
}
#pikaz-iframe-container {
  width: 100%;
}
iframe {
  height: 700px;
}
</style>

在360浏览器兼容模式下报错的信息如下:

image

看见这个报错,我首先第一反应认为是打包的问题,后面发现不是,因为其他地方的组件也用到了nextTick,后面我把nextTick替换成setTimeout也不行,报错信息变成了:Error:拒绝访问,mounted。思来想去暂时想不出什么解决办法,所以就来网上想大姐咨询解决方案。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟柳画桥 2022-09-19 13:39:33

删掉这个

document.domain = _this.mIframe.contentDocument.domain
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文