最近用到的浏览器兼容javascript总结
来源:互联网 发布:淘宝开店培训课程 编辑:程序博客网 时间:2024/05/01 02:04
最近做了一些javascript相关的工作,把收获和大家分享一下,感谢下meizz,他的框架jsframework给我提供了许多现成的工具
title这个元素比较特殊
如果title中有经过htmlencode的字符,通过document.title获得的内容将会自动解码,并且在ie中通过给title加上一个id然后用document.getElementById(titleid).innerHTML来获得其中内容也仍然是已经解码的,而firefox则不会
<head>
<title id="tt"> <iframe src="www.baidu.com"/> </title>
</head>
<body>
<div id="dd"> <iframe src="www.baidu.com"/></div>
document.title:<input id="disp1" /><br />
document.getElementById(titleid):<input id="disp2" /><br/>
document.getElementbyId(divid):<input id="disp3" />
<script type="text/javascript" >
document.getElementById("disp1").value=document.title;
document.getElementById("disp2").value=document.getElementById("tt").innerHTML;
document.getElementById("disp3").value=document.getElementById("dd").innerHTML;
</script>
</body>
</html>
ie中的结果
firefox的结果
xhtml不支持document.body.scrollTop
当为html文档加上如下头以支持xhtml过渡标准时候,使用document.body.scrollTop值始终为0
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
这是document.body.scrollTop始终为0,这时需要用document.documentElement.scrollTop才能获得正确的值
而如果不加xhtml的申明,document.documentElement.scrollTop将为0
下面这个getScrollXY()方法可以包装这个变化
<body>
<div id="dd"> <br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
</div>
scrollLeft:<input id="disp1" /><br />
scrollTop:<input id="disp2" /><br/>
<button onclick="onClick()" >获得scrollXY</button>
<script type="text/javascript" >
function getScrollXY(){
var x,y;
if(document.body.scrollTop){
x=document.body.scrollLeft;
y=document.body.scrollTop;
}
else{
x=document.documentElement.scrollLeft;
y=document.documentElement.scrollTop;
}
return {x:x,y:y};
}
function onClick(){
document.getElementById("disp1").value=getScrollXY().x;
document.getElementById("disp2").value=getScrollXY().y;
}
</script>
</body>
</html>
firefox的outerHTML
firefox没有outerHTML这个很有用的属性,用下面这个方法可以让你的firefox也具有这个属性
HTMLElement.prototype.__defineGetter__("outerHTML",function()
{
var a=this.attributes, str="<"+this.tagName, i=0;for(;i<a.length;i++)
if(a[i].specified) str+=" "+a[i].name+'="'+a[i].value+'"';
if(!this.canHaveChildren) return str+" />";
return str+">"+this.innerHTML+"</"+this.tagName+">";
});
HTMLElement.prototype.__defineGetter__("canHaveChildren",function()
{
switch(this.tagName.toLowerCase())
{
case "area": case "base": case "basefont":
case "col": case "frame": case "hr":
case "img": case "br": case "input":
case "link": case "meta": case "isindex":
case "param":return false;
} return true;
});
}
firefox和ie的事件
firefox和ie的事件对象稍微不同,比方说下面这个在ie下获得鼠标位置的方法
<script type="text/javascript">
function onclick(){
alert(event.clientX);
}
</script>
需要改成
<button onclick="onClick(event)">获得OuterHTML</button>
<script type="text/javascript">
function onclick(event){
alert(event.clientX);
}
</script>
才能在两种浏览器下使用
children与childNodes
ie提供的children,childNodes和firefox下的childNodes的行为是有区别的,firefox下childNodes会把换行和空白字符都算作父节点的子节点,而ie的childNodes和children不会
比如
<div id="dd">
<div>yizhu2000</div>
</div>
id为dd的div在ie下用childNodes查看,其子节点数为1,而ff下为三,我们可以从ff的dom查看器里面看到他的childNodes为["/n ", div, "/n"]
要在ff下模拟children的属性我们可以这样做
HTMLElement.prototype.__defineGetter__("children",function()
{
for(var a=[],j=0,n,i=0; i<this.childNodes.length; i++){
n=this.childNodes[i];if(n.nodeType==1){a[j++]=n;if(n.name){
if(!a[n.name])a[n.name]=[]; a[n.name][a[n.name].length]=n;}
if(n.id) a[n.id]=n;}}return a;
});
}
几个有用的工具函数
在ff下模拟ie的insertAdjacentHTML
HTMLElement.prototype.insertAdjacentHTML=function(where, html)
{
var e=this.ownerDocument.createRange();
e.setStartBefore(this);
e=e.createContextualFragment(html);
switch (where)
{
case 'beforeBegin': this.parentNode.insertBefore(e, this);break;
case 'afterBegin': this.insertBefore(e, this.firstChild); break;
case 'beforeEnd': this.appendChild(e); break;
case 'afterEnd':
if(!this.nextSibling) this.parentNode.appendChild(e);
else this.parentNode.insertBefore(e, this.nextSibling); break;
}
};
}
模拟DotNet的string.format
{
if(arguments.length==0) return this;
for(var s=this, i=0; i<arguments.length; i++)
s=s.replace(new RegExp("//{"+i+"//}","g"), arguments[i]);
return s;
};
这样我们就可以在程序里使用诸如:
"username:{0} nickname {1}".format("yizhu2000","二毛五")
资源
meizz的blog http://blog.csdn.net/meizz/
- 最近用到的浏览器兼容javascript总结
- 最近用到的浏览器兼容javascript总结
- 最近用到的浏览器兼容javascript总结
- 最近用到的浏览器兼容javascript总结
- JavaScript 兼容浏览器的部分问题的总结及解决方法
- 记最近ie浏览器的兼容
- 最近用到的JavaScript框架整理/学习
- 最近用到的shell命令总结
- 最近项目用到的技术总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- Javascript和CSS浏览器兼容总结
- FleaPHP 开发指南
- CSDN英雄会上会英雄
- FleaPHP 开发指南 - 4. 命名规范和目录结构
- 恶搞的NVIDIA驱动
- 唐骏:社会最需要一天之内读懂一本书60%的人
- 最近用到的浏览器兼容javascript总结
- DataGrid 的一些使用总结
- 用boost验证整数、浮点数输入
- Web MVC框架-视图模板查找及组织
- 安装GPhone SDK
- FleaPHP 开发指南 - 8. 如何使用 RBAC 组件实现访问控制
- FleaPHP 开发指南 - 3. 应用程序入口
- 系统集成项目招标要诀
- 关于 FleaPHP