VUE页面实现加载外部HTML方法

本文介绍了一种在Vue项目中加载并显示外部HTML文件的方法,通过创建全局组件v-html-panel实现,解决了IFRAME标签的局限性和跨域问题,同时展示了如何处理加载过程中的样式和脚本执行。

 

前后端分离,后端提供了接口。但有一部分数据,比较产品说明文件,是存在其他的服务器上的。所以,在页面显示的时候,如果以页面内嵌的形式显示这个说明文件。需要搞点事情以达到想要的效果。本文主要和大家介绍VUE页面中加载外部HTML的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

 

不同以往的IFRAME标签,那种方式比较Low,另外有其他的一些BUG。

本文思路是把HTML请求以来,以v-html的形式加载到页面内部。注册全局组件【v-html-panel】

1.HtmlPanel.vue文件

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<template>

 <p>

  <mu-circular-progress :size="40" v-if="loading"/>

  <p v-html="html"></p>

 </p>

</template>

<style>

 

</style>

<script>

 export default{

  // 使用时请使用 :url.sync=""传值

  props: {

   url: {

    required: true

   }

  },

  data () {

   return {

    loading: false,

    html: ''

   }

  },

  watch: {

   url (value) {

    this.load(value)

   }

  },

  mounted () {

   this.load(this.url)

  },

  methods: {

   load (url) {

    if (url && url.length > 0) {

     // 加载中

     this.loading = true

     let param = {

      accept: 'text/html, text/plain'

     }

     this.$http.get(url, param).then((response) => {

      this.loading = false

      // 处理HTML显示

      this.html = response.data

     }).catch(() => {

      this.loading = false

      this.html = '加载失败'

     })

    }

   }

  }

 }

</script>

 

htmlViewSample.vue

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<template>

 <p>

  <v-html-panel :url.asyc="url1"></v-html-panel>

  <v-html-panel :url.asyc="url2"></v-html-panel>

 </p>

</template>

<style scoped>

 p{color:red}

</style>

<script>

 export default{

  data () {

   return {

    url1: '',

    url2: ''

   }

  },

  mounted () {

   this.url1 = 'http://file.xxx.com/group1/M00/0C/F5/xxxxxxxx.html'

   this.url2 = 'http://file.xxx.com/group1/M00/0D/3B/yyyyyyy.html'

  },

  methods: {

  }

 }

</script>

 

上一张效果图

注意事项:

  • 直接使用axios处理的GET请求,需要处理跨域

  • 外部的css样式会作用到显示的html

  • 同时加载的外部html里的script也可能会执行,需要按需处理下

  • 外部HTML文件内部的相对路径将不会被自动识别,绝对路径可以

NGINX跨域配置:

(Origin如果使用*的话,好像会出错,这里直接使用请求源的地址,如果担心安全性的话,可以用if+正则条件判断下)

 

 

1

2

3

4

5

6

7

8

9

location / {

  add_header Access-Control-Allow-Origin $http_origin;

  add_header Access-Control-Allow-Credentials true;

  add_header Access-Control-Allow-Methods GET;

 

  access_log /data/nginx/logs/fdfs_https.log main;

 

  ...

}

转载地址:http://www.php.cn/js-tutorial-386304.html

