javascript - 在 Vue.js 中为响应式 iframe 插入 javascript 代码
问题描述
我需要在我的 Vue.js 应用程序中集成在图表平台上创建的一些 iframe。响应式 iframe 的代码由我放入模板中的一些 html 代码和一对脚本标签之间的一些 javascript 组成。
这是html部分:
<iframe
id="datawrapper-chart-8dfPN"
src="//datawrapper.dwcdn.net/8dfPN/4/"
scrolling="no"
frameborder="0"
allowtransparency="true"
style="width: 0; min-width: 100% !important;" height="400"
>
</iframe>
和javascript部分:
<script type="text/javascript">
if("undefined"==typeof window.datawrapper)window.datawrapper={};
window.datawrapper["8dfPN"]={},
window.datawrapper["8dfPN"].embedDeltas={"100":481,"200":427,"300":400,"400":400,"500":400,"700":400,"800":400,"900":400,"1000":400},
window.datawrapper["8dfPN"].iframe=document.getElementById("datawrapper-chart-8dfPN"),
window.datawrapper["8dfPN"].iframe.style.height=window.datawrapper["8dfPN"].embedDeltas[Math.min(1e3,Math.max(100*Math.floor(window.datawrapper["8dfPN"].iframe.offsetWidth/100),100))]+"px",
window.addEventListener("message",function(a){if("undefined"!=typeof a.data["datawrapper-height"])for(var b in a.data["datawrapper-height"])if("8dfPN"==b)window.datawrapper["8dfPN"].iframe.style.height=a.data["datawrapper-height"][b]+"px"});
</script>
我不明白我必须如何管理这段代码。如果我把它放在模板中(因为它有 html 元素)视图告诉我我不能在模板中使用脚本。但是将代码嵌入到我的 Vue 文件部分也不起作用。我试图摆脱这些元素。但它不起作用。
有没有办法重构这段代码,以便我可以在 Vue.js 中充分使用它?
解决方案
如果您查看提供的 JavaScript,实际上并没有太多内容。它设置一个初始高度,然后设置一个事件侦听器来管理 iframe 的高度。
首先,我们将绑定height
到数据属性iframeHeight
。
<iframe
ref="chartiframe"
id="datawrapper-chart-8dfPN"
src="//datawrapper.dwcdn.net/8dfPN/4/"
scrolling="no"
frameborder="0"
allowtransparency="true"
style="width: 0; min-width: 100% !important;"
:height="iframeHeight"></iframe>
然后
const
为变量创建embeddedDeltas
mounted
设置钩子的初始高度。- 在钩子中设置
message
事件监听器mounted
- 创建一个方法来处理调整大小
- 移除
beforeDestroy
钩子中的事件监听器
ddd
const DELTAS = {
"100":481,
"200":427,
"300":400,
"400":400,
"500":400,
"700":400,
"800":400,
"900":400,
"1000":400,
};
export default {
data() {
return {
iframeHeight: '0px', // initial height
};
},
computed: {
// Necessary for initial iframe height
iframeOffsetWidth() {
return this.$refs['chartiframe'].offsetWidth;
},
},
mounted() {
// set initial iframe height
this.iframeHeight = `{DELTAS[Math.min(1e3,Math.max(100*Math.floor(this.iframeOffsetWidth/100),100))]}px`;
// setup event listener
window.addEventListener('message', this.handleIframeResize);
},
beforeDestroy() {
// destroy event listener
window.removeEventListener('message', this.handleIframeResize);
},
methods: {
handleIframeResize(e) {
for(var b in e.data['datawrapper-height']) {
if ('8dfPN' === b) {
this.iframeHeight = `${e.data['datawrapper-height'][b]}px`;
}
}
},
},
};
推荐阅读
- json - Vaadin 8 通信问题,来自服务器 1|X 的 JSON 无效
- go - 如何在 Google Cloud Run 中运行 go-cloud-debug-agent,以便我可以在 Stackdriver Debug 中调试我的 go 应用
- javascript - 将 API 派生值映射到 React.js 状态的问题
- javascript - 无法从 react native ios 在linkedin中分享帖子
- reactjs - 如何更改 React Js 中的道具值?
- google-analytics - 将 HTTP 状态代码记录到 Google Analytics 自定义维度
- java - 为什么它返回错误的字符串?
- php - 通过相同的键和值 PHP 合并数组
- node.js - 当容器不响应端口 8080 上的 ping 时,Azure 应用服务上带有 pm2 的 node.js 应用程序失败
- c# - 在 Datatable 中拆分和创建新行的场景?