本帖最后由 zkylm 于 2011-12-05 22:29:57 编辑

解决方案 »

  1.   

    apply不是这么用的
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE></TITLE> </HEAD> <BODY>
     <div>1</div>
     <div>3</div>
     <div>3</div><Script>
    (function(){
      var ele = {};
      ele.push = Array.prototype.push;
      var t = document.getElementsByTagName('div');
      var tmp = Array.prototype.slice.call(t,0);
      for(i=0;i<tmp.length;i++){
        if(i==0)ele.push(ele,tmp[i]);
      }
      for(k in ele)alert(k+' / '+ele[k]);
    })();
    </Script>
     </BODY>
    </HTML>
      

  2.   

    谢谢上面的 , 你的代码我没测 , 凭直觉认为你的代码是对的 .
    我有一个问题 , 如果我用了 apply , 也就是
    ele.push.apply(ele,tmp[i]);
    那么是不是相当于
    var x = new ele;
    这个时候
    x[0] 就等于 tmp[0]?
    这个我自己会去确定 , 还有一个疑问 , 什么偏偏只有 IE 8 及其以下版本无效 ? 其他浏览器全部有效 ?
    ( IE 9.0 也是 OK 的 )
      

  3.   


    (function(){
      var ele = [];
      ele.push = Array.prototype.push;
      var t = document.getElementsByTagName('div');
      for(var i=0;i<t.length;i++){
        if(i==0)ele.push.call(ele,t[i]);
      }
      for(k in ele)alert(k+' / '+ele[k]);
    })();这样呢?
      

  4.   

    1 楼的 , 话说早了 , NND , IE 上
    var tmp = Array.prototype.slice.call(t,0);
    不能运行 , 纠结了 , 为啥不能使用呢 ?
      

  5.   

    #3 的程序在 IE 下是可以的 , 但为什么非要将
    ele 声明为数组呢 ?
    我就执迷与对象 ? 难道不行吗 ? 纠结
      

  6.   

    已经声明为数组了 , 为什么还要
    ele.push = Array.prototype.push;
    这一行呢 ?
    谁能告诉我 , 如果声明为对象 , 需要怎样做 ?
      

  7.   

    push是数组的方法,你定义的var ele = {}是一个对象,谢谢。。(function(){
      var ele = [];
      ele.push = Array.prototype.push;
      var t = document.getElementsByTagName('div');
      var tmp = Array.prototype.slice.call(t,0);
      for(i=0;i<tmp.length;i++){
        if(i==0)ele.push.apply(ele,tmp[i]);
      }
      for(k in ele)alert(k+' / '+ele[k]);
    })();
      

  8.   

    slice是数组的原型方法,你这么用就是把类数组的对象转换成数组对象,显然你已经明白t返回的并不是数组对象,是一个集合类似nodeList,但是这个不像arguments对象一样可以支持slice,应该说IE下不支持,具体原因我也不知道,楼主要实现效果要么不用Array.prototype.slice.call这个,要么把t先转换为数组,转换方法就是遍历集合中的元素把它添加到新数组中去。
    跟这个问题有点像,可以参考http://topic.csdn.net/u/20090925/14/f67dbf2e-90e5-441b-ae6e-7551e3da880d.html
      

  9.   

    谢谢以上的 , 问题已经解决了 .
    是我看 jQuery 看的不到位 .
    jQuery 中有这么一段 : 
    var makeArray = function( array, results ) {
    array = Array.prototype.slice.call( array, 0 ); if ( results ) {
    results.push.apply( results, array );
    return results;
    }

    return array;
    };
    定义了 makeArray . 我就理解为任何浏览器都支持这个 Array.prototype.slice.call 了 , 因为你 $('div') 的时候 , 它使用了这个方法将选中的 DIV 添加进了 JQUERY 对象 .
    仔细一看下面还来了这么一段
    try {
    Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;// Provide a fallback method if it does not work
    } catch( e ) {
    makeArray = function( array, results ) {
    var i = 0,
    ret = results || []; if ( toString.call(array) === "[object Array]" ) {
    Array.prototype.push.apply( ret, array ); } else {
    if ( typeof array.length === "number" ) {
    for ( var l = array.length; i < l; i++ ) {
    ret.push( array[i] );
    } } else {
    for ( ; array[i]; i++ ) {
    ret.push( array[i] );
    }
    }
    } return ret;
    };
    }
    果然是 #3 的方法 , 数组 . 坑爹的 , 怪我没认真看它 .
      

  10.   

    有时候感觉浏览器的差异真害人,还是用jquery吧。
      

  11.   

    朋友们 , 已经搞定了 !!! 结贴了 , 哥哥教你们怎样用对象还可以使用 Array 的 push 方法 . 
    (function(){
      var ele = {length:1,push:Array.prototype.push};
      alert(ele.push);
      var t = document.getElementsByTagName('div');
      for (var i=0;i<t.length;i++){
        ele.push(t[i]);
      }
      for(k in ele)alert(k+' / '+ele[k]);
    })();
    哈哈哈哈 , 试试看吧 , 加入把那个对象里的 length 拿掉看看 ?哥这也是看 jQuery 的选择器看来的
    // Handle $(DOMElement)
    if ( selector.nodeType ) {
    this.context = this[0] = selector;
    this.length = 1;
    return this;
    } // The body element only exists once, optimize finding it
    if ( selector === "body" && !context && document.body ) {
    this.context = document;
    this[0] = document.body;
    this.selector = selector;
    this.length = 1;
    return this;
    }
    看这两个入口 , 哪个没有 this.length ?
    jQuery 对象要是没有 this.length , 你把这个删掉 , 你在选 $('div') 你看它说啥 .
    无论你 $('xx') 无论什么,都要经过这个 .
    因为你 $('div') 相当于 rootjQuery.find('div')
    rootjQuery = $(document);
    所以无论你干啥 , 都要经过这两个 。哥看了半天终于发现了 , 所以写出了最上面的代码 ,哈哈哈哈 KO 了
      

  12.   

    当然 FF 等标准浏览器无此问题 ,只有 IE 这个纠结货有这个问题 ,而且 ,纠结货的版本还必须低于 9.0 .
      

  13.   

    上次我的问题也是个用户名下面有几朵小花的人回答的 , 我看来看去看不懂那些小花的意思 , 弄了半天鼠标移过去才知道 , 是 " XX 板块专家大奖 XX 名 " ... 所以比较迷信小花 .
    不过有时候 , 还真不能迷信小花 , 全心花则不如全不信花