首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

技术探讨:大家是怎么使非IE浏览器支持onresize的

2012-04-02 
技术探讨:大家是如何使非IE浏览器支持onresize的项目接近尾声了,今天客户发过来一些Bug要求修改,80%的都是

技术探讨:大家是如何使非IE浏览器支持onresize的
项目接近尾声了,今天客户发过来一些Bug要求修改,80%的都是关于UI的,其中有一项是要求
iframe自适应不能有滚动条。结合网上的代码很容易就实现了在Ie下比较完美,其中就利用了
一个table的onresize事件。我们是做企业应用的经理要求我们IE下能够运行就可以了,加上
进度卡的紧所以没敢耽搁没有做兼容性方面的尝试。平时写惯了兼容程序很讨厌这种IEOnly的
东西所以回来后自己有写了一下。虽然平时很痛恨IE的各种离奇的Bug但这个onresize确真的蛮
实用的。好了自己先来一段,大家有什么好的想法请回复

HTML code
<!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>模拟OnResize</title><style type="text/css">.divTest{    width:30%;    height:300px;    border:1px solid #339966;    float:left;    margin-left:20px;}</style><script type="text/javascript">function $(sId){    return document.getElementById(sId);}function sizeAdd(nChange){    var oDiv=$("div1");    oDiv.style.width=parseInt(oDiv.offsetWidth)+nChange+"px"}function handleResize(e){    var evt=e||event;    var srcEl=evt.target||evt.srcElement;        srcEl.innerHTML=Math.random();}/*-------------------------------------------////*浏览器不支持onresize则进行扫描*/(function(){    if(document.all){        return;    }        window.onload=function(){        window.setInterval(function(){            var tag,tags=document.body.getElementsByTagName("*");            var resizeSet,oldW,oldH,newW,newH;            var _this,_event;                        for(var i=0,len=tags.length;i<len;i++){                tag=tags[i];                resizeSet=tag.getAttribute("onresize");                                            if(resizeSet){                    oldW=tag.getAttribute("oldW");                    oldH=tag.getAttribute("oldH");                    newW=parseInt(tag.offsetWidth);                    newH=parseInt(tag.offsetHeight);                                        if(oldW    &&oldH&&((oldW!=newW)||(oldH!=newH))){                                            try{                            _this=tag;                            _event={                                srcElement:tag,                                target:tag                            };                                                        resizeSet=resizeSet.replace(/(this|event)(?!=\w+)/g,"_$1");                            eval(resizeSet);                        }catch(e){}                                    }                                        tag.setAttribute("oldW",newW);                    tag.setAttribute("oldH",newH);                        }            }                    },200);    };})();</script></head><body><input type="button" value="+" onclick="sizeAdd(20,20)"/><input type="button" value="-" onclick="sizeAdd(-20,-20)"/><br/><div id="div1" class="divTest" onresize="this.innerHTML=Math.random();"></div><div id="div2" class="divTest" onresize="handleResize(event);"></div></body></html>




[解决办法]
其他浏览器大部分都支持对窗口resize事件的支持,所以在窗口resize的时候调整相关的元素应该就好了吧
[解决办法]
不好意思语无伦次了,看懂了就成了……
[解决办法]
都是客户的“合理”要求吧,呵呵,感觉在网页上用onresize和onscroll之类的不好
[解决办法]
顶一下
------解决方案--------------------


有时候客户的要求是很苛刻的啊!!!
[解决办法]
那内容变化是什么造成的呢?肯定跟客户操作有关吧?那就捕获客户操作,在内容改变的时候做调整
[解决办法]
楼主例子里的需求没有碰到过,不过说到iframe高度自适应,传统的onload因为ajax的出现,iframe内的页面会因为非onload的情况下发生高度的改变,已经不太适用了,所以我的项目中只好用个interval来定时改变iframe的高度。

JScript code
function fitFrmHeight(o){    try{        var oWin = o.name ? window.frames[o.name] : o.contentWindow;        if(MSIE) if(oWin.document.readyState == 'complete') o.style.height = oWin.document.body.scrollHeight+'px';        if(Moz) o.style.height = oWin.document.documentElement.offsetHeight+'px';        if(Opera) o.style.height = oWin.document.documentElement.scrollHeight+'px';        if(Safari) o.style.height = oWin.document.documentElement.scrollHeight+'px';    }catch(e){}}window.setInterval(function(){    for(var i=0; i<Menu.Groups.length; i++){        if(Menu.Groups[i].oDiv.style.display != 'none'){            fitFrmHeight(Menu.Groups[i].oDiv.firstChild);            break;        }    }}, 200);
[解决办法]
还是跟我上面说的一样,内容变化是客户操作造成的,这里你进行了AJAX更新,那么在AJAX状态变化到4,也就是新内容下载完毕的时候,你就知道内容要变化了,为什么不在这里调整iframe高度呢?虽然对于现在的计算机来说一般可能感觉不到,但是当应用复杂了之后还是会很明显的,特别是大规模应用JS的情况下。
[解决办法]
探讨
还是跟我上面说的一样,内容变化是客户操作造成的,这里你进行了AJAX更新,那么在AJAX状态变化到4,也就是新内容下载完毕的时候,你就知道内容要变化了,为什么不在这里调整iframe高度呢?虽然对于现在的计算机来说一般可能感觉不到,但是当应用复杂了之后还是会很明显的,特别是大规模应用JS的情况下。

[解决办法]
探讨
在每个调用AJAX的地方都进行一次高度计算,是否有点别扭的感觉?

[解决办法]
楼主就别费心了w3c里标明其他浏览器支持onresize事件
http://www.w3school.com.cn/htmldom/dom_obj_event.asp
[解决办法]
还是定时指定一次iframe的高度好,方便点,有些像onmouseover事件,ajax等要做到每一次都触发调整窗口的事件代码会很难看.

定时是在客户端完成的,对客户端用户来说是基本感觉不到的
[解决办法]
to 15楼,
反正造成这些东西尺寸变化的是用户操作,而用户的操作最终要引起变化始终要经你的手。所以说到底改变这些元素的是你,理论上说你肯定会有合适的时机去调整这些元素,不需要依靠onresize这样的事件。只是要看你的代码怎么设计了,弄得不好就是乱七八糟一堆,绕进去了就出不来。
to 16楼,
做到AJAX完成时触发代码并不一定会很难看,相反是很基本的。举例来说Prototype和jQuery之类的库都对AJAX进行了封装,上面这样的应用直接用这些库都会很简单,还没到需要自己封装的地步。Web2.0发展下去对JS的要求是没有止境的,能省则省不应该是做程序员的基本追求吗?说下去又感觉我在装B了……实话实说,没有针对任何人的意思。做程序员的就追求这点效率!
[解决办法]
进来学习下。
[解决办法]
那么总结一下, 引起div变化的就三处地方吧? onresize, 菜单折叠, 还有div里的内容变化的时候. 调整代码是公用的, 那只要在这三处地方调用就行了, 哪里复杂呢?我有什么遗漏吗?

热点排行