<think>我们正在讨论Vue3中加载外部HTML页面方法。根据用户提供的引用[^1],虽然它是关于Vue的,但具体内容是关于加载外部HTML方法,并且提到了前后端分离的场景。我们需要在Vue3中实现类似的功能。 在Vue3中,加载外部HTML并渲染到页面可以通过几种方式实现,但需要注意的是,直接加载外部HTML可能存在安全风险(如XSS攻击),因此需要谨慎处理。 常见方法: 1. 使用`v-html`指令:这是Vue提供的一个指令,用于将数据作为HTML渲染。我们可以通过获取外部HTML内容(例如通过API请求),然后将其绑定到元素上。 2. 使用`<iframe>`标签:如果外部HTML是一个完整的文档,或者我们希望它在一个独立的浏览上下文中运行,可以使用iframe。 3. 使用第三方库:例如使用`DOMPurify`来净化HTML,然后再用`v-html`渲染,以提高安全性。 步骤说明(以使用`v-html`为例): 1. 使用HTTP客户端(如axios)从外部URL获取HTML内容。 2. 将获取到的HTML内容存储在组件的响应式数据中。 3. 在模板中使用`v-html`指令绑定该数据。 注意:由于安全原因,直接渲染未处理的HTML可能导致XSS攻击。因此,建议在渲染前对HTML进行净化处理。 下面是一个示例代码: 首先,安装DOMPurify(可选,但推荐): ```bash npm install dompurify ``` 然后,在Vue3组件中: ```vue <template> <div> <!-- 使用v-html渲染安全的HTML --> <div v-html="purifiedHtml"></div> </div> </template> <script> import { ref, onMounted } from 'vue'; import axios from 'axios'; import DOMPurify from 'dompurify'; export default { setup() { const htmlContent = ref(''); // 存储原始HTML const purifiedHtml = ref(''); // 存储净化后的HTML onMounted(async () => { try { // 假设后端提供一个接口返回HTML字符串 const response = await axios.get('https://example.com/external.html'); htmlContent.value = response.data; // 使用DOMPurify进行净化 purifiedHtml.value = DOMPurify.sanitize(htmlContent.value); } catch (error) { console.error('加载外部HTML失败:', error); } }); return { purifiedHtml }; } }; </script> ``` 如果不需要净化,可以直接将获取到的HTML绑定到`v-html`,但这样有安全风险,不推荐。 另外,如果外部HTML来自可信源,或者我们不需要执行其中的脚本,也可以考虑使用`<iframe>`: ```vue <template> <iframe :src="externalHtmlUrl" frameborder="0"></iframe> </template> <script> import { ref } from 'vue'; export default { setup() { const externalHtmlUrl = ref('https://example.com/external.html'); return { externalHtmlUrl }; } }; </script> ``` 使用iframe的优点是安全隔离,缺点是样式和页面集成度不高。 根据需求选择合适的方法。 相关问题: 1.Vue3中,如何安全地渲染HTML字符串? 2. Vue3中如何使用iframe嵌入外部页面? 3. Vue3中如何通过API获取外部HTML内容? 4. 如何防范在使用v-html时可能导致的XSS攻击? </think>### Vue3加载外部HTML代码到页面实现方法Vue3中加载外部HTML内容到页面,主要通过以下三种方式实现(需注意安全风险): #### 1. 使用`v-html`指令(基础方法) ```vue <template> <div v-html="externalHtml"></div> </template> <script setup> import { ref, onMounted } from 'vue' const externalHtml = ref('') onMounted(async () => { // 通过fetch请求外部HTML内容 const response = await fetch('https://example.com/external-content.html') externalHtml.value = await response.text() }) </script> ``` #### 2. 使用`<iframe>`嵌入(安全隔离) ```vue <template> <iframe :src="htmlUrl" width="100%" height="500px" frameborder="0" ></iframe> </template> <script setup> const htmlUrl = 'https://example.com/external-page.html' </script> ``` #### 3. 使用DOMPurify净化内容(推荐安全方案) ```bash # 安装所需库 npm install dompurify @types/dompurify ``` ```vue <template> <div v-html="safeHtml"></div> </template> <script setup> import { ref, onMounted } from 'vue' import DOMPurify from 'dompurify' const rawHtml = ref('') const safeHtml = ref('') onMounted(async () => { const response = await fetch('https://example.com/untrusted.html') rawHtml.value = await response.text() // 净化HTML防止XSS攻击 safeHtml.value = DOMPurify.sanitize(rawHtml.value, { ALLOWED_TAGS: ['p', 'b', 'i', 'em', 'strong'], // 允许的标签 FORBID_ATTR: ['style', 'onclick'] // 禁止的属性 }) }) </script> ``` ### 注意事项 1. **安全风险**:直接使用`v-html`可能导致XSS攻击,优先使用DOMPurify净化 2. **内容限制**:外部HTML中的Vue指令不会生效 3. **样式隔离**:外部CSS可能影响当前页面,建议使用`<iframe>`或CSS scoped 4. **跨域问题**:确保服务器配置CORS策略(如`Access-Control-Allow-Origin`)[^1] 5. **性能优化**:大文件内容考虑分片加载 > 对于产品说明文档等场景,推荐使用`<iframe>`方案,既能保持内容独立性,又能避免样式冲突[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值