<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Houston da Paz</title>
    <description>The latest articles on DEV Community by Houston da Paz (@houstondapaz).</description>
    <link>https://dev.to/houstondapaz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F27894%2F086b4d47-3ba2-4db1-b2b3-27e318beb4ed.jpg</url>
      <title>DEV Community: Houston da Paz</title>
      <link>https://dev.to/houstondapaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/houstondapaz"/>
    <language>en</language>
    <item>
      <title>Comunicação entre iframes</title>
      <dc:creator>Houston da Paz</dc:creator>
      <pubDate>Mon, 07 Oct 2019 13:56:15 +0000</pubDate>
      <link>https://dev.to/houstondapaz/comunicacao-entre-iframes-g17</link>
      <guid>https://dev.to/houstondapaz/comunicacao-entre-iframes-g17</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;Problema&lt;/li&gt;
&lt;li&gt;window.postMessage&lt;/li&gt;
&lt;li&gt;Recebendo o evento&lt;/li&gt;
&lt;li&gt;Enviando dado para o iframe&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/iframe"&gt;Iframes&lt;/a&gt;! Quando ouvimos falar sobre esse elemento parece que estamos voltando no tempo. Como naquelas páginas bonitas em que o menu chamava cada parte do site dentro de um desses elementos. Mas os iframes ainda existem, sempre vão existir, e servem para muitos propósitos.&lt;/p&gt;

&lt;p&gt;Há algum tempo eu tive que fazer um chat que iria ser embedado no site dos nossos clientes e então surgiu a primeira questão:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Como incluir um site dentro de outro?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fui buscar como outras empresas faziam e óbvio que TODOS usavam iframe. É necessário isolar o escopo, não pode haver vazamento de css/html e muito menos de javascript, algo que o iframe faz muito bem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problema &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Ao inserir o chat em um site, temos dois estados: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aberto &lt;/li&gt;
&lt;li&gt;Fechado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um iframe não pode mudar seu tamanho, não temos acesso ao &lt;code&gt;document&lt;/code&gt; dentro dele. Para isso precisamos &lt;em&gt;avisar&lt;/em&gt; o lado de fora do iframe.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;window.postMessage&lt;/code&gt; &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Foi então que descobri o &lt;code&gt;window.postMessage&lt;/code&gt; (&lt;a href="https://developer.mozilla.org/docs/Web/API/Window/postMessage"&gt;documentação&lt;/a&gt;) que permite enviar eventos para uma window (target) diferente. Assim posso deixar algum listener na window no qual incluo o iframe e enviar um evento falando qual o tamanho que o iframe precisa ter.&lt;/p&gt;

&lt;p&gt;Para emitir um evento do iframe é tão simples quanto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mensagem vinda do iframe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;window.parent: window de destino do evento, a window do iframe contém a propriedade parent, que é a referência para a página em que está incluso&lt;/li&gt;
&lt;li&gt;postMessage: o método em si, recebe dois parâmetros: o dado que será enviado (nesse exemplo enviei uma string simples) e a url de destino (passando * é aceito qualquer origem)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recebendo o evento &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Do lado &lt;em&gt;parent&lt;/em&gt;, ou seja, o que recebe o evento, temos que ficar escutando o evento &lt;code&gt;message&lt;/code&gt; da window, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// window escutando o evento `message` que o postMessage envia&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="c1"&gt;// para ter acesso ao dado temos que acessar a propriedade data&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Enviando dado para o iframe &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Para enviar o dado para o iframe, primeiro precisamos recuperar o elemento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const meuIframe = document.getElementById('meuiframe')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o elemento podemos chamar o postMessage da mesma forma que fizemos dentro dele, chamando direto a window do mesmo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meuIframe.contentWindow.postMessage('mensagem pro iframe', '*')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Com o postMessage fica simples e seguro, se usar o segundo parâmetro como filtro de destino para se comunicar com iframes.&lt;/p&gt;

&lt;p&gt;Fiz dois exemplos simples do uso, &lt;a href="https://github.com/houstondapaz/postmessage-chat-exemplo"&gt;um chat entre páginas&lt;/a&gt; e um &lt;br&gt;
&lt;a href="https://github.com/houstondapaz/postmessage-chat-exemplo"&gt;alterando o tamanho do iframe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida ou sugestão comenta aí!&lt;/p&gt;

</description>
      <category>iframe</category>
      <category>comunicação</category>
      <category>postmessage</category>
      <category>chat</category>
    </item>
  </channel>
</rss>
