Вставьте код javascript для адаптивного iframe в Vue.js

Мне нужно интегрировать некоторые фреймы, созданные на платформе диаграмм, в мое приложение 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?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
4 656
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы посмотрите на предоставленный 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>

потом

  1. Создайте переменную const для embeddedDeltas
  2. Установите начальную высоту крюка mounted.
  3. Настройте прослушиватель событий message в ловушке mounted
  4. Создайте метод для обработки изменения размера
  5. Удалите прослушиватель событий в перехватчике beforeDestroy

ддд

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`;
        }
      }
    },
  },
};

Слишком хорошо! Спасибо за вашу помощь. Я добавил код в свой файл vue, и да, больше никаких проблем. Теперь мне нужно пойти немного дальше. Окна iframe отображаются выборочно с формой выбора, каждая опция связана с условием в каждом div с iframe. Когда параметр выбирается в меню пользователем, отображается div (и только этот). Поскольку у меня есть дюжина окон iframe, мне нужно найти способ рефакторинга и замены идентификатора iframe на переменную в различных частях (вычисленные, монтирование, методы и т. д.). У тебя есть идеи, как я мог это сделать?

Plouf 04.10.2018 08:30

@Plouf Используйте массив объектов для отслеживания фреймов. Поместите свои URL-адреса, идентификатор и iframeHeight в каждый объект. Выбор может отслеживать индекс, который нужно отображать, и применять к нему iframeHeight. Затем используйте v-for, чтобы перебрать массив и сгенерировать свой html.

Steven B. 04.10.2018 16:09

Я попробую это, спасибо. Похоже, теперь у меня есть готовое решение с вашей помощью!

Plouf 04.10.2018 16:42

Другие вопросы по теме