Discuz教程网

js中将HTMLCollection/NodeList/伪数组转换成数组的代码

[复制链接]
authicon dly 发表于 2011-9-16 08:18:05 | 显示全部楼层 |阅读模式
这里把符合以下条件的对象称为伪数组
1,具有length属性
2,按索引方式存储数据
3,不具有数组的push,pop等方法

1,function内的arguments 。
2,通过document.forms,Form.elements,Select.options,document.getElementsByName() ,document.getElementsByTagName() ,childNodes/children 等方式获取的集合(HTMLCollection,NodeList)等。
3,特殊写法的对象 ,如
  1. var obj={};
  2. obj[0] = "一";
  3. obj[1] = "二";
  4. obj[2] = "三";
  5. obj.length = 3;
复制代码

它们不具有数组的一些方法如push, pop, shift, join等。有时候需要将这些伪数组转成真正的数组,这样可以使用push, pop等方法。以下是工具函数makeArray
  1. var makeArray = function(obj){
  2. return Array.prototype.slice.call(obj,0);
  3. }
  4. try{
  5. Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType;
  6. }catch(e){
  7. makeArray = function(obj){
  8. var res = [];
  9. for(var i=0,len=obj.length; i<len; i++){
  10. res.push(obj[i]);
  11. }
  12. return res;
  13. }
  14. }
复制代码

以下分别测试以上三种伪数组
  1. //定义一个函数fun,内部使用makeArray将其arguments转换成数组
  2. function fun(){
  3. var ary = makeArray(arguments);
  4. alert(ary.constructor );
  5. }
  6. //调用
  7. fun(3,5);

  8. //假设页面上有多个段落元素p
  9. var els = document.getElementsByTagName("p");
  10. var ary1 = makeArray(els);
  11. alert(ary1.constructor);

  12. //特殊的js对象(如jquery对象)
  13. var obj={};
  14. obj[0] = "一";
  15. obj[1] = "二";
  16. obj[2] = "三";
  17. obj.length = 3;
  18. var ary2 = makeArray(obj);
  19. alert(ary2.constructor);
复制代码



上一篇:仅Firefox中链接A无法实现模拟点击以触发其默认行为
下一篇:对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-8-2 14:49

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表