当前位置: 首页 > Web前端 > HTML

跨域修改iframe页面内容

时间:2023-04-02 19:49:27 HTML

原理主站嵌入代理页面,向代理页面传输数据。代理页面根据主站点的数据操作目标页面的DOM。由于代理页面与目标页面在同一个域中,因此代理页面可以获取并操作目标页面的文档对象。前提是proxy.html需要放在和内嵌iframe页面同域的服务下,并且可以访问。支持2种调用方式:使用postMessage和URLparams.postMessage该方法需要使用JSON.stringify将对象转为字符串//ReactfunctionIframeProxy(props){handleLoad=(e)=>{e.target.contentWindow.postMessage(JSON.stringify({iframe:``,includeStyle:`body{background-color:yellow;}header{display:none;}footer{display:none;}`,includeScript:`window.addEventListener('load',function(){alert(document.querySelector('body').innerHTML);});`,importStyle:`http://www.mydomain.com/assets/css/import.css`,importScript:`http://www.mydomain.com/assets/js/import.js`}),'https//www.target.com');}返回proxy.html?origin=${window.location.protocol}//${window.location.host}`}frameBorder="0"scrolling="no">;}URL参数该方法需要将传的内容使用encodeURIComponent编码。//ReactfunctionIframeProxy(props){varparams='iframe='+encodeURIComponent(``);params+='&includeStyle='+encodeURIComponent(`body{background-color:red;}标题{显示:无;}页脚{显示:无;}`);params+='&includeScript='+encodeURIComponent(`window.addEventListener('load',function(event){alert(document.querySelector('body').innerHTML);});`);params+='&importStyle='+encodeURIComponent(`http://www.mydomain.com/assets/css/import.css`);params+='&importScript='+encodeURIComponent(`http://www.mydomain.com/assets/js/import.js`);回报params}`}frameBorder="0"scrolling="no">;}API;params:{origin:当前站点的域名,使用postMessage方法时需要,proxy用于验证消息的来源域名。iframe:需要嵌入的iframe标签字符串,includeStyle:要添加到iframe页面的css内容,在includeScript:要添加到iframe页面的js内容,importStyle:要导入到iframe页面的css资源链接,如果目标站点使用安全协议(https),资源链接使用非安全协议protocol(http),该函数会被浏览器禁止。importScript:希望将js资源链接导入iframe页面。如果目标站点使用安全协议(https),而资源链接使用非安全协议(http),该功能将被浏览器禁止。}注意:由于安全问题,默认禁用includeScript并启用importScript函数。要启用proxy.html中的变量ENABLED_JS_INCLUDE,请将其设置为true。资源https://github.com/stephenliu1944/cross-domain-iframe-proxy