2012-04-16 5 views
-2

私はこのスクリプトを注文総フォームに対してテストしています。私はそれを実行し、エラーコンソールをチェックアウトすると、それがエラーを返す続けている: this.form is nullJavaScriptが返されます。ドキュメントがロードされたときにFormがNullです

、これは、私は別のJSのページにリンクされているコードです:

function CalculateTotal(frm) 
{ 
    var order_total = 0 

    // Run through all the form fields 
    for (var i=0; i < frm.elements.length; ++i) 
    { 
     // Get the current field 
     form_field = frm.elements[i] 

     // Get the field's name 
     form_name = form_field.name 

     // Is it a "product" field? 
     if (form_name.substring(0,4) == "PROD") 
     { 
      // If so, extract the price from the name 
      item_price = parseFloat(form_name.substring(form_name.lastIndexOf("_") + 1)) 

      // Get the quantity 
      item_quantity = parseInt(form_field.value) 

      // Update the order total 
      if (item_quantity >= 0) 
      { 
       order_total += item_quantity * item_price 
      } 
     } 
    } 

    // Display the total rounded to two decimal places 
    frm.TOTAL.value = round_decimals(order_total, 2) 
} 

function round_decimals(original_number, decimals) 
{ 
    var result1 = original_number * Math.pow(10, decimals) 
    var result2 = Math.round(result1) 
    var result3 = result2/Math.pow(10, decimals) 
    return pad_with_zeros(result3, decimals) 
} 

function pad_with_zeros(rounded_value, decimal_places) 
{ 
    // Convert the number to a string 
    var value_string = rounded_value.toString() 

    // Locate the decimal point 
    var decimal_location = value_string.indexOf(".") 

    // Is there a decimal point? 
    if (decimal_location == -1) 
    { 
     // If no, then all decimal places will be padded with 0s 
     decimal_part_length = 0 

     // If decimal_places is greater than zero, tack on a decimal point 
     value_string += decimal_places > 0 ? "." : "" 
    } 
    else 
    { 
     // If yes, then only the extra decimal places will be padded with 0s 
     decimal_part_length = value_string.length - decimal_location - 1 
    } 

    // Calculate the number of decimal places that need to be padded with 0s 
    var pad_total = decimal_places - decimal_part_length 

    if (pad_total > 0) 
    { 
     // Pad the string with 0s 
     for (var counter = 1; counter <= pad_total; counter++) 
      value_string += "0" 
    } 

    return value_string 
} 

//When page loaded 
document.onload = function() 
{ 
    CalculateTotal(frm); 
}; 

を編集:this.formがありますHTMLのテキストボックスから呼び出さ:このエラーが返されている理由

<input type="text" name="PROD_CC_3.99" size="10" maxlength="3" onChange="CalculateTotal(this.form)"> 

はあなたのいずれかが見ることができますか?私は今かなりの時間それを把握しようとしてきました。

+0

どこコードでthis.formをですか? – Ibu

+0

はnullを渡すフォームですか?あなたは何を渡していますか?関連するHTMLを表示してください。 – Colleen

+0

あなたが投稿したことによる。 'this.form'は表示されず、' CaluclateTotal'に渡す値もどこにも宣言されていないようです... – Tejs

答えて

0

thisがボタンです。 document.getElementById("formname")として完全な形式を渡すか、そのまま直接入力してくださいscript

+0

this.formはフォームを返します。どんなinput.formでも現在のフォームを返します。 – Ibu

+0

多分入力がフォーム内にないのでしょうか?しかし、これは依然として機能し、どのようにそれが直接参照することですsimpel。 :-) – Steen

+0

@Ibu FFでは、 'this'formをイベントハンドラに渡すと' null'(実際にはエラー)が返され、IEは 'undefined'を返します。 – Teemu

1

文字が足りませんでしたか?

<form id="invisible_form_to_SO" onChange="CalculateTotal(this.form);"> 

これは次のようになります:

あなたはまた、 document.onload -handlerから CalculateTotal()の呼び出しを削除する必要が
<form id="invisible_form_to_SO" onChange="CalculateTotal(this);"> 

、私は推測

は、おそらくあなたは、このような何かを持っています。

+0

はい、それでした!大変ありがとう。私はフォーム自体を追加することを忘れていました。 – Brian

0

あなたが呼び出す必要があります:

CalculateTotal(this.parentNode) 
+0

IF 'PROD_CC_3.99'は' FORM'の真の子です。私たちはそれを知らない。 @Brian 'FORM'要素のHTML全体を投稿してください。 – Teemu

関連する問題