Проблема логики JavaScript в IE - PullRequest
0 голосов
/ 09 марта 2011

Сначала я немного объясню свою систему здесь.Это форма, позволяющая детям записаться на серию дневных курсов, которые проводятся в школьные пасхальные и летние каникулы.Форма позволяет одновременно регистрировать двоих детей, и если даты обоих детей совпадают, у брата есть скидка в размере 5 фунтов стерлингов за их даты.

В форме есть раздел даты, представляющий собой сериюфлажков.Когда вы ставите флажки, общая цена рассчитывается в нижней части страницы.

Цена на одного ребенка составляет 29 фунтов стерлингов, а коэффициент брака (для тех дат, которые соответствуют первому ребенку) составляет 24 фунтов стерлингов.За бронирование на курс верховой езды взимается дополнительная плата в размере £ 16.50, но эта логическая ошибка распространяется только на выбор даты.

По какой-то причине, которую я не могу понять, в Internet Explorer появляется цена за регистрацию 2 детей.На 5 фунтов меньше, чем должно.Вот мой код для вычисления дат (нижеприведенная функция запускается по нажатию флажка даты):

function processDates(){
    //contentsA and contentsB are used for outputting on the email confirmation
    valsA = [], dates_A =  document.forms['registerForm']['childADates[]'];
    for(var iA=0,elmA;elmA = dates_A[iA];iA++) {
        if(elmA.checked) {
            valsA.push(elmA.value);
        }
    }
    contentsA = valsA.join(', ');
    //this generates a string based on what dates were selected i.e. April 18th, April 19th etc.


    var valsB = [], dates_B =  document.forms['registerForm']['childBDates[]'];
    for(var iB=0,elmB;elmB = dates_B[iB];iB++) {
        if(elmB.checked) {
            valsB.push(elmB.value);
        }
    }
    contentsB = valsB.join(', ');
    //same as contentA but for the second child.

    //get the total dates for both children
    //fullDates is the number of dates selected (number of checkboxes checked)
    fullDates = (valsA.length + valsB.length);
    siblingDates=0;
    //this detects if entries are matching in the two arrays valsA and valsB
    for(var i in valsA) {
        for(var j in valsB) {
            if(valsA[i]==valsB[j]){
                            //if there are matching dates, increment a siblingDates value to get a total number of matching dates in the siblingDates variable
                siblingDates=siblingDates+1;
            }
        }
    }
    //get the amount of dates to be charged at £29
    fullDates = fullDates - siblingDates;

    fullPrice = fullDates*29;
    siblingPrice = siblingDates*24;
    totalPrice = fullPrice + siblingPrice;
    calcTotal();
}

function calcTotal(){
    var horseA = parseInt(document.getElementById("horseridingA").value);
    var horseB = parseInt(document.getElementById("horseridingB").value);
    var horse =  parseInt(horseA+horseB);
    //Add the horseriding price
    overall = parseFloat(horse*16.5)+totalPrice;
    //output the overall total to the form
    document.getElementById("totalPrice").innerHTML = overall;
}

ОБНОВЛЕНИЕ: Этот процесс запускается, когда пользователь выбирает один из флажковкоторые соответствуют каждой дате.18 апреля [], 19 апреля [] и т. Д. Эти флажки дублируются для второго ребенка.При нажатии на один из флажков запускаются вышеупомянутые функции, которые рассчитывают общую цену в нижней части экрана.В Internet Explorer, щелкнув дату для ChildA, вы получите 24 фунта, а не 29 фунтов стерлингов, а только в первую нажатую дату, все остальные даты, childA и childB, будут рассчитаны правильно.Первый выбор даты на £ 5 меньше, чем должен быть.

Я просто использовал IE, чтобы выбрать первую дату на главной дочерней стороне, и он дал £ 24, затем снял тот же флажок, который дал £ -5

ОБНОВЛЕНИЕ 2: Хорошо!Я сузил проблему до следующего утверждения:

fullDates = (valsA.length + valsB.length);
siblingDates=0;
for(var i in valsA) {
alert(valsA[i]);
    for(var j in valsB) {
        if(valsA[i]==valsB[j]){
            alert("does equal");
            siblingDates=siblingDates+1;
        }else{
            alert("does not equal");
        }
    }
}

После установки флажка 18-го апреля первое предупреждение (valsA [i]) гласит 18 апреля

Второе предупреждение гласит:"не равно", как и ожидалось.

В Internet Explorer вышеупомянутое происходит нормально, как и ожидалось, но я получаю дополнительный набор предупреждений:

После 2 вышеупомянутых предупреждений я получаю странное предупреждение о функции, котороеОповещения об ошибке длины строки, это примерно четыре строки уменьшенного кода, которые очень трудно расшифровать.

Затем снова появляется то же самое предупреждение.

Затем я получаю "равно"

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Попробуйте изменить свой цикл на это:

for (var i=0; i < valsA.length; i++) {
    for (var j=0; j < valsB.length; j++) {
        if(valsA[i]==valsB[j]){
             alert("does equal");
             siblingDates=siblingDates+1;
        }else{
            alert("does not equal");
        }
    }
}
0 голосов
/ 09 марта 2011

сначала эти строки выглядят не так, как они выглядят в вашем коде?

for(var iA=0,elmA;elmA = dates_A[iA];iA++)

  for(var iB=0,elmB;elmB = dates_B[iB];iB++) 

попробуйте что-то вроде этого

for(var iA=0;iA < dates_A.length;iA++){
var elmA = dates_A[iA];
...
}
...