The following code can run normally, but [Method 2] must add a timer to avoid reporting an error. Logically speaking, shouldn’t JS execute the [Method 1] code before executing the following [Method 2]? Timing is not used Is there any other way to ensure that [Method 1] is completely executed before executing [Method 2]
Function online demonstration: http://bbs2.valueonline.cn/we...
demo download: http://pan.baidu.com/s /1dEHPTV7
Main JS code:
$(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(/ /ig,'');//去掉
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);
})
怪我咯2017-05-19 10:16:33
js itself is asynchronous and must be executed in strict order:
Callback function;
promise / yield;
async / await (requires es5 compatibility);
Introducing async.js library;
PHP中文网2017-05-19 10:16:33
js is single-threaded, that is, after one execution is completed, the next one is executed.
Small statements and fast-executing statements are executed from top to bottom. When encountering slow ones, such as the two functions you mentioned, it will not Execute in order from top to bottom.
The solution is as shown in the friend’s answer above.
The simplest way is to write callback function, which is also the most commonly used method. The purpose is to control the order of execution of two functions
Function b is passed to function a in the form of a parameter, then function b is called a callback function.
b is placed at the end of a. After a is executed, b
and above will be executed again
phpcn_u15822017-05-19 10:16:33
You execute the following code first
You use jquery ready and then execute code 1