El error se produce al intentar obtener el valor de un iframe:
1 |
<iframe name='contrato' id="contrato" src=".."></iframe> |
1 2 3 |
<script> var noPublicidad = $('iframe[name=contrato]').contents().find('#nopublicidad').is(":checked"); <script/> |
Es debido a medidas de seguridad del navegador y solo permite leer los inputs de un iframe si esta en el mismo protocolo, sobre el mismo dominio y el mismo puerto
P.e: si la página es http://www.mipagina.es/
El frame debe estar dentro de ese host
Accede a esta url para más información: http://javascript.info/tutorial/same-origin-security-policy
La solución pasa por el envío y recepción de mensajes entre páginas.
En mi caso tengo una página donde cargo un iframe con el contrato y en el tengo un input para indicar si no desea recibir publicidad
En la página principal tengo un botón de “Aceptar”.
-Página principal
Parte html:
1 2 3 4 5 6 |
<html> <iframe name='contrato' id="contrato" src="http://urlDiferente/contrato.html"></iframe> <input onclick="AceptarContrato();" id="btnAceptar" type="button" class="btn-arrow" value="Aceptar" /> <html/> |
Script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<script type="text/javascript"> //Se añade este código para capturar el mensaje e indicar que función se encarga de tratarlo (window.addEventListener && window.addEventListener("message", MensajeDesdeIframe, false) || window.attachEvent && window.attachEvent("onmessage", MensajeDesdeIframe)); function MensajeDesdeIframe(e) { //Leo lo que me llega del Iframe //recomiendo validar la web iframe para asegurarme que sea la mia. if (e.origin !== 'http://urlDiferente/contrato.html') return; var frameVariables = e.data, arr=frameVariables.split(",") var origen=arr[0]; var noPublicidad= arr[1]; alert(noPublicidad); //Hacer las accionse que se deseen } function AceptarContrato() { //Realizo la llamada para obtener los valores del frame var frame = document.getElementById("contrato"); var mensajeObtenerValores = "obtenerNoAutorizacion"; if (frame.contentWindow!=null) frame.contentWindow.postMessage(mensajeObtenerValores, "*"); else if (frame.contentDocument!=null) frame.contentDocument.postMessage(mensajeObtenerValores, "*"); } </script> |
-Página del iframe
Parte html
1 2 3 4 |
<html> ...texto.... <input type='checkbox' name='nopublicidad' id='nopublicidad' /> <b>No desee recibir información de sus productos ni promociones</b> <html> |
Script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<script type="text/javascript"> function Mensaje(e) { //if (e.origen!=) return; if (e.data=='obtenerNoAutorizacion') { var noPublicidad=document.getElementById('nopublicidad').checked; var urlorigen=e.origin; var mensajeDevolverValores=urlorigen+','+noPublicidad; e.source.postMessage (mensajeDevolverValores,urlorigen); //Le devolvemos la respuesta con el valor del input } } ( window.addEventListener && window.addEventListener('message', Mensaje, false) || window.attachEvent && window.attachEvent('onmessage', Mensaje) ); </script> |