页面A通过iframe嵌入页面B:<body>
<iframe width="100%" height="490" frameborder="0" scrolling="no" onload="this.height=100" src="B.html" id="mainIframe" />
<script type="text/javascript">
var initIframe = function(){
var ifm= document.getElementById("mainIframe");
try{
var bHeight = ifm.contentWindow.document.body.scrollHeight;
var dHeight = ifm.contentWindow.document.documentElement.scrollHeight; var height = Math.max(bHeight, dHeight); ifm.height = height;
}catch (ex){
alert(ex.message);
}
}
window.setInterval("initIframe()",200); //iframe自适应高度
</script>
</body>B页面很长,而且设置第一个文本域聚焦:<head>
<script type="text/javascript">
window.onload = function(){document.getElementById("test").focus();};
</script>
</head>
<body>
<br />
......<!--很多个<br />不一一列出,保证页面有滚动条-->
<br />
<input type="text" id="test" />
</body>我们知道当我们打开页面A时,iframe加载完B,B页面的文本域聚焦,此时焦点在B页面,B页面是通过iframe导入,即
<iframe width="100%" height="490" frameborder="0" scrolling="no" onload="this.height=100" src="B.html" id="mainIframe" />
这个iframe设置了scrolling="no",而且iframe做了自适应高度设置,此时B页面聚焦按理说聚焦过程页面会往下跑,但是此时显然不可以了,因为滚动条没有了,但是现在需要父页面的滚动条往下跑,达到子页面聚焦显示的效果。
此时方案一在父页面获取子页面第一个聚焦元素的位置,通过计算设置父页面的scrollTop是行不通的,因为焦点在子页面。
方案二在子页面计算聚焦元素的位置设置父页面窗口scrollTop,这样做会有个问题,父页面加载子页面需要时间,子页面加载文档需要时间,我在子页面window.onload里处理此操作子页面并没有反应,在子页面获取父页面iframe元素,绑定onload事件,在onload结束后操作,也行不通。只有在子页面设置延时,setTimeout,此时可以出现所要的效果,但是这并不是什么好办法,应为我们无法判别网络延时。求好的解决方案,150分奉上,求大神指教方案一://A页面处理
var initIframe = (function(){
var top = 0;
var temp = false;
return function() {
var ifm= document.getElementById("mainIframe");
try{
var bHeight = ifm.contentWindow.document.body.scrollHeight;
var dHeight = ifm.contentWindow.document.documentElement.scrollHeight;
if(ifm.contentWindow.document){
var subDoc = ifm.contentWindow.document;
if(top){
//alert(top);
if(document.documentElement && document.documentElement.scrollTop){
document.documentElement.scrollTop = top;
}else if(document.body){
document.body.scrollTop = top;
}
temp = true;
}else if(!top && !temp){
top = $(":focus:first",subDoc).offset().top;
}
}
var height = Math.max(bHeight, dHeight); ifm.height = height;
}catch (ex){
alert(ex.message);
}
}
})();window.setInterval("initIframe()",3000); 方案二:window.onload = function(){
document.getElementById("test").focus();
var $input = $("#test");
var top = $input.offset().top;
var ifm = parent.document.getElementById("mainIframe");
if ( $.browser.msie ) {
ifm.attachEvent( "onload", finish );
} else {
ifm.onload = $.browser.opera ? function(){ this.onload = finish; } : finish;
}
}function finish(){
if(document.documentElement && document.documentElement.scrollTop){
document.documentElement.scrollTop = 0;
parent.document.documentElement.scrollTop = top;
}else if(document.body){
parent.document.body.scrollTop = top;
}
}代码中混用jQuery只是为了用它的offset方法,以后代码自会优化
<iframe width="100%" height="490" frameborder="0" scrolling="no" onload="this.height=100" src="B.html" id="mainIframe" />
<script type="text/javascript">
var initIframe = function(){
var ifm= document.getElementById("mainIframe");
try{
var bHeight = ifm.contentWindow.document.body.scrollHeight;
var dHeight = ifm.contentWindow.document.documentElement.scrollHeight; var height = Math.max(bHeight, dHeight); ifm.height = height;
}catch (ex){
alert(ex.message);
}
}
window.setInterval("initIframe()",200); //iframe自适应高度
</script>
</body>B页面很长,而且设置第一个文本域聚焦:<head>
<script type="text/javascript">
window.onload = function(){document.getElementById("test").focus();};
</script>
</head>
<body>
<br />
......<!--很多个<br />不一一列出,保证页面有滚动条-->
<br />
<input type="text" id="test" />
</body>我们知道当我们打开页面A时,iframe加载完B,B页面的文本域聚焦,此时焦点在B页面,B页面是通过iframe导入,即
<iframe width="100%" height="490" frameborder="0" scrolling="no" onload="this.height=100" src="B.html" id="mainIframe" />
这个iframe设置了scrolling="no",而且iframe做了自适应高度设置,此时B页面聚焦按理说聚焦过程页面会往下跑,但是此时显然不可以了,因为滚动条没有了,但是现在需要父页面的滚动条往下跑,达到子页面聚焦显示的效果。
此时方案一在父页面获取子页面第一个聚焦元素的位置,通过计算设置父页面的scrollTop是行不通的,因为焦点在子页面。
方案二在子页面计算聚焦元素的位置设置父页面窗口scrollTop,这样做会有个问题,父页面加载子页面需要时间,子页面加载文档需要时间,我在子页面window.onload里处理此操作子页面并没有反应,在子页面获取父页面iframe元素,绑定onload事件,在onload结束后操作,也行不通。只有在子页面设置延时,setTimeout,此时可以出现所要的效果,但是这并不是什么好办法,应为我们无法判别网络延时。求好的解决方案,150分奉上,求大神指教方案一://A页面处理
var initIframe = (function(){
var top = 0;
var temp = false;
return function() {
var ifm= document.getElementById("mainIframe");
try{
var bHeight = ifm.contentWindow.document.body.scrollHeight;
var dHeight = ifm.contentWindow.document.documentElement.scrollHeight;
if(ifm.contentWindow.document){
var subDoc = ifm.contentWindow.document;
if(top){
//alert(top);
if(document.documentElement && document.documentElement.scrollTop){
document.documentElement.scrollTop = top;
}else if(document.body){
document.body.scrollTop = top;
}
temp = true;
}else if(!top && !temp){
top = $(":focus:first",subDoc).offset().top;
}
}
var height = Math.max(bHeight, dHeight); ifm.height = height;
}catch (ex){
alert(ex.message);
}
}
})();window.setInterval("initIframe()",3000); 方案二:window.onload = function(){
document.getElementById("test").focus();
var $input = $("#test");
var top = $input.offset().top;
var ifm = parent.document.getElementById("mainIframe");
if ( $.browser.msie ) {
ifm.attachEvent( "onload", finish );
} else {
ifm.onload = $.browser.opera ? function(){ this.onload = finish; } : finish;
}
}function finish(){
if(document.documentElement && document.documentElement.scrollTop){
document.documentElement.scrollTop = 0;
parent.document.documentElement.scrollTop = top;
}else if(document.body){
parent.document.body.scrollTop = top;
}
}代码中混用jQuery只是为了用它的offset方法,以后代码自会优化
<head>
<script type="text/javascript">
window.location="B.html#aaa";
window.onload = function(){document.getElementById("test").focus();};
</script>
</head>
<body>
<br />
<br />
<br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br /><br />
<br />
<br />
<br />
......<!--很多个<br />不一一列出,保证页面有滚动条-->
<br />
<a name="aaa"></a>
<input type="text" id="test" />
</body>
现在的解决方案为://B页面
var timer,top;window.onload = function(){
document.getElementById("test").focus();
var $input = $("#test");
top = $input.offset().top;
var ifm = parent.document.getElementById("mainIframe");
finish();
}function finish(){
if(document.documentElement){
document.documentElement.scrollTop = 0;
parent.document.documentElement.scrollTop = top;
}else if(document.body){
parent.document.body.scrollTop = top;
}
if((parent.document.documentElement.scrollTop || parent.document.body.scrollTop) && timer){
clearTimeout(timer);
}else{
timer = setTimeout(finish,20);
}
}简单说下,在B页面设置setTimeout,重复设置父页面scrollTop 值,并监听父页面的scrollTop 是否有值,如果有值则清掉延时函数。这个方法上传到服务器,稍微改下是可以用的。但这并不是什么好办法。
下面的例子是一个子窗体调用方法改变父窗体主页面 cc.html<html>
<head>
<script type="text/javascript">
function temp(id) {
document.getElementById("temp").src = id;
}
function temps(id) {
alert(id);
}
</script>
</head>
<body>
主页
<a href="#" id="bb.html" onclick="temp(this.id);" > bb</a>
<a href="#" id="xx.html" onclick="temp(this.id);" > cc</a>
<Iframe id="temp" src="xx.html" width="500" heitht="600">aa</IFRAME>
</body>
</html>子页面 xx.html<html><body>
这是第一个子页面
</body>
</html>子页面 bb.html<html>
<body>
第二个子页面
<a href="#" id="xx.html" onclick="window.parent.temp(this.id);" > cc</a>
</body>
</html>把这三个页面放在同一个目录下面 ,打开主页面试一下再对着代码看一下你就会找到你所需要的东西了
以下是iframe的一些语法
标记的使用格式是:
<Iframe src="URL" width="x" height="x" scrolling="[OPTION]" frameborder="x"></iframe>
src:文件的路径,既可是HTML文件,也可以是文本、ASP等;
width、height:"画中画"区域的宽与高;
scrolling:当SRC的指定的HTML文件在指定的区域不显不完时,滚动选项,如果设置为NO,则不出现滚动条;如为Auto:则自动出 现滚动条;如为Yes,则显示;
FrameBorder:区域边框的宽度,为了让“画中画“与邻近的内容相融合,常设置为0
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<div style="height:200px;">a</div>
<iframe width="100%" height="490" frameborder="0" scrolling="no" src="b.html" id="mainIframe" /></iframe>
<div style="height:200px;">b</div>
</body>
</html>b.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p>
<input type="text" id="test" />
<script type="text/javascript">
window.onload = function() {
parent.document.getElementById('mainIframe').style.height = document.documentElement.scrollHeight + 'px';
document.getElementById("test").focus();
}
</script>
</body>
</html>