Javascript函数直到循环之后才执行
Javascript function not executing until after loop
我正在尝试遍历一个包含产品编号等(价格、数量等)的数组。产品编号用于生成在不同函数中调用的图像。当我调用函数并将循环变量传递给它时,在循环完成之前没有任何反应。然后生成所有产品图像,但它们是相同的。我不知所措。
for (var g = 0, len = oldDetails.length; g <= len - 1; g++) {
loaditem (oldDetails[g]['product_number'],g);
}
function loaditem (itemnumber, itemlocation) {
document.getElementById('divid' + itemlocation).innerHTML = '<img src = "' + itemnumber + '.jpg" />';
}
任何帮助将不胜感激。
编辑我正在发布完整的代码以供参考
//alert (JSON.stringify(oldDetails));
setTimeout(function() {
for (var g = 0, len = oldDetails.length; g <= len - 1; g++) {
count = 'somestring' + g;
loaditem(oldDetails[g]['product_number'], count);
if (g < len - 1) {
duplicate();
}
}
}, 1000);
function loaditem(newItemNumber, count) {
itemNumber = newItemNumber.toUpperCase();
//ARMS Handler
switch (itemNumber.substring(0, 1)) {
case 'A':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
case 'R':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
case 'M':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
case 'N':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
default:
lookupNumber = itemNumber;
}
//dash handler
if (itemNumber.substring(4, 5) == '-') {} else {
lookupNumber = lookupNumber.replace('-', '');
}
count = count.substr(count.length - 1, count.length);
orderDetails[count][0] = itemNumber; //adds product # to orderDetail array
imgSource = 'http://s3.amazonaws.com/images2.eprevue.net/p4dbimg/767/image480/' + lookupNumber.toLowerCase() + '_con.jpg';
var imageTest = $("<img>");
var imageTest_con = $("<img>");
imageTest.attr('src', imgSource).load(function() {
document.getElementById("product-image" + count).innerHTML = '<img src="' + imgSource + '" width="100%" height="auto" />';
})
.error(function() {
imgSource = 'http://s3.amazonaws.com/images2.eprevue.net/p4dbimg/767/image480/' + lookupNumber.toLowerCase() + '.jpg';
imageTest_con.attr('src', imgSource).load(function() {
document.getElementById("product-image" + count).innerHTML = '<img src="' + imgSource + '" width="100%" height="auto" />';
})
.error(function() {
imgSource = 'http://hekmancontract.andrewchristmann.com/quote-sheet/images/image-missing.jpg';
document.getElementById("product-image" + count).innerHTML = '<img src="' + imgSource + '" width="100%" height="auto" />';
});
});
document.getElementById('pnum' + count).innerHTML = " " + itemNumber.toUpperCase();
}
现在您发布了完整的代码,问题可以精确定位到在 loaditem
方法中使用的全局变量。
如果您将它们转换为本地(您应该这样做,因为它们在每次迭代中都会更改),它应该可以工作。
像这样的东西
function loaditem(newItemNumber, count) {
var itemNumber = newItemNumber.toUpperCase(),
lookupNumber;
//ARMS Handler
switch (itemNumber.substring(0, 1)) {
case 'A':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
case 'R':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
case 'M':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
case 'N':
lookupNumber = itemNumber.replace(itemNumber.substring(2, 3), '0');
break;
default:
lookupNumber = itemNumber;
}
//dash handler
if (itemNumber.substring(4, 5) == '-') {} else {
lookupNumber = lookupNumber.replace('-', '');
}
count = count.substr(count.length - 1, count.length);
orderDetails[count][0] = itemNumber; //adds product # to orderDetail array
var imgSource = 'http://s3.amazonaws.com/images2.eprevue.net/p4dbimg/767/image480/' + lookupNumber.toLowerCase() + '_con.jpg';
var imageTest = $("<img>");
var imageTest_con = $("<img>");
imageTest.attr('src', imgSource).load(function() {
document.getElementById("product-image" + count).innerHTML = '<img src="' + imgSource + '" width="100%" height="auto" />';
})
.error(function() {
imgSource = 'http://s3.amazonaws.com/images2.eprevue.net/p4dbimg/767/image480/' + lookupNumber.toLowerCase() + '.jpg';
imageTest_con.attr('src', imgSource).load(function() {
document.getElementById("product-image" + count).innerHTML = '<img src="' + imgSource + '" width="100%" height="auto" />';
})
.error(function() {
imgSource = 'http://hekmancontract.andrewchristmann.com/quote-sheet/images/image-missing.jpg';
document.getElementById("product-image" + count).innerHTML = '<img src="' + imgSource + '" width="100%" height="auto" />';
});
});
document.getElementById('pnum' + count).innerHTML = " " + itemNumber.toUpperCase();
}
所以问题是你声明了一些全局变量,同时你设置了一些使用这些变量的异步回调(load
和error
事件)。
调用loadItem
的循环的每次迭代,全局变量都将更改,而这些全局变量的实际值将在加载图像时(异步)使用。因此,在图像加载之前,imgSource
变量将更改其值,然后用于实际的 DOM img
插入。
相关文章:
- 如何在`window.open`之后执行回调
- 在$state.go之后执行$window.location.reload(true)
- Javascript:在每个onmouseover事件之后执行2个函数
- 可以使 jquery 点击事件在所有其他点击事件之后执行
- 在两个元素的 onrender 事件之后执行函数
- 流星技术/模式,用于等待数据库变量更改,然后在 in 之后执行某些操作
- 在jQuery .load Ajax之后执行if-statement
- 使javascript在firefox中的插件javascript之后执行
- 在catch之后执行
- 是否可以在特定的console.log()条目之后执行Javascript函数
- oncomplete 方法并不总是在操作 JSF 之后执行
- nodejs:setImmediate 回调在 setTimeout(fn, 0) 之后执行,与 nodejs 文档描述
- 为什么我不能在我的OnclientClickEvent之后执行我的onClick
- 在 ajax 之后执行数据表或重新绘制表
- 在 jQuery / Javascript 中的 bind() 事件之后执行条件
- 如何使 jQuery 语句在 .load() 之后执行
- 在具有 FS 操作的 FOR 循环之后执行
- 在 dgrid renderRow 之后执行一个函数
- window.print() 之后的 Javascript 有时在打印对话框之前执行,有时在打印对话框之后执行
- 在 3SE 之后执行函数