搜尋

首頁  >  問答  >  主體

javascript - js中for迴圈中的程式碼沒執行完,就執行後面的程式碼了?

以下程式碼可以正常運行,但是【方法二】一定要加定時器才不會報錯,按理說JS不是應該把【方法一】代碼執行完才執行下面的【方法二】嗎,不使用定時器有沒有其他辦法保障【方法一】完全執行完再執行【方法二】


功能線上示範:http://bbs2.valueonline.cn/we...
demo下載:http://pan.baidu.com/s /1dEHPTV7

主要的JS程式碼:

$(function(){
//方法一:表格转图片点击在新窗口中打开
var tableImg=(function(){
    var _fixType = function(type) {
      type = type.toLowerCase().replace(/jpg/i, 'jpeg');
      var r = type.match(/png|jpeg|bmp|gif/)[0];
      return 'image/' + r;
    };

    function limitIMG(obj){
      html2canvas(obj,{
          onrendered:function(canvas){
              var type = 'jpeg';
              var imgData = canvas.toDataURL(type);
              imgData = imgData.replace(_fixType(type),'image/octet-stream');
              var newImg='<img src="'+imgData+'"  class="tableImg"/>';
              obj.after(newImg);

              //图片宽度限制
              var limitImg=(function(){
                  var a=obj.width();
                  var b=$(window).width();
                  if(a>b){
                      obj.next().width("100%");
                  }
                  obj.remove();
              })()
          }
      })
    }

    //点击哪个tableImg 就存储哪个到storage里面
    var num=$("body").find("table").length;
    for(var i=0;i<num;i++){
        limitIMG($('table').eq(i));
    }

    //设置数据
    $("#content").on("click",".tableImg",function(){
        sessionStorage.setItem("tableImg", $(this).attr("src"));
        window.open("tableImg.html");
    })
})()


//方法二:文字长度限制,收缩
setTimeout(function(){
    var showMore='<a href="javascript:" class="activeColor btnSS" data-onOff="true">展开说明</a>';
    $(".detailTxt").each(function(){
      var strOld=$(this).html();
      var str=strOld.replace(/<img(.*?)>/g, "[图片]");  //把img标签替换成[图片]显示
      str = str.replace(/<\/?[^>]*>/g,''); //去除HTML tag
      str = str.replace(/\s+/g,"");  //去除所有空格:
      str=str.replace(/&nbsp;/ig,'');//去掉&nbsp;
      var length=str.length;
      var maxNum=76;
      if(length>maxNum){
          str=str.substring(0,maxNum)+"...";
          $(this).html(str);
          $(this).after(showMore);
          //点击收缩内容;
          $(this).next().click(function(){
              var onOff=$(this).attr("data-onOff");
              if(onOff=="true"){
                  $(this).prev().html(strOld);
                  $(this).html("收起");
                  $(this).attr("data-onOff","false");
              }
              else{
                  $(this).prev().html(str);
                  $(this).html("展开说明");
                  $(this).attr("data-onOff","true");
              }
          })
      }
  })
  },1000);
})
滿天的星座滿天的星座2776 天前1174

全部回覆(3)我來回復

  • 怪我咯

    怪我咯2017-05-19 10:16:33

    js 本身是異步的,要嚴格順序執行,可以:

    1. 回呼函數;

    2. promise / yield ;

    3. async / await ( 需要 es5 相容 );

    4. 引入 async.js 函式庫;

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-19 10:16:33

    js是單線程的,就是一個執行完了再執行下一個,
    小的語句,執行快速的語句都是從上往下執行的,遇到慢的的比如你說的兩個函數,就不會按從上到下的順序執行。
    解決方法如上面這位朋友的回答,
    最簡單的是寫回調函數,也是最常用的方法,目的就是控制兩個函數的先後執行順序

    函數b是你以參數形式傳給函數a的,那麼函數b就叫回呼函數。
    b放在a的最後,a執行完會再執行b
    以上

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:16:33

    你這個是先執行後面的程式碼
    你用了jquery ready 後執行程式碼1的

    回覆
    0
  • 取消回覆