Le scénario d'application est le suivant : la page iframe n'a pas de barres de défilement. Si une barre de défilement apparaît dans le formulaire parent, la balise d'ancrage deviendra invalide car le point d'ancrage fait défiler la fenêtre en fonction de la barre de défilement actuelle de la fenêtre et disparaît après. cela devient un formulaire enfant. La barre de défilement ne défilera naturellement pas.
La solution est : utilisez js pour déterminer si la page est imbriquée, utilisez js pour calculer la position de l'iframe dans le formulaire parent, la position du point d'ancrage dans la firame, et ajoutez les deux pour devenir le défilement de le formulaire parent.
J'ai rencontré un problème : obtenez l'élément de formulaire parent (en raison des restrictions de domaine, tous doivent être dans l'environnement réseau (c'est-à-dire http://domain.com)) ; une page iframe actuelle.
Code :
Page du formulaire parent index.html
<!doctype html> <html> <head> <title></title> <style type="text/css"> *{ margin: 0; padding: 0; border: 0; } html, body{ width: 100%; height: 100%; } </style> </head> <body> <div style="width:100%;background:#f00;height:500px;"></div> <a href="">dd</a> <a href="">ddd</a> <iframe name="iframe2" id="iframe2" src="iframe.html?a=b&c=d" style="width:100%;height:2060px;"></iframe> <iframe name="iframe2" id="iframe2" src="iframe.html?a=d&c=b" style="width:100%;height:2060px;"></iframe> </body> </html>
Page de sous-formulaire iframe.html
<!doctype html> <html> <head> <title></title> <style type="text/css"> a{ padding: 5px; border: 1px solid #f00; float: left; display: block; margin-right: 5px; } div{ width: 80%; margin: 10px auto; height: 500px; border: 1px solid #f00; font-size: 30px; } </style> <script type="text/javascript" src="jquery-1.8.2.min.js"></script> <script type="text/javascript"> $(function(){ //如果是iframe则需要在网络中访问,因为js里有域限制 //如果没有iframe则不进行处理, if(window!==window.top){ //获取top窗口中的iframe,如果有iframe嵌套过多,请自行修改 var iframeList=window.top.document.getElementsByTagName('iframe'); for(var i=0;i<iframeList.length;i++){ //判断当前窗口是否循环中的iframe if(window.location.toString().indexOf(iframeList[i].getAttribute('src').toString())!=-1){ //等自己的所在iframe加载完成给a锚点加事件 window.top.document.getElementsByTagName('iframe')[i].onload=function(){ //确定iframe在父窗体的距顶部距离 var top = window.top.document.getElementsByTagName('iframe')[i].offsetTop; $('a').each(function(){ var href = $(this).attr('href'); if(href.indexOf('#')!=-1){//判断是否是锚点而不是链接 var name = href.substring(href.indexOf('#')+1); $(this).bind('click',function(){ $('a').each(function(){ if($(this).attr('name')==name){ //父窗口滚动 $(window.parent).scrollTop($(this).offset().top+top); } }); }); } }); } } } } }); </script> </head> <body> <a href="#a" rel="external nofollow" >a</a> <a href="#b" rel="external nofollow" >b</a> <a href="#c" rel="external nofollow" >c</a> <a href="#d" rel="external nofollow" >d</a> <div><a href="" name=" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" a">A</a></div> <div><a href="" name=" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" b">B</a></div> <div><a href="" name=" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" c">C</a></div> <div><a href="" name=" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" d">D</a></div> </body> </html>