虽然通过 iframe 嵌套页面后,从浏览效果上看都是在同一个页面,但实际上 iframe 和父页面是相对独立了,iframe 内的页面和父页面之间并不能直接通过 js 操作对方。下面心月博主就通过小实例来演示,如何通过JavaScript 来实现 iframe 和父页面之间的相互操作。
1、子页面操作父页面
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> </head> <body> <div id="child">操作父级元素</div> <script type="text/javascript"> var childVar = "我是子页面变量"; $('#child').click(function(){ // 获取父页面的变量 alert(window.parent.window.parent.parentVar); //操作页面父元素 // jQuery 操作 $("#parentID",parent.document).after("<div style='height:100px;width:100px;background:#eee;float:left;'>jQuery操作:我来自iframe页面</div>") // 原生 JavaScript 操作 var div = document.createElement('div'); div.setAttribute("class","from-iframe"); div.innerHTML = "原生JavaScript操作:我来自iframe页面"; div.style.height = "100px"; div.style.width = "100px"; div.style.background = "#92e439"; div.style.float = "left"; window.parent.document.getElementsByClassName("container")[0].appendChild(div) }) </script> </body> </html>
2、父页面操作子页面
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <style type="text/css"> *{margin: 0;padding: 0;} iframe{clear: both;display: block;margin: 20px auto;width: 680px;height: auto;/*float: left;margin-left: 300px;*/} .container { display: block;min-width: 320px;max-width: 640px;font-size: 15.5px;font-family: -apple-system-font, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; color: #000;margin: 20px auto;} </style> </head> <body> <div class="container"> <div id="parentID">操作iframe</div> </div> <iframe src="child.html" id="iframeID" name="child-iframe"></iframe> <script type="text/javascript"> var parentVar = "我是父页面变量"; $('#parentID').click(function(){ // 获取子页面变量 alert(document.getElementById("iframeID").contentWindow.childVar); // 操作 iframe子页面 // jQuery 操作 $("#iframeID").contents().find('#child').after("<div style='height:100px;width:100px;background:#ffce44;float:left;'>jQuery操作:我来自父级页面</div>") // 原生 JavaScript 操作 document.getElementById("iframeID").contentDocument.getElementsByTagName('body')[0]; var div = document.createElement('div'); div.setAttribute("class","from-parent"); div.innerHTML = "原生JavaScript操作:我来自父级页面"; div.style.height = "100px"; div.style.width = "100px"; div.style.background = "#19a15f"; div.style.float = "left"; document.getElementById("iframeID").contentDocument.getElementsByTagName('body')[0].appendChild(div) }) </script> </body> </html>
实际效果:
【注意】
1、注意跨域问题,上面演示的小实例是在不跨域的前提下完成的,如果跨域的话会稍微复杂些。
2、实例中虽然只演示了变量获取和元素操作,还有函数调用没演示,不过函数可以看成是另类的变量,因此函数的调用可以参照变量的相互操作来实现。