Мне нужно интегрировать некоторые фреймы, созданные на платформе диаграмм, в мое приложение Vue.js. Код для отзывчивого 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), Views сообщит мне, что я не могу использовать скрипты в шаблонах. Но вставить код в часть моего файла Vue тоже не получится. Я пытался избавиться от элементов. Но это не работает.
Есть ли способ реорганизовать этот код, чтобы я мог полностью использовать его с Vue.js?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы посмотрите на предоставленный 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 для embeddedDeltasmounted.message в ловушке mountedbeforeDestroyддд
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`;
}
}
},
},
};
@Plouf Используйте массив объектов для отслеживания фреймов. Поместите свои URL-адреса, идентификатор и iframeHeight в каждый объект. Выбор может отслеживать индекс, который нужно отображать, и применять к нему iframeHeight. Затем используйте v-for, чтобы перебрать массив и сгенерировать свой html.
Я попробую это, спасибо. Похоже, теперь у меня есть готовое решение с вашей помощью!
Слишком хорошо! Спасибо за вашу помощь. Я добавил код в свой файл vue, и да, больше никаких проблем. Теперь мне нужно пойти немного дальше. Окна iframe отображаются выборочно с формой выбора, каждая опция связана с условием в каждом div с iframe. Когда параметр выбирается в меню пользователем, отображается div (и только этот). Поскольку у меня есть дюжина окон iframe, мне нужно найти способ рефакторинга и замены идентификатора iframe на переменную в различных частях (вычисленные, монтирование, методы и т. д.). У тебя есть идеи, как я мог это сделать?