Iframe загружает все после получения содержимого postMessage

У меня есть iframe, который получает некоторую информацию через функцию contentWindow.postMessage, чтобы он мог войти на страницу, которую я также создаю. однако я предполагаю, что страница загружается до появления сообщения contentWindow.postMessage. Как загрузить страницу ПОСЛЕ того, как домен получит информацию?

вот код.

Страница с iframe:

<template>
    <iframe
        id = "iframe" 
        name = "iframe" 
        src = "http://localhost:8081/login" 
        frameborder = "0" style = "overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:100%;width:100%;position:absolute;top:0px;left:0px;right:0px;bottom:0px" height = "100%" width = "100%"
        >
        ></iframe>
</template>

<script>
    let show = true;
export default {
    
  name: 'appFrame',
    
    function(){ document.getElementById('iframe').contentWindow.postMessage({
      userData: { 
        info1: localStorage.info1,
        info2: localStorage.info2,
        info3: localStorage.info3
        }}, 
      'http://localhost:8081/list');
      },
  data () {
    return {
      //
    }
  }
}
</script>

<style scoped>

</style>

это window.onmessage на моей другой странице, которую я хочу загрузить с информацией:

window.onmessage = function(event)
{
  if (event.origin == 'http://localhost:8080')
  
  document.getElementById('output').innerHTML = event.data;
  localStorage.setItem("info1", event.data.userData.info1);
  localStorage.setItem("info2", event.data.userData.info2);
  localStorage.setItem("info3", event.data.userData.info3);

  console.info("LOCALSTORAGE: ", localStorage.getItem("info1"), localStorage.getItem("info2"), localStorage.getItem("info3") )

};

Как бы я это сделал?

Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
1 552
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Предполагая, что ваше второе приложение (работающее на http://локальный:8081) является приложением Vue.js, у вас будет следующий код:

window.addEventListener('message', function(event) {
  if (event.origin == 'http://localhost:8080') {
    document.getElementById('output').innerHTML = event.data;
    localStorage.setItem("info1", event.data.userData.info1);
    localStorage.setItem("info2", event.data.userData.info2);
    localStorage.setItem("info3", event.data.userData.info3);

    console.info("LOCALSTORAGE: ", localStorage.getItem("info1"), localStorage.getItem("info2"), localStorage.getItem("info3") )
  }
});

В типичном приложении Vue.js необходимо создать корневой экземпляр. Исходный код примерно такой:

const rootInstance = {
  data() {
    return { /* Declare reactive properties */ };
  },

  methods: {
    attemptAfterLogin() {
      // do something here.
    }
  }

  template: `<div>Hello App</div>`
};

const app = new Vue(rootInstance);

Цель состоит в том, чтобы поместить этот код инициализации в обработчик события message. Объединив это в один код, это будет:

const rootInstance = {
  data() {
    return { /* Reactive properties */ };
  },

  methods: {
    attemptAfterLogin() {
      // do something here.
    }
  }

  template: `<div>Hello App</div>`
};

// Initialize Vue.js app
const app = new Vue(rootInstance);

window.addEventListener('message', function(event) {
  if (event.origin == 'http://localhost:8080') {
    document.getElementById('output').innerHTML = event.data;
    localStorage.setItem("info1", event.data.userData.info1);
    localStorage.setItem("info2", event.data.userData.info2);
    localStorage.setItem("info3", event.data.userData.info3);

    // Mount the application
    app.$mount(document.querySelector("#app"));

    // Tell the Vue.js app that localStorage is now set.
    app.attemptAfterLogin();
  }
});

Это всего лишь один из способов ведения дел. Кроме того, пока ваш внутренний iframe не получит сообщение, у вас может быть простая анимация загрузчика.

Кстати, предпочтите addEventListeneronmessage при прослушивании событий.

In a nutshell, irrespective of the front-end framework, the goal is to have a single entry point/function to load your application.

что именно вы подразумеваете под «корневым экземпляром»?

Otorrinolaringologista -man 30.05.2019 20:01

@Otorrinolaringologista-man, каждое приложение Vue.js обычно имеет один компонент верхнего уровня. Это корневой экземпляр. Подробнее здесь.

Harshal Patil 30.05.2019 20:06

так что моим единственным компонентом верхнего уровня будет мой app.vue? потому что он тот, у кого мой routerview перенаправляет на все.

Otorrinolaringologista -man 30.05.2019 20:16

@Otorrinolaringologista-человек, это может случиться. Будут и другие вещи, которые вы, возможно, захотите изучить. Например, поведение vue-router с iFrame, множественная последовательность инициализации и т. д.

Harshal Patil 30.05.2019 20:29

что, если мы сделаем это так. Как мне продолжать пытаться отправить дату, пока окно iframe не получит ее и не отправит информацию обратно?

Otorrinolaringologista -man 30.05.2019 20:32

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