IE9之前的IE版本的HTMLCollection以及NodeList不是Object的子类。

在通过Array.prototype.slice.call进行数组化的时候,IE9之前的IE版本会抛出异常,因此需要进行兼容处理。

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style rel="stylesheet" type="text/css">
</style>
<script>
window.onload=function(){
var n=document.getElementsByTagName("div");
try{
document.body.innerHTML=[].slice.call(n,0);
}
catch(ex){
document.body.innerHTML="ERROR:"+ex.message;
}
}
</script>
</head>
<body><div class="show">HELLO</div><div></div></body>
</html>

兼容实现需要兼容IE9一下的IE版本,动手实现slice方法,
考虑到String对象,Window对象,Function对象,RegExp对象(黑莓4.7中)都有length属性,因此需要排除。
一个可能的实现如下:

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script>
window.onload=function(){
var n=document.getElementsByTagName("div");
try{
document.body.innerHTML+=[].slice.call(n,0);
}
catch(ex){
document.body.innerHTML+="ERROR:"+ex.message;
}
document.body.innerHTML+="<br/>"+getA(n,0);
}; var bIEltIE9=(function(){
var ag=window.navigator.userAgent.toLowerCase();
var reg=new RegExp("msie ([\\S]+);");
if(reg.test(ag)){
var version=RegExp.$1;
if(parseInt(version)<9){
return true;
}
}
return false;
})(); var getA=function(a,start,end){
if(a==null){
return [];
}
if(!bIEltIE9){
try{
return [].slice.call(a,start,end);
}
catch(ex){}
}
var ret=[];
var i=a.length;
// 如果为空或者为字符串或者为函数或者为window对象或者为RegExp
if(i==null||typeof a ==="string"||typeof a==="function"||a.setInterval||a instanceof RegExp){
ret[0]=a;
}
else{
while(i){
ret[--i]=a[i];
}
}
return ret; }; </script>
</head>
<body><div class="show">数组化</div><div></div></body>
</html>

上面代码的function和window判断不严瑾,具体参考:JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱

更多可以参考:

  • 《JavaScript框架设计 司徒正美》P4 数组化。
  • 《JQuery技术内幕》P68 数组操作方法。

最新文章

  1. 到爱尔兰敲代码 / Come, Coding in Ireland
  2. java上传xls文件
  3. windows qt 编译 boost 添加 路径
  4. OVER(PARTITION BY)函数用法
  5. js sort() 排序的问题
  6. mysql 处理查询请求过程
  7. thinkphp 模板调用数据
  8. Windows&#160;Server&#160;2008&#160;R2(x64)&#160;IIS7+PHP5(FastCGI)环境搭建
  9. 如何用 OneAPM 优化你的 Node.js 应用?
  10. 【IOS】分享下近一年IOS开发的经验总结
  11. 骑士飞行棋 C#代码详解
  12. 水晶報表中小寫變大寫的函數-VB
  13. Android常用开发工具的用法
  14. C#多线程的用法1-简单示例
  15. 对eigrp默认网络的理解!
  16. Junit4学习(二)测试失败的情况
  17. awk统计文本里某一列重复出现的次数
  18. 在Git中添加一个项目
  19. Go使用详解
  20. How to change the implementation (detour) of an externally declared function

热门文章

  1. Javascript基础学习(1)_类型、值和变量
  2. linunx 定位最耗资源的进程
  3. 三步走起 提升 iOS 审核通过率 下篇
  4. Objective-C发展历史
  5. JPEG 图
  6. PHP实战开发教程
  7. 实现Word的列表样式
  8. Java 内存区域和GC机制--备用
  9. Java实现Http服务器(四)
  10. BZOJ 3569 DZY Loves Chinese II