{"id":2729,"date":"2015-04-24T17:10:39","date_gmt":"2015-04-24T16:10:39","guid":{"rendered":"http:\/\/descartesjs.org\/documentacion\/?p=2729"},"modified":"2021-08-06T18:25:26","modified_gmt":"2021-08-06T17:25:26","slug":"comunicacion-escena-html-usando-descartesjs","status":"publish","type":"post","link":"https:\/\/reddescartes.org\/documentacion\/comunicacion-escena-html-usando-descartesjs\/","title":{"rendered":"Comunicaci\u00f3n escena-html usando DescartesJS"},"content":{"rendered":"<h4>Comunicaci\u00f3n entre&nbsp;una escena de Descartes con&nbsp;la p\u00e1gina HTML madre&nbsp;o con la p\u00e1gina HTML hija<\/h4>\n<p>Con el int\u00e9rprete DescartesJS, una escena de Descartes puede comunicarse con la p\u00e1gina HTML que le da soporte siempre que la escena est\u00e9 embebida mediante un iframe, y tambi\u00e9n&nbsp;puede <a href=\"https:\/\/descartesjs.org\/documentacion\/?p=2709\">comunicarse con una&nbsp;p\u00e1gina HTML que haya sido abierta por ella a trav\u00e9s de un espacio HTMLIframe<\/a>.<\/p>\n<p>En la imagen siguiente tenemos en el &lt;body&gt; de una p\u00e1gina html un &lt;iframe&gt; a trav\u00e9s del cual se embebe un fichero html ( en este caso ese archivo se denomina comunicacion_Descartes.html), el cual contiene una escena de Descartes.<\/p>\n<div id=\"attachment_2738\" style=\"width: 973px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2015\/04\/escenaEnIframe.png\"><img aria-describedby=\"caption-attachment-2738\" class=\"wp-image-2738 size-full\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2015\/04\/escenaEnIframe.png\" alt=\"escenaEnIframe\" width=\"963\" height=\"184\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2015\/04\/escenaEnIframe.png 963w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2015\/04\/escenaEnIframe-300x57.png 300w\" sizes=\"(max-width: 963px) 100vw, 963px\" \/><\/a><p id=\"caption-attachment-2738\" class=\"wp-caption-text\">c\u00f3digo iframe para embeber una escena en una p\u00e1gina html<\/p><\/div>\n<p>Para que una pagina html, que es madre de una escena de Descartes a trav\u00e9s de un iframe o que es hija de ella mediante un espacio HTMLIframe, pueda recibir los mensajes que env\u00eda la escena Descartes mediante <a href=\"https:\/\/descartesjs.org\/documentacion\/?p=2697\">las funciones para la&nbsp;comunicaci\u00f3n<\/a>, necesita tener un <a href=\"http:\/\/www.w3schools.com\/js\/js_htmldom_eventlistener.asp\" target=\"_blank\" rel=\"noopener noreferrer\">manejador de eventos<\/a><\/p>\n<p style=\"text-align: center;\"><span style=\"color: #ff0000;\">elemento<\/span>.addEventListener(\u00abmessage\u00bb, <span style=\"color: #ff0000;\">funcionQueManejaLosMensajes<\/span>)<\/p>\n<p>donde <span style=\"color: #ff0000;\">elemento&nbsp;<span style=\"color: #000000;\">es elemento de la p\u00e1gina al que se le asocia el manejador de los eventos que sobre \u00e9l acontecen&nbsp;<\/span><\/span>y la funci\u00f3n <span style=\"color: #ff0000;\">funcionQueManejaLosMensajes<\/span>&nbsp;sirve para gestionar el evento. A continuaci\u00f3n se refleja un esquema de esa funci\u00f3n&nbsp;donde se controla que el mensaje sea tipo set o update. En lugar del evento \u00abmessage\u00bb pueden contemplarse <a href=\"http:\/\/www.codexexempla.org\/curso\/curso_4_2_g.php\" target=\"_blank\" rel=\"noopener noreferrer\">otros<\/a>.<\/p>\n<p>__________________________________________________<\/p>\n<p><span style=\"color: #ff0000;\"><span style=\"color: #0000ff;\">function<\/span> funcionQueManejaLosMensajes<\/span>(evt) {<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\">var<\/span> data = evt.data;<\/p>\n<p style=\"padding-left: 30px;\">&nbsp;<span style=\"color: #008000;\">\/\/ se maneja un mensaje del tipo set<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">\/\/ data.name es el nombre de la variable<\/span><br \/>\n<span style=\"color: #008000;\"> \/\/ data.value es el valor de la variable<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\">if<\/span> (data.type === \u00abset\u00bb) {<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">\/\/ incluir c\u00f3digo deseado<\/span><\/p>\n<p>}<\/p>\n<p style=\"padding-left: 30px;\">&nbsp;<span style=\"color: #339966;\">\/\/ se maneja un mensaje del tipo update<\/span><br \/>\n<span style=\"color: #0000ff;\">else if<\/span> (data.type === \u00abupdate\u00bb) {<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">\/\/ incluir c\u00f3digo deseado<\/span><\/p>\n<p style=\"padding-left: 30px;\">}<\/p>\n<p>}<\/p>\n<p>___________________________________________________________________<\/p>\n<h4>Comunicaci\u00f3n de la p\u00e1gina HTML madre con&nbsp;la escena de Descartes<\/h4>\n<p>Para enviar informaci\u00f3n desde una pagina html, madre de una escena Descartes mediante iframe, a la escena de Descartes se utiliza la interfaz de comunicaci\u00f3n <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/postMessage\">window.postMessage<\/a> de JavaScript, donde los mensajes son de la siguiente forma:<\/p>\n<p><span style=\"color: #ff0000;\">referenciaAlIframe<\/span>.contentWindow.postMessage({ type: \u00abupdate\u00bb }, &#8216;*&#8217;);<br \/>\n<span style=\"color: #ff0000;\">referenciaAlIframe<\/span>.contentWindow.postMessage({ type: \u00abset\u00bb, name: <span style=\"color: #0000ff;\">varName<\/span>, value: <span style=\"color: #0000ff;\">value<\/span> }, &#8216;*&#8217;);<\/p>\n<p>donde <span style=\"color: #0000ff;\">varName<\/span> es una cadena con el nombre de la variable que se le quiere pasar a Descartes y <span style=\"color: #0000ff;\">value<\/span> es el valor de la variable.<\/p>\n<div>Nota: Como se ha indicado en los p\u00e1rrafos anteriores en DescartesJS, no hay un API como tal, porque la funci\u00f3n <span style=\"color: #ff0000;\">funcionQueManejaLosMensajes<\/span>&nbsp;debe ser implementada de acuerdo a las necesidades del programa. Tal vez, para enviar mensajes hacia Descartes ser\u00eda conveniente tener un API, pero la forma de enviar los mensajes es tan simple que quiz\u00e1s no merezca la pena su elaboraci\u00f3n. El sistema de <span class=\"il\">comunicaci\u00f3n<\/span> es muy sencillo, el \u00fanico inconveniente es la necesidad de saber el nombre de las variables que la pagina HTML espera recibir, as\u00ed como el de las variables que usa internamente la escena&nbsp;de Descartes.<\/div>\n<div>&nbsp;<\/div>\n<div>&nbsp;<\/div>\n<div>\n<hr>\n<\/div>\n<div>Podemos ver un ejemplo a continuaci\u00f3n:<\/div>\n<div>\n<div style=\"text-align: center;\">\n<!-- iframe plugin v.4.5 wordpress.org\/plugins\/iframe\/ -->\n<iframe src=\"https:\/\/descartesjs.org\/repositorio\/comunicacion_JS\/index.html\" width=\"690\" height=\"600\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe>\n<\/div>\n<div style=\"text-align: center;\">(Puede descargar &nbsp;esta escena desde <a href=\"https:\/\/descartesjs.org\/repositorio\/comunicacion_JS.zip\">este enlace<\/a>)<\/div>\n<div style=\"text-align: left;\">&nbsp;<\/div>\n<div style=\"text-align: left;\">\n<p>El esquema l\u00f3gico-funcional de la escena anterior es el siguiente:<\/p>\n<\/div>\n<div style=\"text-align: left;\">1.&nbsp;Para comunicar el html con la escena de Descartes que est\u00e1 embebida en un iframe de id \u00abel_iframe\u00bb<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&lt;iframe id=\u00bbel_iframe\u00bb src=\u00bbcomunicacion_Descartes.html\u00bb width=640 height=480 frameborder=0 seamless scrolling=\u00bbno\u00bb&gt;&lt;\/iframe&gt;<\/div>\n<div style=\"text-align: left;\">se cuenta en el body con un campo de texto de id \u00abtexto_a_enviar\u00bb<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&lt;input id=\u00bbtexto_a_enviar\u00bb type=\u00bbtext\u00bb \/&gt;<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&nbsp;<\/div>\n<div style=\"text-align: left;\">y un bot\u00f3n de id \u00abenviar\u00bb<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&lt;input id=\u00bbenviar\u00bb type=\u00bbbutton\u00bb value=\u00bbenviar\u00bb&gt; &lt;br \/&gt;<\/div>\n<div style=\"text-align: left;\">y en head se cuenta con el siguiente c\u00f3digo<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">var contenido = document.getElementById(\u00abtexto_a_enviar\u00bb);<br \/>\nvar boton = document.getElementById(\u00abenviar\u00bb);<br \/>\nvar iframe = document.getElementById(\u00abel_iframe\u00bb);<br \/>\nboton.addEventListener(\u00abclick\u00bb, function(evt) {<br \/>\niframe.contentWindow.postMessage({ type: \u00abset\u00bb, name: \u00abunaVariable\u00bb, value: contenido.value }, &#8216;*&#8217;);<br \/>\niframe.contentWindow.postMessage({ type: \u00abupdate\u00bb }, &#8216;*&#8217;);<br \/>\n});<\/div>\n<div style=\"text-align: left;\">donde se identifica el campo de texto, el bot\u00f3n y el iframe mediante sus id respectivos y se define un manejador de eventos ligado al bot\u00f3n ligado al evento \u00abclick\u00bb, de manera que cuando el usuario hace click sobre el bot\u00f3n se env\u00eda un mensaje tipo set al iframe con el contenido del campo de texto y ligado a una variable que en la escena tendr\u00e1 que tener el nombre \u00abunaVariable\u00bb y un mensaje tipo update.<\/div>\n<div style=\"text-align: left;\">En la escena ejemplo se cuenta con un gr\u00e1fico tipo de texto en el que se observa la variable \u00abunaVariable\u00bb<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&lt;param name=\u00bbG_01&#8243; value=\u00bbespacio=&#8217;E1&#8242; tipo=&#8217;texto&#8217; expresi\u00f3n='[20,20]&#8217; texto='[unaVariable]&#8217; fuente=&#8217;SansSerif,PLAIN,22&#8242; fijo=&#8217;s\u00ed'\u00bb&gt;<\/div>\n<div style=\"text-align: left;\">que refleja el valor recibido.<\/div>\n<div style=\"text-align: left;\">2. Para comunicar la escena con el html madre, en la primera se cuenta con un control tipo campo de texto de id \u00abtexto\u00bb que recoger\u00e1 el valor a enviar<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&lt;param name=\u00bbC_01&#8243; value=\u00bbid=&#8217;texto&#8217; tipo=&#8217;num\u00e9rico&#8217; interfaz=&#8217;campo de texto&#8217; solo_texto=&#8217;s\u00ed&#8217; espacio=&#8217;E1&#8242; nombre=&#8217;texto&#8217; valor=&#8217;&amp;squot;un texto&amp;squot;&#8217; fijo=&#8217;s\u00ed&#8217; visible=&#8217;s\u00ed'\u00bb&gt;<\/div>\n<div style=\"text-align: left;\">y otro tipo bot\u00f3n que al pulsarlo tiene una acci\u00f3n calcular en la que se asigna el valor de texto a una variable de id \u00abvariableEnviada\u00bb en el html madre &nbsp;mediante la funci\u00f3n parent.set(&#8216;variableEnviada&#8217;,texto)<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&lt;param name=\u00bbC_02&#8243; value=\u00bbid=&#8217;enviar&#8217; tipo=&#8217;num\u00e9rico&#8217; interfaz=&#8217;bot\u00f3n&#8217; espacio=&#8217;E1&#8242; nombre=&#8217;enviar texto&#8217; fijo=&#8217;s\u00ed&#8217; visible=&#8217;s\u00ed&#8217; acci\u00f3n=&#8217;calcular&#8217; par\u00e1metro=&#8217;parent.set(&amp;squot;variableEnviada&amp;squot;,texto)'\u00bb&gt;<\/div>\n<div style=\"text-align: left;\">Y en el html madre &nbsp;se ha definido un manejador de eventos para el evento \u00abmessage\u00bb<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">window.addEventListener(\u00abmessage\u00bb, funcionQueManejaLosMensajes);<br \/>\nfunction funcionQueManejaLosMensajes(evt) {<br \/>\nvar data = evt.data;<br \/>\n\/\/ se maneja un mensaje del tipo set<br \/>\nif (data.type === \u00abset\u00bb) {<br \/>\n\/\/ data.name es el nombre de la variable<br \/>\n\/\/ data.value es el valor de la variable<br \/>\ndocument.getElementById(\u00abtextoRecibido\u00bb).textContent = data.value; \/\/ este es solo un ejemplo de lo que se &nbsp; &nbsp; puede hacer con los mensajes<br \/>\n}<br \/>\n}<\/div>\n<div style=\"text-align: left;\">En \u00e9l se asigna al elemento html de id \u00abtextoRecibido\u00bb en valor enviado desde la escena<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">El texto recibido desde la escena de Descartes es: &lt;span id=\u00bbtextoRecibido\u00bb&gt;&lt;\/span&gt;<\/div>\n<div style=\"text-align: left; padding-left: 30px;\">&nbsp;<\/div>\n<div style=\"text-align: left;\">&nbsp;<\/div>\n<div>En el ejemplo siguiente se ha modificado el c\u00f3digo para que la comunicaci\u00f3n se produzca autom\u00e1ticamente cuando los campos de texto cambian, evitando tener que contar con botones de env\u00edo:<\/div>\n<div>\n<div style=\"text-align: center;\">\n<!-- iframe plugin v.4.5 wordpress.org\/plugins\/iframe\/ -->\n<iframe src=\"https:\/\/descartesjs.org\/repositorio\/comunicacion-aut_JS\/index-aut.html\" width=\"690\" height=\"600\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe>\n<\/div>\n<div style=\"text-align: center;\">(Puede descargar &nbsp;esta escena desde <a href=\"https:\/\/descartesjs.org\/repositorio\/comunicacion-aut_JS.zip\">este enlace<\/a>)<\/div>\n<\/div>\n<\/div>\n<div>Lo que se ha rrealizado es cambiar el evento \u00abclick\u00bb por el evento \u00abchange\u00bb y asociar el manejador de eventos al campo de texto de id \u00abtexto_a_enviar\u00bb<\/div>\n<div style=\"padding-left: 30px;\">var contenido = document.getElementById(\u00abtexto_a_enviar\u00bb);<br \/>\nvar iframe = document.getElementById(\u00abel_iframe\u00bb);<br \/>\ncontenido.addEventListener(\u00ab<span style=\"color: #ff0000;\">change<\/span>\u00ab, function(evt) {<br \/>\niframe.contentWindow.postMessage({ type: \u00abset\u00bb, name: \u00abunaVariable\u00bb, value: contenido.value }, &#8216;*&#8217;);<br \/>\niframe.contentWindow.postMessage({ type: \u00abupdate\u00bb }, &#8216;*&#8217;);<br \/>\n});<\/div>\n<div>&nbsp;<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Comunicaci\u00f3n entre&nbsp;una escena de Descartes con&nbsp;la p\u00e1gina HTML madre&nbsp;o con la p\u00e1gina HTML hija Con el int\u00e9rprete DescartesJS, una escena de Descartes puede comunicarse con la p\u00e1gina HTML que le da soporte siempre que la escena est\u00e9 embebida mediante un iframe, y tambi\u00e9n&nbsp;puede comunicarse con una&nbsp;p\u00e1gina HTML que haya sido abierta por ella a trav\u00e9s de un espacio HTMLIframe. En la imagen siguiente tenemos en el &lt;body&gt; de una p\u00e1gina html un &lt;iframe&gt; a trav\u00e9s del cual se embebe un fichero html ( en este caso ese archivo se denomina comunicacion_Descartes.html), el cual contiene una escena de Descartes. Para que<\/p>\n<a class=\"more-link\" rel=\"nofollow\" href=\"https:\/\/reddescartes.org\/documentacion\/comunicacion-escena-html-usando-descartesjs\/\">[Leer m\u00e1s...]<\/a>","protected":false},"author":9,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[103,8,84],"tags":[],"_links":{"self":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts\/2729"}],"collection":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/comments?post=2729"}],"version-history":[{"count":22,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts\/2729\/revisions"}],"predecessor-version":[{"id":3434,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts\/2729\/revisions\/3434"}],"wp:attachment":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/media?parent=2729"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/categories?post=2729"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/tags?post=2729"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}