解决方案 »

  1.   


    function thank(id) {
    try{
    var thanksSpan = document.getElementById( 'thank'+id );
    var thanksLink = document.getElementById( 'saythank'+id );
    var thanksCount = 0;
    var get_data = '?type=thanks&action=do&id='+id;
    if( thanksSpan )
    thanksCount = parseInt( thanksSpan.innerHTML );
    xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
    var xmldoc = xmlparser(xmlhttp.responseText);
    var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
    var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
    if( queryCode=='1' ) {
    thanksCount = parseInt( queryValue );
    thanksSpan.innerHTML = thanksCount+1; }
    thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
    }
    }
    xmlhttp.open("GET","/query.html"+get_data,true);
    xmlhttp.send();
    }
    }catch(e){}
    直接把所有的有可能会出错的代码,放到try块中,如果代码有问题的话,就执行catch中的了。不过最好你可以直接判断,比如
    var thanksSpan = document.getElementById( 'thank'+id )  || “”;
    var thanksLink = document.getElementById( 'saythank'+id ) || “”;
    if(!thanksSpan  || !thanksLink  ){return;}判断是否存在,只要有一个是不存在的,就直接执行结束。都试试,看哪个管用呗。
      

  2.   


    还有一个问题就是为什么直接输thank(**)有效,而用for就无效了,比如
    for (var i= 5;i<=8;i++){
    thank(i);}
    往往只执行了thank(8)
    问了不少人,貌似这个问题就我遇到过
      

  3.   


    function thank(id,end) {
    if(id>end)
    return;
    var thanksSpan = document.getElementById( 'thank'+id );
    var thanksLink = document.getElementById( 'saythank'+id );
    if(!thanksSpan || !thanksLink)
    return thank(++id,end);
    var thanksCount = 0;
    var get_data = '?type=thanks&action=do&id='+id;
    if( thanksSpan )
    thanksCount = parseInt( thanksSpan.innerHTML );
    xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
    var xmldoc = xmlparser(xmlhttp.responseText);
    var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
    var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
    if( queryCode=='1' ) {
    thanksCount = parseInt( queryValue );
    thanksSpan.innerHTML = thanksCount+1; }
    thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
    thank(++id,end);
    }
    }
    xmlhttp.open("GET","/query.html"+get_data,true);
    xmlhttp.send();
    }thank(112,157);
      

  4.   

    你的 xmlhttp 是全局对象? 
    把全部代码放出来看看。
      

  5.   

    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest(); }
    else
    {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
    ...
    ...function thank(id) {
      var thanksSpan = document.getElementById( 'thank'+id );
      var thanksLink = document.getElementById( 'saythank'+id );
      var thanksCount = 0;
      var get_data = '?type=thanks&action=do&id='+id;
      if( thanksSpan )
        thanksCount = parseInt( thanksSpan.innerHTML );
      xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
          var xmldoc = xmlparser(xmlhttp.responseText);
          var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
          var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
          if( queryCode=='1' ) {
            thanksCount = parseInt( queryValue );
            thanksSpan.innerHTML = thanksCount+1; }
          thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
        }
      }
      xmlhttp.open("GET","/query.html"+get_data,true);
      xmlhttp.send();
    }
    function request(id,req) {
      var requestLink = document.getElementById( 'request'+id );
      var requestStatus = document.getElementById( 'request'+id+'_status' );
      xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
          var xmldoc = xmlparser(xmlhttp.responseText);
          var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
          if( queryCode=='1' || queryCode=='2' ) {
            if(req == 'true')
              requestStatus.style.display="";
            else
              requestStatus.parentNode.removeChild( requestStatus );
            requestLink.parentNode.removeChild( requestLink ); }
        }
      }
      if (req == 'true') {
        xmlhttp.open("GET","/query.html?type=request&action=add&id=" + id,true);
        xmlhttp.send(); }
      else {
        xmlhttp.open("GET","/query.html?type=request&action=remove&id=" + id,true);
        xmlhttp.send(); }
    }核心代码就这些了
      

  6.   


    这个对于连续的id确实挺好使,赞一个先!
    但是有些id是已经执行过的,还有一些id是不存在的。遇到那些时会提示
    Uncaught TypeError: Cannot read property 'childNodes' of undefined 
    或是
    Uncaught TypeError: Cannot read property 'parentNode' of null 
    错误
    还请再看看有什么解决之道
      

  7.   

    首贴的代码至少应写作function thank(id) {
      var thanksSpan = document.getElementById( 'thank'+id );
      var thanksLink = document.getElementById( 'saythank'+id );
      var thanksCount = 0;
      var get_data = '?type=thanks&action=do&id='+id;
      if( thanksSpan && thanksLink) {
        thanksCount = parseInt( thanksSpan.innerHTML );
        xmlhttp.onreadystatechange=function() {
          if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var xmldoc = xmlparser(xmlhttp.responseText);
            var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
            var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
            if( queryCode=='1' ) {
              thanksCount = parseInt( queryValue );
              thanksSpan.innerHTML = thanksCount+1;
            }
            thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
          }
        }
        xmlhttp.open("GET","/query.html"+get_data,true);
        xmlhttp.send();
      }
    }
    即只有在 thanksSpan 和 thanksLink 同时非空时才执行 ajax 操作但这还存在一个隐患:连续执行函数时,往往只有最后一次有效
    原因是 xmlhttp 是全局变量,后一次执行是把前一次的回调覆盖了
    所以应改写为function thank(id) {
      var thanksSpan = document.getElementById( 'thank'+id );
      var thanksLink = document.getElementById( 'saythank'+id );
      var thanksCount = 0;
      var get_data = '?type=thanks&action=do&id='+id;
      if( thanksSpan && thanksLink) {
        thanksCount = parseInt( thanksSpan.innerHTML );
        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
          var xmlhttp = new XMLHttpRequest();
        }else{// code for IE6, IE5
          var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function() {
          if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var xmldoc = xmlparser(xmlhttp.responseText);
            var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
            var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
            if( queryCode=='1' ) {
              thanksCount = parseInt( queryValue );
              thanksSpan.innerHTML = thanksCount+1;
            }
            thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
          }
        }
        xmlhttp.open("GET","/query.html"+get_data,true);
        xmlhttp.send();
      }
    }
    另外 xmlhttp.responseXML 就是 domxml 对象,可以直接操作
      

  8.   

    真是太赞了,版大大真是厉害!函数改成这样确实就搞定了!!!但是能不能不修改thank函数,只修改循环调用的指令来实现呢?(因为thank函数是别人写的,不太好意思修改)
    感觉那样更简洁方便些。有学长说可以用闭包来解决,不知怎么操作?
      

  9.   

    把  xmlhttp 包装成局部变量是可行的但是原来的 thank 函数存在的逻辑错误是非修改掉不可得
    这不是好不好意思修改的问题,而是原则问题为什么要改的原因我已经说明白了,我想那人也是明事理的人。只要把道理说清楚了,还不至于顽固不化吧?
      

  10.   


    我沟通了一下,发现改成这样又会有一个问题:就是只能操作当前页面的id。原先的函数,只要在任一页的控制台输入thank(**),不管**在第几页都能执行thank函数。有没有办法再优化一下呢?
      

  11.   


    这个对于连续的id确实挺好使,赞一个先!
    但是有些id是已经执行过的,还有一些id是不存在的。遇到那些时会提示
    Uncaught TypeError: Cannot read property 'childNodes' of undefined 
    或是
    Uncaught TypeError: Cannot read property 'parentNode' of null 
    错误
    还请再看看有什么解决之道
    有些id是已经执行过的,还有一些id是不存在的。具体是什么情况?因为好像不是页面元素不存在啊,不行就把html的部分也发出来
    不到万不得已不要用try catch这个东西
      

  12.   


    这个对于连续的id确实挺好使,赞一个先!
    但是有些id是已经执行过的,还有一些id是不存在的。遇到那些时会提示
    Uncaught TypeError: Cannot read property 'childNodes' of undefined 
    或是
    Uncaught TypeError: Cannot read property 'parentNode' of null 
    错误
    还请再看看有什么解决之道
    有些id是已经执行过的,还有一些id是不存在的。具体是什么情况?因为好像不是页面元素不存在啊,不行就把html的部分也发出来
    不到万不得已不要用try catch这个东西

    其实就是我们网站上有很多帖子,thank函数就是对帖子点赞
    id就是帖子的id,因为有的帖子点过赞了,有的帖子发布后违规被删,所以id就不存在了。目前我们的thank函数的优点是即使想 thank 的帖子(假设id=331)并不在当前页面,但是只要在当前页面的控制台执行 thank(331) 也能对该帖点赞成功。【这点很奇妙】
    (版大的方法只能将当前页面的帖子全部点赞,但是有几百页啊,,得累死)【我们想人工批量点赞,刷一下人气。】
      

  13.   


    function thank(id,end) {
    if(id>end)
    return;
    var thanksSpan = document.getElementById( 'thank'+id );
    var thanksLink = document.getElementById( 'saythank'+id );
    var thanksCount = 0;
    var get_data = '?type=thanks&action=do&id='+id;
    if( thanksSpan )
    thanksCount = parseInt( thanksSpan.innerHTML );
    xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
    try {
    var xmldoc = xmlparser(xmlhttp.responseText);
    var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
    var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
    if( queryCode=='1' ) {
    thanksCount = parseInt( queryValue );
    thanksSpan.innerHTML = thanksCount+1;
    }
    thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
    } catch(eSA) {}
    thank(++id,end);
    }
    }
    xmlhttp.open("GET","/query.html"+get_data,true);
    xmlhttp.send();
    }thank(112,157);
      

  14.   

    function thank(id) {
      var thanksSpan = document.getElementById( 'thank'+id );
      var thanksLink = document.getElementById( 'saythank'+id );
      var thanksCount = 0;
      var get_data = '?type=thanks&action=do&id='+id;
      thanksCount = parseInt( thanksSpan.innerHTML );
      if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        var xmlhttp = new XMLHttpRequest();
      }else{// code for IE6, IE5
        var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      if( thanksSpan && thanksLink) { //对页面不存在的元素就不要处理了,不然就要报错的
        xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var xmldoc = xmlparser(xmlhttp.responseText);
            var queryCode = xmldoc.getElementsByTagName('code')[0].childNodes[0].nodeValue;
            var queryValue = xmldoc.getElementsByTagName('value')[0].childNodes[0].nodeValue;
            if( queryCode=='1' ) {
              thanksCount = parseInt( queryValue );
              thanksSpan.innerHTML = thanksCount+1;
            }
            thanksLink.parentNode.innerHTML = thanksLink.innerHTML;
          }
        }
      }
      xmlhttp.open("GET","/query.html"+get_data,true);
      xmlhttp.send(); //不管在不在,先发了再说
    }
      

  15.   

    解决了!最终采用的是try/catch+局部 xmlhttp 变量的方法
    代码如下:
    for (var i=1800;i<=2100;i++){try{thank(i);var xmlhttp = new XMLHttpRequest();}catch(e){continue}}
    (挤在了一行有点乱)