tips:在iframe中嵌入微信公众号文章

您所在的位置:网站首页 微信读书页面加载出错 tips:在iframe中嵌入微信公众号文章

tips:在iframe中嵌入微信公众号文章

#tips:在iframe中嵌入微信公众号文章| 来源: 网络整理| 查看: 265

tips:在iframe中嵌入微信公众号文章

最近要做一个专门嵌入外部链接或者自定义文章的页面,结果发现一旦在iframe中使用了微信公众号url嵌入就会报错:

于是乎在查阅资料后发现这是因为微信的页面设置了响应头“frame-ancestors ‘self’”,简单来说就是微信阻止了外部页面将其嵌入的行为。那么该怎么办呢,我在网上寻找一番之后倒是发现了一些基于jQuery的解决方法,虽然我的项目是VUE移动端项目,不过还是可以借鉴修改一番的,直接上核心部分代码:

getURL(url) { let http = (window.location.protocol === 'http:' ? 'http:' : 'https:'); let realurl = http + '//cors-anywhere.herokuapp.com/' + url; let that = this; $.ajax({ type: 'get', url: realurl, success: function (res) { if (res) { let data = res; data = data.replace(/data-src/g, 'src'); let htmlSrc = 'data:text/html;charset=utf-8,' + data; // 解析码解决乱码 that.url = htmlSrc; } }, error: function (err) { console.log(err); Toast('好像出错了...'); } }); // axios.get(realurl).then(res=>{ // console.log(res); // },rej=>{ // let data = rej.data; // data=data.replace(/data-src/g, "src"); // let html_src = 'data:text/html;charset=utf-8,' + data; //解析码解决乱码 // this.url = html_src; // }) } }

首先这个方法的核心就是利用cors-anywhere.herokuapp.com这个服务端的api,将跨域请求发送出去。而本来项目里的ajax请求是用axios的,但是通过axios发送的请求只能在reject中拿到返回值,感觉这样可能不太好,于是乎我换成了zepto的ajax请求方式。而通过这个服务端api返回的data-src属性需要替换成src,最后再放入iframe中的url即可。 完整代码:

... ... export default { data: { details: {}, url: '' }, created() { // 从接口取到iframe地址 this.getDetails({id: this.$route.params.id, type: this.$route.params.type}) .then(res => { this.details = res.data.obj; let head = this.details.href.slice(0, 24); if (head === 'https://mp.weixin.qq.com') {// 是微信公众号文章 this.getURL(this.details.href); } else {// 是其它网址直接使用 this.url = this.details.href; } }, rej => {}); }, methods: { getURL(url) { let http = (window.location.protocol === 'http:' ? 'http:' : 'https:'); let realurl = http + '//cors-anywhere.herokuapp.com/' + url; let that = this; $.ajax({ type: 'get', url: realurl, success: function (res) { if (res) { let data = res; data = data.replace(/data-src/g, 'src'); let htmlSrc = 'data:text/html;charset=utf-8,' + data; // 解析码解决乱码 that.url = htmlSrc; } }, error: function (err) { console.log(err); Toast('好像出错了...'); } }); // axios.get(realurl).then(res=>{ // console.log(res); // },rej=>{ // let data = rej.data; // data=data.replace(/data-src/g, "src"); // let html_src = 'data:text/html;charset=utf-8,' + data; //解析码解决乱码 // this.url = html_src; // }) } } }

写在后面:这种方法虽然解决了项目的燃眉之急,但还是存在两个问题,第一是从接口取到返回值的时候会报错(内容我还看不太懂,可能因为jQuery和zepto或axios的实现方式不太相同),目前看来不会影响正常使用;第二个就是cors-anywhere.herokuapp.com这是一个第三方的api,如果能够通过自己的后台实现这种代理会更好一点。此外,如果嵌入的页面中带有视频的话,似乎视频会无法播放,这一点有待证实。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3