完整代码已贴出,问题就在里面
var HTMLElePrototype = {
    extend: function ( name, fn ) {
        var _getEleById = document.getElementById;
        document.getElementById = function ( id ) {
            var _ele = _getEleById.apply( document, [id] );
            eval( "_ele." + name + "=fn" );
            return _ele;
        }
    }
}
HTMLElePrototype.extend( "myPreviousSibling", function () {
    var e = this.previousSibling;
    while ( e && e.nodeTpye != 1 ) {
        //我添加了e.nodeType的监视,发现这伙居然有两个值 如下.
        //Name              Value                 Type
      //e.nodeType        1                   Number
      //e.nodeType        undefined       Undefined        e = e.previousSibling;
      //这就是我上面判断失败的原因.为什么,我可从来没在C#里见过一个变量同时有两个值
        //请高手解释下为什么    }
    return e;
} );window.onload = function x() {
    var pr = document.getElementById( "p1" ).myPreviousSibling();
    lalert( pr );
}<body>   
    <p>p</p>
    <p>p</p>
    <p id="p1">p1</p>
    <p>p</p></body>

解决方案 »

  1.   


    问题补充*************************************
    错误的原因就是我期望的是( e && e.nodeTpye != 1 )
    e.nodeType 总是等于undefined
    我在在变量 监视发现他居然有两个值//我添加了e.nodeType的监视,发现这伙居然有两个值 如下.    
        //Name              Value                 Type   
       //e.nodeType        1                   Number  
        //e.nodeType        undefined       Undefined
      

  2.   

    一个dom的nextSibling或者previousSibling在你不同浏览器里得到的元素也不一定相同
    有些浏览器获得的是一个空白元素 而有些不是
    所以需要循环
      

  3.   

    我知道需要循环,但循环退出的判断条件无法满足,
    e.nodeType总是等于undefined
      

  4.   

     while ( e && e.nodeTpye != 1 ) {LZ果然是初學者,自己看...
      

  5.   

    我去,我根本没想到自己能把Type这个单词拼错. 晕菜啊.
    多谢楼上人才,你就是一大神