最近做了一些javascript相关的工作,把收获和大家分享一下,感谢下meizz,他的框架jsframework给我提供了许多现成的工具

title这个元素比较特殊

如果title中有经过htmlencode的字符,通过document.title获得的内容将会自动解码,并且在ie中通过给title加上一个id然后用document.getElementById(titleid).innerHTML来获得其中内容也仍然是已经解码的,而firefox则不会

<html><head><titleid="tt">&lt;iframe src=&quot;www.baidu.com&quot;/&gt</title></head><body><divid="dd">&lt;iframe src=&quot;www.baidu.com&quot;/&gt</div>document.title:<inputid="disp1"/><br/>document.getElementById(titleid):<inputid="disp2"/><br/>document.getElementbyId(divid):<inputid="disp3"/><scripttype="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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="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()方法可以包装这个变化

<html><body><divid="dd"><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/></div>scrollLeft:<inputid="disp1"/><br/>scrollTop:<inputid="disp2"/><br/><buttononclick="onClick()">获得scrollXY</button><scripttype="text/javascript">functiongetScrollXY(){varx,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};
}
functiononClick(){
document.getElementById(
"disp1").value=getScrollXY().x;
document.getElementById(
"disp2").value=getScrollXY().y;
}
</script></body></html>

firefox的outerHTML

firefox没有outerHTML这个很有用的属性,用下面这个方法可以让你的firefox也具有这个属性

if(typeof(HTMLElement)!="undefined"&&!window.opera){
HTMLElement.prototype.__defineGetter__(
"outerHTML",function()
  {
vara=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)returnstr+"/>";returnstr+">"+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":returnfalse;
    }
returntrue;
  });
}

firefox和ie的事件

firefox和ie的事件对象稍微不同,比方说下面这个在ie下获得鼠标位置的方法

<buttononclick="onClick()">获得鼠标点击横坐标</button><scripttype="text/javascript">functiononclick(){

alert(event.clientX);

}</script>

需要改成

<button οnclick="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的属性我们可以这样做

if(typeof(HTMLElement)!="undefined"&&!window.opera){

HTMLElement.prototype.__defineGetter__("children",function()
{
for(vara=[],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;}}returna;
});

}

几个有用的工具函数

在ff下模拟ie的insertAdjacentHTML

if(typeof(HTMLElement)!="undefined"&&!window.opera){

HTMLElement.prototype.insertAdjacentHTML=function(where, html)
{
vare=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);elsethis.parentNode.insertBefore(e,this.nextSibling);break;
   }
};

}

模拟DotNet的string.format

String.prototype.format=function()
{
if(arguments.length==0)returnthis;for(vars=this, i=0; i<arguments.length; i++)
    s
=s.replace(newRegExp("\\{"+i+"\\}","g"), arguments[i]);returns;
};

这样我们就可以在程序里使用诸如:

"username:{0} nickname {1}".format("yizhu2000","二毛五")

资源

meizz的blog http://blog.csdn.net/meizz/

最近用到的浏览器兼容javascript总结相关推荐

  1. 分享一个帮助你自定义标签并且兼容现代浏览器的javascript类库 : X-tag

    为什么80%的码农都做不了架构师?>>>    日期:2012-6-26  来源:GBin1.com 今天我们介绍一个能够帮助你自定义标签的js类库:x-tag,使用这个类库可以快速 ...

  2. JavaScript多浏览器兼容

    Javascript 多浏览器兼容 一.document.formName.item("itemName") 问题 问题说明:IE下,可以使用 document.formName. ...

  3. JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法

    JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法 参考文章: (1)JS IOS/iPhone的Safari浏览器不兼容Javascript中的D ...

  4. JavaScript解决常见浏览器兼容问题

    JavaScript解决常见浏览器兼容问题 我们提倡尽可能使用CSS,而且我们常常能做到这一点.现代浏览器有很好的CSS支持-这无疑足够好让你使用CSS来控制布局和版面设计.但是有时候,某些网页元素在 ...

  5. WEB浏览器兼容(转)

    这是我总结多年的一个小文档,最近看见有人咨询浏览器兼容的问题,就贡献出来. 并不一定全,有的也可能不准确,比如新出的IE8.Chrome等都没有太多涉及,虽然最近做的一些项目也兼容了IE8.Chrom ...

  6. html5新特性 移除哪些,html5\CSS3有哪些新特性、移除了哪些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5?...

    (1)HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,地理定位等功能的增加. 绘画canvas元素: 用于媒介回放的video和audio元素: 本地离线存储localStorage ...

  7. HTML5 标签、事件句柄属性以及浏览器兼容情况速查手册

    随着主流浏览器对 HTML5 的不断支持和完善,越来越多的开发者开始使用 HTML5 来开发各种功能强大的 Web 应用程序,HTML5 正引领互联网新革命.为了方便大家更好的学习 HTML5,今天这 ...

  8. 360安全浏览器兼容模式怎么设置_测试新手一定要知道:最实用的Web兼容性测试经验都在这...

    在日常工作中,我们经常碰到网页不兼容的问题.我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行. 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行:待测试项目能与 ...

  9. 第四节:教你如何快速让浏览器兼容ES6特性

    写在正文前,本来这一节的内容应该放在第二节更合适,因为当时就有同学问ES6的兼容性如何,如何在浏览器兼容ES6的特性,这节前端君会介绍一个抱砖引玉的操作案例. 为什么ES6会有兼容性问题? 由于广大用 ...

最新文章

  1. 神经网络debug太难了,这里有六个实用技巧
  2. bash--shell高级编程-变量的替换
  3. PWN-PRACTICE-BUUCTF-18
  4. 三言两语话敏捷(2) - 持续集成
  5. [GCN] 代码解析 of GitHub:Semi-supervised classification with graph convolutional networks
  6. 给android app添加注册机功能
  7. atitit.web原理 理论attilax总结
  8. java 反序列化 怎么知道类_理解java中的序列化与反序列化
  9. 校园卡系统mysql与java结合_基于Java+JSP+Mysq+Servletl的校园卡一卡通管理系统
  10. html自动播放音乐播放器代码,[界面设计] 关于HTML 音乐播放器代码|音乐播放器网页代码大全(转)...
  11. VMware Workstation Pro下载密钥
  12. 线性表的链式存储结构及操作的实现
  13. freeswitch呼叫系统
  14. Fragment运行时错误
  15. 深入理解C语言小括号用法
  16. 巨好用的数学公式编辑器安装教程
  17. 自我管理--做事要有明确的时间观念
  18. 自兴动脑人工智能课程学习笔记一:机器学习
  19. 什么软件可以搜索python答案_什的组词
  20. 2.4-关键点Keypoints

热门文章

  1. python两个时间点比较大小_python中如何比较两个时间点
  2. update core.php,WordPress更新失败-这通常是由于文件权限不一致所致。:wp-admin/includes/update-core.php...
  3. Spring Boot的RestTemplate 之exchange方法
  4. mysql sql语句提升_mysql基本sql语句大全(提升用语篇)
  5. ant部署web工程模板
  6. 表字段出现oracle sql语句关键字时
  7. oracle复制表结构与表数据
  8. 一次SpringBoot AutoWired 注入服务为null的事件
  9. springboot响应结果超长(7.8M)浏览器无法接收
  10. supermap试用许可过期如何重新申请