以下の点についてアドバイスをお願いしたいのですが...
ユーザーがマイレージ請求とその他の費用を入力できる費用フォームがあります。走行距離のレートは決まっているので、たとえば、0 ~ 9 マイルの距離を移動する場合は一律料金が 5 ポンド、10 ~ 19 マイルの場合は 7 ポンド、20 ~ 20 マイルの場合は 9 ポンドなどです。
マイレージ値が変更されるたびに更新したい小計 div がありますが、小計を計算する関数は、価格帯を取得するための AJAX 呼び出しが完了する前に実行されているようです。
小計機能は基本的に次のとおりです。
function calculateClaim() {
var mileageDistance = document.getElementById('journeyMileage').value;
var expenseAmount1 = document.getElementById('expenseAmount1').value;
var expenseAmount2 = document.getElementById('expenseAmount2').value;
var expenseAmount3 = document.getElementById('expenseAmount3').value;
if (mileageDistance != "") {
calculateMileage = calculateMileageTotal(mileageDistance, function() {
var mileageTotal = this;
if (mileageTotal == '') {
$("#mileageTotal").val(0.00);
$("#journeyAmount").html('<strong>£0.00</strong>');
showDialog('alert','OK','','There is no mileage payment set up.','');
} else {
mileageTotal = parseFloat(mileageTotal).toFixed(2);
$("#mileageTotal").val(mileageTotal);
$("#journeyAmount").html('<strong>£' + mileageTotal + '</strong>');
}
});
} else {
mileageTotal = 0;
mileageTotal = mileageTotal.toFixed(2);
document.getElementById('journeyAmount').innerHTML = '<strong>£</strong>';
}
/*
SOME VALIDATION STUFF HERE FOR OTHER EXPENSE FIELDS
*/
subTotalCost = parseFloat(mileageTotal) + parseFloat(expenseAmount1) + parseFloat(expenseAmount2) + parseFloat(expenseAmount3);
subTotalCost = subTotalCost.toFixed(2);
document.getElementById('subTotal').innerHTML = '<strong>£' + subTotalCost + '</strong>';
}
そして、呼び出される calculateMileageTotal 関数は次のとおりです。
function calculateMileageTotal(mileage,callback) {
var mileageDistance = mileage;
var mileageTariffExists = $('#mileageTariffExists').val();
if (mileageTariffExists == 1) {
$.ajax({
type: "POST",
url: "./ajaxQueries.cfc?method=getExpensesMileageBand",
data: ({
competitionID: $("#compID").val(),
matchDate: $("#matchDate").val(),
mileageTotal: mileageDistance
}),
dataType: "xml",
success: function(xml) {
$(xml).find('field').each(function(){
//alert((new XMLSerializer()).serializeToString(xml));
var mileageTotal = $(this).find('string').text();
callback.call(mileageTotal);
});
}
});
} else {
showDialog('alert','OK','','There is no Mileage Rate available.','');
}
}
getExpensesMileageBand 関数は確実に正常に機能し、マイレージ レートを返しますが、関数からまだ返されていないため、mileageTotal 値が空であると考えるのは小計計算ですが、いくつかのアラートを入力すると機能します (機能が遅くなります)。
誰でもアイデアはありますか?以前にコールバックを使用したことがないので、それが間違っているのかどうかわかりませんか?