1

私が取り組んできた機能に問題があります。この関数の目的は、2 セットのテキスト入力ボックス内にある日付を取得し、2 つの差を計算してから、その日数を 3 番目のボックス セットに配置することです。私の機能を以下に示します。

function daysBetween() {

for (var i = 0; i < 8; i++) {   

//Get the value of the current form elements
    var start = namestart[i];
    var end = namend[i];
    var out = names[i];

//Duration of a day
    var d = 1000*60*60*24;

// Split Date one
    var x = start.split("-");
// Split Date two
    var y = end.split("-");

/// // Set Date one object
    var d1 = new Date(x[0],(x[1]-1),x[2]);
//  // Set Date two object
    var d2 = new Date(y[0],(y[1]-1),y[2]);
//  
//  //Calculate difference
    diff = Math.ceil((d2.getTime()-d1.getTime())/(d));

    //Show difference
    document.getElementById(out).value = diff;

    }
}

最初に変数によって参照される 3 つの配列には、アクセスしたいフォーム要素の名前だけが含まれています。アラート ボックスを使用して start、end、out 変数をテストしましたが、コードの Show Difference コメントの下に行がない場合、ループは正常に実行されます。私も調べて、すべての名前が一致していることを確認しました。また、手動でページを 8 回実行し (8 セットのボックスがあります)、それぞれの名前のセットを使用すると、日ボックスに「NaN」が正常に表示されます (現時点ではソース ボックスにデータがないため、NaN が予想されます)。行動)。

ここに示すように関数を実行すると、テキスト ボックスの最初のセットが意図したとおりに機能します。その後、ループが停止します。したがって、私の質問は非常に単純です。names[0] 値が機能しているにもかかわらず、ループが getElementById でハングアップするのはなぜですか。テキスト ボックスが見つかり、計算された差がボックスに表示されます。names[1] のテキスト ボックスが機能せず、ループがハングアップします。

私のテキスト ボックスのより詳細なコードが必要な場合は、提供できますが、以下の簡単なテンプレートに従います。

// namestart[] array
<input type="text" name="start_date_one" id="start_date_one" value=""/> <br />
// namend[] array
<input type="text" name="end_date_one" id="end_date_one" value=""/> <br />
// names[] array
<input type="text" name="day_difference_one" id="day_difference_one" value=""/>

事前に助けてくれてありがとう。

編集:参照用に配列定義を追加すると思ったコメントに気づきました。これらは、私の calcdate.js ファイルの関数のすぐ上で定義されています。

var namestart = new Array ();
namestart[0] = "trav_emer_single_date_go";
namestart[1] = "trav_emer_extend_date_go";
namestart[2] = "allinc_single_date_go";
namestart[3] = "allinc_annual_date_go";
namestart[4] = "cancel_date_go";
namestart[5] = "visitor_supervisa_date_go";
namestart[6] = "visitor_student_date_go";
namestart[7] = "visitor_xpat_date_go";

var namend = new Array ();
namend[0] = "trav_emer_single_date_ba";
namend[1] = "trav_emer_extend_date_ba";
namend[2] = "allinc_single_date_ba";
namend[3] = "allinc_annual_date_ba";
namend[4] = "cancel_date_ba";
namend[5] = "visitor_supervisa_date_ba";
namend[6] = "visitor_student_date_ba";
namend[7] = "visitor_xpat_date_ba";

var names = new Array ();
names[0] = "trav_emer_single_days";
names[1] = "trav_emer_extend_days";
names[2] = "allinc_single_days";
names[3] = "allinc_annual_days";
names[4] = "cancel_days";
names[5] = "visitor_supervisa_days";
names[6] = "visitor_student_days";
names[7] = "visitor_xpat_days";

ファイルを参照し、ヘッダーで関数を次のように呼び出します。

<script type="text/javascript" src="calcdate.js"></script>
<script type="text/javascript">
window.onload = daysBetween;
</script>
4

2 に答える 2

1

何よりもまず、IDがないオブジェクトをIDで参照することはできません。

<input type="text" id="start_date_one" name="start_date_one" />

于 2012-11-20T22:14:20.717 に答える
0

名前が含まれていると言うのでout、変更する可能性があります

document.getElementById(out).value = diff;

document.getElementsByName(out)[0].value = diff;

または、実際にHTMLに属性を追加して、id属性と同じ値に設定するだけでname、JavaScriptの変更を回避できます。

getElementByIdid属性でgetElementsByName要素を取得し、指定されたname属性を持つすべての要素を取得して、配列として返します。HTMLでは、idは一意であると想定されているため、getElementByIdは1つの要素のみを返します。

于 2012-11-20T22:14:25.420 に答える