前两天想用节点游走方式遍历图片处理。现在又遇到新问题。最先是 给图片加了 outHTML a过后 没有办法返回父节点,于是我在调用加表情前临时存了节点然后给主程序继续查节点,但是现在遇到一个问题,重复调用查节点函数会在第二次开始程序不进过程。直接返回一个字符串。。结构如下function aa(obj1)
{temp=null
.....
....
var temp= bb(obj1)
aa(temp)}function bb(obj)
{
if (obj.nextSibling)
return obj.nextSibling
....
.....
}现在的问题是,第一遍没有问题。
但是第二次运行到aa里面 
var temp= bb(obj1) 这一句它就不进入bb过程了,
这个时候监视到  bb 为 object temp为 null
如果执行这一步道aa第一行,这时候 obj1 (也就是temp) 会变成一个字符串"OBJECT:XXXXX"
也就是对象名字,而不是对象本身
现在头痛为什么它不进过程,为什么会变成一个字符串???????

解决方案 »

  1.   

    没有人回答,这是我第一次发的贴http://topic.csdn.net/u/20090718/15/4b21ef0e-4695-47fb-8b7d-1a5355f193c6.html
    现在代码已经改成完全节点游走。
      

  2.   

    A标签你是怎么添加的?
    PS:把代码帖全一点,好容易发现问题
      

  3.   

    好的,我把所有代码贴过来大家看看问题出在哪里
    [code]
    function ReImgSize() //主调用函数
    {
    var objNode,imgWidth
    if (arguments.length > 1){  //检测是否有参数
    topID=arguments[0].toString()
    objNode=document.getElementById(arguments[0].toString())
    imgWidth=arguments[1];
    if(objNode.childNodes.length>0) //有子节点才开始本次搜索
    {
    checkNodes(objNode.firstChild,imgWidth,topID)
    }
    }
    else{
    objNode=document.images
    imgWidth=720
    for(i=0;i<objNode.length;i++){
    Resize(objNode[i],imgWith)}
    }}
    //检测子节点,如果本节点没有子节点结束,如果本节点已经是最后一个返回父级下一个。
    function checkNodes(objNode,imgWidth,topID){ //检测是否需要改变和继续检测的ReImgSize外部函数
    //if(objNode) {

    if(objNode.id != topID)
    {
    var objTemp=null
    if(objNode.nodeName.toLowerCase()=="img")
    {var objTemp
    objTemp=changeNode(objNode)
    Resize(objNode,imgWidth)  //先检测是不是图片是就马上开始重置大小
    objNode=objTemp
    } //由于图片改名后会添加外部A标签,改变其parentNode,所以临时先获取下一个检测节点。
    if(objNode.childNodes.length>0)
    checkNodes(objNode.firstChild,imgWidth,topID)
    //如果有子节点转下一级。
    var objTemp=changeNode(objNode,topID)
    checkNodes(objTemp,imgWidth,topID)  //继续检测下一个节点
    }

    //}
    }
    function changeNode(objNode,topID) //ReImgSize检查并移动到下一个节点的函数
    {
    if(objNode){
    if(objNode.id == topID)  //如果回到顶退出
    return
    {if(objNode.nextSibling) //有如兄弟节点有线移动到它
    {
    return objNode.nextSibling;  //返回得到的下一个节点
    }
    else
    changeNode(objNode.parentNode); //如果没有兄弟,重新检测其父节点的兄弟节点,调用本身。
    }
    }}function Resize(objImg,imgWidth){ //修改图片大小并添加连接的函数
    if (document.all){
            if (objImg.width>imgWidth)
             {
           objImg.width=imgWidth;
       objImg.style.width=imgWidth;
           try{
                   objImg.outerHTML='<a class="img" href="'+objImg.src+'" target="_blank" title="在新窗口打开原始大小图片">'+objImg.outerHTML+'</a>'
                       }catch(e){}
               }
       }
      else{
            if (objImg.width>imgWidth) {
              objImg.title="在新窗口打开图片"
              objImg.style.cursor="pointer"
              objImg.onclick=function(e){window.open(this.src)}
            }
      }
    }
    [/code]
      

  4.   

    怎么刚才的代码看不到。??再来
    function ReImgSize() //主调用函数
    {
    var objNode,imgWidth
    if (arguments.length > 1){  //检测是否有参数
    topID=arguments[0].toString()
    objNode=document.getElementById(arguments[0].toString())
    imgWidth=arguments[1];
    if(objNode.childNodes.length>0) //有子节点才开始本次搜索
    {
    checkNodes(objNode.firstChild,imgWidth,topID)
    }
    }
    else{
    objNode=document.images
    imgWidth=720
    for(i=0;i<objNode.length;i++){
    Resize(objNode[i],imgWith)}
    }}
    //检测子节点,如果本节点没有子节点结束,如果本节点已经是最后一个返回父级下一个。
    function checkNodes(objNode,imgWidth,topID){ //检测是否需要改变和继续检测的ReImgSize外部函数
    //if(objNode) {

    if(objNode.id != topID)
    {
    var objTemp=null
    if(objNode.nodeName.toLowerCase()=="img")
    {var objTemp
    objTemp=changeNode(objNode)
    Resize(objNode,imgWidth)  //先检测是不是图片是就马上开始重置大小
    objNode=objTemp
    } //由于图片改名后会添加外部A标签,改变其parentNode,所以临时先获取下一个检测节点。
    if(objNode.childNodes.length>0)
    checkNodes(objNode.firstChild,imgWidth,topID)
    //如果有子节点转下一级。
    var objTemp=changeNode(objNode,topID)
    checkNodes(objTemp,imgWidth,topID)  //继续检测下一个节点
    }

    //}
    }
    function changeNode(objNode,topID) //ReImgSize检查并移动到下一个节点的函数
    {
    if(objNode){
    if(objNode.id == topID)  //如果回到顶退出
    return
    {if(objNode.nextSibling) //有如兄弟节点有线移动到它
    {
    return objNode.nextSibling;  //返回得到的下一个节点
    }
    else
    changeNode(objNode.parentNode); //如果没有兄弟,重新检测其父节点的兄弟节点,调用本身。
    }
    }}function Resize(objImg,imgWidth){ //修改图片大小并添加连接的函数
    if (document.all){
            if (objImg.width>imgWidth)
             {
           objImg.width=imgWidth;
       objImg.style.width=imgWidth;
           try{
                   objImg.outerHTML='<a class="img" href="'+objImg.src+'" target="_blank" title="在新窗口打开原始大小图片">'+objImg.outerHTML+'</a>'
                       }catch(e){}
               }
       }
      else{
            if (objImg.width>imgWidth) {
              objImg.title="在新窗口打开图片"
              objImg.style.cursor="pointer"
              objImg.onclick=function(e){window.open(this.src)}
            }
      }
    }
      

  5.   

    下面2行不注释掉应该是可以的呀function checkNodes(objNode,imgWidth,topID){ //检测是否需要改变和继续检测的ReImgSize外部函数 
    //if(objNode) { if(objNode.id != topID) 

    var objTemp=null 
    if(objNode.nodeName.toLowerCase()=="img") 
    {var objTemp 
    objTemp=changeNode(objNode) 
    Resize(objNode,imgWidth)  //先检测是不是图片是就马上开始重置大小 
    objNode=objTemp 
    } //由于图片改名后会添加外部A标签,改变其parentNode,所以临时先获取下一个检测节点。 
    if(objNode.childNodes.length>0) 
    checkNodes(objNode.firstChild,imgWidth,topID) 
    //如果有子节点转下一级。 
    var objTemp=changeNode(objNode,topID) 
    checkNodes(objTemp,imgWidth,topID)  //继续检测下一个节点 
    //} 
    }
      

  6.   

    个人感觉是第一次定义temp的时候没用var,所以此时定义的temp变成了全局变量。建议改成如下的方式再试试:
    function aa(obj1)
    { var temp=null
    .....
    ....
    temp= bb(obj1)
    aa(temp)
    }
      

  7.   

    楼主试试以下的代码:
    function ReImgSize() //主调用函数
    {
    var objNode=null,imgWidth=0,topID=null;
    if (arguments.length > 1){  //检测是否有参数
    topID=arguments[0].toString()
    objNode=document.getElementById(arguments[0].toString())
    imgWidth=arguments[1];
    if(objNode.childNodes.length>0) //有子节点才开始本次搜索
    {
    checkNodes(objNode.firstChild,imgWidth,topID)
    }
    }
    else{
    objNode=document.images
    imgWidth=720
    for(i=0;i <objNode.length;i++){
    Resize(objNode[i],imgWith)}
    }
    }
    //检测子节点,如果本节点没有子节点结束,如果本节点已经是最后一个返回父级下一个。
    function checkNodes(objNode,imgWidth,topID){ //检测是否需要改变和继续检测的ReImgSize外部函数
    //if(objNode) {if(objNode.id != topID)
    {
    var objTemp=null
    if(objNode.nodeName.toLowerCase()=="img")
    {var objTemp
    objTemp=changeNode(objNode)
    Resize(objNode,imgWidth)  //先检测是不是图片是就马上开始重置大小
    objNode=objTemp
    } //由于图片改名后会添加外部A标签,改变其parentNode,所以临时先获取下一个检测节点。
    if(objNode.childNodes.length>0)
    checkNodes(objNode.firstChild,imgWidth,topID)
    //如果有子节点转下一级。
    var objTemp=changeNode(objNode,topID)
    checkNodes(objTemp,imgWidth,topID)  //继续检测下一个节点
    }//}
    }
    function changeNode(objNode,topID) //ReImgSize检查并移动到下一个节点的函数
    {
    if(objNode){
    if(objNode.id == topID)  //如果回到顶退出
    return
    {if(objNode.nextSibling) //有如兄弟节点有线移动到它
    {
    return objNode.nextSibling;  //返回得到的下一个节点
    }
    else
    changeNode(objNode.parentNode); //如果没有兄弟,重新检测其父节点的兄弟节点,调用本身。
    }
    }}function Resize(objImg,imgWidth){ //修改图片大小并添加连接的函数
    if (document.all){
            if (objImg.width>imgWidth)
            {
          objImg.width=imgWidth;
      objImg.style.width=imgWidth;
          try{
                  objImg.outerHTML=' <a class="img" href="'+objImg.src+'" target="_blank" title="在新窗口打开原始大小图片">'+objImg.outerHTML+' </a>'
                      }catch(e){}
              }
      }
      else{
            if (objImg.width>imgWidth) {
              objImg.title="在新窗口打开图片"
              objImg.style.cursor="pointer"
              objImg.onclick=function(e){window.open(this.src)}
            }
      }
    }
      

  8.   

    问题已经解决,  但是现在
      try{ 
                  objImg.outerHTML=' <a class="img" href="'+objImg.src+'" target="_blank" title="在新窗口打开原始大小图片">'+objImg.outerHTML+' </a>' 
                      }catch(e){} 
              } 
    这里容易死循环,  还有就是不兼容...继续修改,把我可以在IE下运行的代码贴出来给大家  看看怎么解决循环和兼容问题function ReImgSize() //主调用函数
    {
    var objNode,imgWidth
    if (arguments.length > 1){  //检测是否有参数
     topID=arguments[0].toString()
     objNode=document.getElementById(arguments[0].toString())
     imgWidth=arguments[1];
     if(objNode.childNodes.length>0) //有子节点才开始本次搜索
     {
      checkNodes(objNode.firstChild,imgWidth,topID)
      }
    }
    else{
     objNode=document.images
     imgWidth=720
     for(i=0;i<objNode.length;i++){
     Resize(objNode[i],imgWith)}
    }}
    //检测子节点,如果本节点没有子节点结束,如果本节点已经是最后一个返回父级下一个。
    function checkNodes(objNode,imgWidth,topID){ //检测是否需要改变和继续检测的ReImgSize外部函数
     if(objNode.id != topID)
     {
      var objTemp=null
      if(objNode.nodeName.toLowerCase()=="img")
      {objTemp=changeNode(objNode)
      Resize(objNode,imgWidth)  //先检测是不是图片是就马上开始重置大小
      objNode=objTemp
      } //由于图片改名后会添加外部A标签,改变其parentNode,所以临时先获取下一个检测节点。
      if(objNode.childNodes.length>0)
      checkNodes(objNode.firstChild,imgWidth,topID)
      //如果有子节点转下一级。
      var objTemp=changeNode(objNode,topID)
      if (objTemp=="end") return
      checkNodes(objTemp,imgWidth,topID)  //继续检测下一个节点
       }}
    function changeNode(objNode,topID) //ReImgSize检查并移动到下一个节点的函数
    {
     if(objNode){
     if(objNode.id == topID)  //如果回到顶退出
     return "end"
     if(objNode.nextSibling) //有如兄弟节点有线移动到它
     return objNode.nextSibling;  //返回得到的下一个节点
     else
     return changeNode(objNode.parentNode); //如果没有兄弟,重新检测其父节点的兄弟节点,调用本身。
      }
     }function Resize(objImg,imgWidth){ //修改图片大小并添加连接的函数
     if (document.all){
            if (objImg.width>imgWidth)
             {
           objImg.width=imgWidth;
        objImg.style.width=imgWidth;
           try{
                   objImg.outerHTML='<a class="img" href="'+objImg.src+'" target="_blank" title="在新窗口打开原始大小图片">'+objImg.outerHTML+'</a>'
                       }catch(e){}
               }
       }
      else{
            if (objImg.width>imgWidth) {
              objImg.title="在新窗口打开图片"
              objImg.style.cursor="pointer"
              objImg.onclick=function(e){window.open(this.src)}
            }
      }
     }
      

  9.   

    给出html+js,并copy后在本地可运行的代码,这样方便大家帮你调试.
    搞半天,其实都是你自己在研究你自己的东西,别人帮不上忙呀.