0

JavaScript関数があります。3番目の条件は機能していません。ループ内で単独の場合は機能しますが、他の条件では機能しません。理由はわかりません。誰でも助けることができますか??

function verif(ref1, ref2, ref3, ref4, ref5, ref6) {
    document.forms["form"].intitule.value = ref1;
    document.forms["form"].montant.value = ref2;
    document.getElementById(ref3).selected = true;

    for (var i = 1; i <= 400; i++) {
        if (document.getElementById("newDay").options[i].text == ref4) {
            document.getElementById("newDay").options[i].selected = true;
        }
        if (document.getElementById("newMonth").options[i].text == ref5) {
            document.getElementById("newMonth").options[i].selected = true;
        }
        if (document.getElementById("newYear").options[i].text == ref6) {
            document.getElementById("newYear").options[i].selected = true;
        }
    }
}
4

2 に答える 2

0

3すべてのアイテムに対して 1 つのループを実行しようとしているようです。その利点は、必要な反復回数が少ないことですが、 undefined を検索しないようにするためのコードは含まれていません<option>。次に、1 つのループを使用する利点が実際には反復回数を節約することであり、したがって 2 つのループがあり、最初のループが終了した場所で 2 番目のループをピックアップしても、最小の反復カウントが得られることを検討してください。

したがって、ループの繰り返しを節約したい場合は、次のようなことを試すことができます。ここでは、ループ内のアイテムがどれだけ進んでiいるか、何が既に見つかっているかに応じて減少します。ただし、これによりコードの重複が発生します。12 < 31 < x ( xは約 と仮定しています) であるため、ループがの順に並べ替えられていることに注意してください。コースは存在しません。400

function verif(ref1, ref2, ref3, ref4, ref5, ref6) {
    document.forms["form"].intitule.value = ref1;
    document.forms["form"].montant.value = ref2;
    document.getElementById(ref3).selected = true;

    var i = 0, found = {day: 0, month: 0, year: 0},
        elm = {
            days: document.getElementById("newDay"),
            months: document.getElementById("newMonth"),
            years: document.getElementById("newYear")
        };
    // months length = min(days, months, years)
    while (++i < elm.months.length && !found.months) {
        if (elm.days.options[i].text == ref4) {
            found.days = elm.days.options[i].selected = true;
        }
        if (elm.months.options[i].text == ref5) {
            found.months = elm.months.options[i].selected = true;
        }
        if (elm.years.options[i].text == ref6) {
            found.years = elm.years.options[i].selected = true;
        }
    }
    // days length = min(days, years)
    while (++i < elm.days.length && !found.days) {
        if (elm.days.options[i].text == ref4) {
            found.days = elm.days.options[i].selected = true;
        }
        if (elm.years.options[i].text == ref6) {
            found.years = elm.years.options[i].selected = true;
        }
    }
    // only years left
    while (++i < elm.years.length && !found.years) {
        if (elm.years.options[i].text == ref6) {
            found.years = elm.years.options[i].selected = true;
        }
    }
}

また、ステートメントを含めていないことに気付くかもしれませんbreak。これは、後のループでまだ検索されるものを見つけた場合でも、現在のループに固有の項目を検索したいが、検索したくないためです。同じ繰り返しの他のチェックをスキップします。また、後のループで時間を無駄にしたくありません。したがって、同様のアクションを実行するコードの一部がbreak代わりにあり<condition>ます。

于 2013-08-15T12:16:36.283 に答える
0

それぞれの条件を独自の try catch に追加し、いずれかの条件がエラーをスローしているかどうかを確認します。デバッグに役立つアラートを追加しました。

function verif(ref1, ref2, ref3, ref4, ref5, ref6) {
    document.forms["form"].intitule.value = ref1;
    document.forms["form"].montant.value = ref2;
    document.getElementById(ref3).selected = true;

    for (var i = 1; i <= 400; i++) {
        try{
        if (document.getElementById("newDay").options[i].text == ref4) {
            document.getElementById("newDay").options[i].selected = true;
        }
        }catch(err){
          alert(err);
        }
        try{
        if (document.getElementById("newMonth").options[i].text == ref5) {
            document.getElementById("newMonth").options[i].selected = true;
        }
        }catch(err){
          alert(err);
        }
        try
        {
        if (document.getElementById("newYear").options[i].text == ref6) {
            document.getElementById("newYear").options[i].selected = true;
        }
        }catch(err){
          alert(err);
        }
    }
}
于 2013-08-15T10:25:28.900 に答える