我有一个页面,其中包含一系列“相关”选项。一切正常,除非有一个预先选择的选项。我可以设置“预选”,如果我在代码中放置“警报”但没有它它不起作用。
例如:
function loader(){
if ($("#prod_1").val() > 0){
switchBatch(1);
$('#batch_1').val('15');
updateMax(1);
}
if ($("#prod_2").val() > 0){
switchBatch(2);
alert('yup');
$('#batch_2').val('35');
updateMax(2);
}
}
$(function() {
loader();
});
第二个有“警告('是');”在它工作,但第一个没有。
“switchBatch()”是一个将选项(从ajax调用)加载到批量选择控件的函数。两个实例都加载选项,但只有第二个实例选择正确的选项。
有什么建议吗?
兰斯
以下是整个事情:
<script>
maxVals = [];
function switchBatch(idNum){
maxVals = [];
$("#max_"+idNum).val('');
$.ajax({
type: "POST",
url: "/cfc/product.cfc?method=pialJson",
data: ({
productID: $("#prod_"+idNum).val()
}),
dataType: "json",
success: function(result){
options = '';
var colMap = new Object();
for(var i = 0; i < result.COLUMNS.length; i++) {
colMap[result.COLUMNS[i]] = i;
}
for (var i = 0; i < result.DATA.length; i++){
options += '<option value="' + result.DATA[i][colMap["BATCHID"]] + '">' + result.DATA[i][colMap["BATCHNAME"]]+ '</option>';
maxVals[i] = result.DATA[i][colMap["INSTOCK"]];
}
$("select#batch_"+idNum).html(options);
updateMax(idNum);
}
});
}
function updateMax(idNum){
thisOne = $("#batch_"+idNum).attr("selectedIndex");
$("#max_"+idNum).val(maxVals[thisOne]);
checkMax(idNum);
}
function checkMax(idNum){
$("#qty_"+idNum).removeClass('red');
if ($("#qty_"+idNum).val() > $("#max_"+idNum).val()){
$("#qty_"+idNum).addClass('red');
}
}
function loader(){
if ($("#prod_1").val() > 0){
switchBatch(1);
alert('yup');
$('#batch_1').val('<cfoutput>#batch_1#</cfoutput>');
updateMax(1);
}
if ($("#prod_2").val() > 0){
switchBatch(2);
alert('yup');
$('#batch_2').val('<cfoutput>#batch_2#</cfoutput>');
updateMax(2);
}
}
$(function() {
loader();
});
</script>
答案 0 :(得分:1)
我认为预选不起作用,因为“switchBatch()”函数使用ajax。调用“switchBatch()”之后的JavaScript代码在ajax调用完成之前执行,因此select元素为空。但它可以在第二个if-block中工作,因为alert()会给ajax调用足够的时间来完成并填充select元素。
答案 1 :(得分:0)
如果没有updateMax()
的代码,很难说究竟发生了什么。
您可以尝试的一种方法是,将updateMax()
附加到选择控件的onchange
侦听器(即$('#selectID').change(updateMax)
),而不是调用updateMax()
,执行{{ 1}}。
答案 2 :(得分:0)
让你的switchBatch()
函数接受另一个参数,这是一个函数,包含你在AJAX请求之后尝试运行的代码。
然后在success:
switchBatch().
回调中调用该函数
function loader(){
if ($("#prod_1").val() > 0) {
switchBatch(1, function() {
$('#batch_1').val('15');
updateMax(1); // right now this is being called in switchBatch() as well
}
);
}
if ($("#prod_2").val() > 0) {
switchBatch(2, function() {
$('#batch_2').val('35');
updateMax(2); // right now this is being called in switchBatch() as well
}
);
}
}
// function argument -------v
function switchBatch(idNum, func){
maxVals = [];
$("#max_"+idNum).val('');
$.ajax({
type: "POST",
url: "/cfc/product.cfc?method=pialJson",
data: ({
productID: $("#prod_"+idNum).val()
}),
dataType: "json",
success: function(result){
options = '';
var colMap = new Object();
for(var i = 0; i < result.COLUMNS.length; i++) {
colMap[result.COLUMNS[i]] = i;
}
for (var i = 0; i < result.DATA.length; i++){
options += '<option value="' + result.DATA[i][colMap["BATCHID"]] + '">' + result.DATA[i][colMap["BATCHNAME"]]+ '</option>';
maxVals[i] = result.DATA[i][colMap["INSTOCK"]];
}
$("select#batch_"+idNum).html(options);
// call the function that was passed in
func.call(null);
updateMax(idNum); // updateMax is being called in the function that is
// passed in. You probably don't need it in both places
}
});
}