送信する前にフォームの内容を確認しようとしています。基本的に、私はフォーム内の数値を処理して、それらが正しい範囲内にあることを確認しようとしています。問題は、それを検証しようとしているJavaScriptが、渡されているアイテムがNaNであると思っていることです(私はそれを解析しています)。
少し作業を行ったところ、変数( "size")が "HTMLInputEleMent"を参照していることがわかりました。これは、確かに、NaNです(実際には何であるかはよくわかりません)。問題は、フィールドに「size」という名前を付けてonSubmitも「size」を渡したにもかかわらず、onSubmitが渡したいものを渡していないことだと思います。
引用符で囲んでみましたが、文字列になってしまいます...
フォーム内の変数をonSubmitフィールドに渡すことができないのではないでしょうか。そうですか?もしそうなら、どうすればいいですか?
これがフォームです:
<form onsubmit="return goodForm(size, day, month, year)" action="http://localhost:8080/pomper_servlet/CostCalc" method="GET">
The day of the month must be entered as a number (ex: 1,22)
<input type="text" name="day"><br>
The month of the year must be entered as a number (ex: Jan.=1, etc.)
<input type="text" name="month"><br>
The year must be entered as a 4 digit number (ex: 2008, 2017)
<input type="text" name="year"><br>
Please Choose a tour-length, in accordance with the chart below:
<input type="TEXT" name="length"><br>
How many people will be in your group? (No More than 10 allowed!)
<input type="text" name="size"><br>
Please select a tour:<br>
<input type="RADIO" name="tour" value="Gardiner Lake">
Gardiner Lake<br>
<input type="RADIO" name="tour" value="Hellroaring Plateau">
Hellroaring Plateau<br>
<input type="RADIO" name="tour" value="The Beaten Path">
The Beaten Path<br>
<input type="SUBMIT" value="Submit">
</form>
そしてこれがfunctions.jsからの関数です:
function goodForm(gSize, day, month, year) {
"use strict";
window.alert("goodFrame(): "+gSize);
var groupSize1 = parseInt( gSize.replace(/^"|"$/g, ""), 10);
window.alert("goodFrame(): "+groupSize1);
var sizeInt = parseInt(groupSize1);
if(groupSize(sizeInt) && goodDate(day, month, year)){
window.alert("true");
return true;
}
else{
window.alert("false")
return false;
}
そこには他の関数への参照がありますが、それらはこれには関係がないと思います。アラートはデバッグ目的でした...
前もって感謝します!
入力(日、月、年、サイズ)のそれぞれをidに指定してみることができます(name属性と同じ値を使用できます)。 goodForm()
関数内のIDで値を取得します。
_<input type="text" name="day" id="day">
_ <-セット
document.getElementById("some id").value
<-取得
このような意味ですか?
JavaScript:
document.getElementById("myForm").onsubmit = function() {
alert(document.getElementById("size").value);
}
HTML:
<form name="myForm" id="myForm">
<input type="text" name="size" id="size">
<input type="submit">
</form>
詳細:
Onsubmit関数は、HTMLでid = "myForm"として指定された "myForm"のIDを持つアイテムに添付されます。ドキュメントでメソッドgetElementByIdを使用して、このIDのアイテムを検索できます。 getElementByID(Id vs ID)を行わないように注意してください。フォームを送信すると、このメソッドが呼び出され、処理が始まります。
次に、ページ上の項目を検索して、フォームを調べたのと同じ方法でそれらの値を取得できます。 id = "size"のようなIDを与えるだけで、検索できます。
次のようなこともできます:
alert(document.myForm.size.value);
または
alert(document.forms["myForm"].size.value);
...しかし、少なくともしばらく前に、一部のブラウザがこの方法を嫌っていたので、私はその方法を避けてきました。多分それは今より良く、よりパフォーマンスがあります、私にはわかりません。
まず、このように(onsubmitを介して)インライン検証を行うのは不適切です。通常はイベントバインディングを行います。jQueryを使用してサンプルコードを含めますが、他のメソッドも使用できます。
まず、フォームにページの一意のID属性を指定します。 <form id="MyForm"...
次に、検証メソッドが必要なフィールドについて「知っている」ことを望むでしょう。
//this function is executed when the page's dom is loaded
// assumes jQuery is loaded already
$(function(){
//binds the myFormOnSubmit method below to run as part of your form's onsubmit method
$('#MyForm').submit(myFormOnSubmit);
//runs when the form is trying to submit
function myFormOnSubmit(event) {
var f = $(this);
// note, you have to match on attribute selectors
// you may want to give each of these fields an id=".." attribute as well to select against #IdName
var size = f.find('[name=size]').val();
var day = f.find('[name=day]').val();
var month = f.find('[name=month]').val();
var year = f.find('[name=year]').val();
var tour = f.find('[name=tour]:checked').val(); //selected radio button's
var isValid = validDate(year,month,day) && validSize(gSize) && validTour(tour);
if (!isValid) {
event.preventDefault(); //stop submit
}
}
function validTour(tour) {
return !!tour; //will be false if it's an empty string, ex: no selected value
}
function validSize(size) {
var s = parseInt(size); //get integer value for size
if (s <= 0 || s > 10) return false; //not in range
if (s.toString() !== size) return false; //doesn't match input, invalid input
return true; //true
}
function validDate(year, month, day) {
//coerce the values passed into numbers
var y = +year, m = +month, d = +day;
//convert to an actual date object
var dtm = new Date(y, --m, d);
//compare the values
if (!dtm) return false; //invalid input
if (dtm.getFullYear().toString() !== year.toString()) return false; //year doesn't match input
if ((dtm.getMonth() + 1).toString() !== month.toString()) return false; //month doesn't match input
if (dtm.getDate().toString() !== day.toString()) return false; //day doesn't match input
var now = new Date(); console.log(now);
var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
//entered date is before today, invalid
if (dtm <= today) return false;
//passed checks
return true;
}
});
JQueryを使用したくない場合:
パラメータを渡す必要はありません。IDを指定して、適切なフォーム関数内のIDで取得してください。
function goodForm() {
var size= document.getElementById("size").value;
if(size...){
...
}
}