3

DOM が完全にロードされた後に、オブジェクトの値を設定したいと考えています。OnBlur問題は、テキスト ボックスからandOnFocusイベントを呼び出した後、null ポインター例外が発生することです。私は何を間違っていますか?

JavaScript:

$(document).ready(function () {
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last()
});

var tempThursdayHrs = 0.0;
function BlurThursdayHrs(sender, args) { sumThursdayHrs.text(tempThursdayHrs + sender.get_value()); }
function FocusThursdayHrs(sender, args) { tempThursdayHrs = sumThursdayHrs.text() - sender.get_value(); }

マークアップ:

<telerik:RadNumericTextBox ID="txtThursdayHrs" runat="server" NumberFormat-DecimalDigits="1"
        Width="25px" MinValue="0" Type="Number" DbValue='<%# Eval("ThursdayHrs") %>'>
        <ClientEvents OnBlur="BlurThursdayHrs" OnFocus="FocusThursdayHrs" />
</telerik:RadNumericTextBox>

エラー:

Microsoft JScript ランタイム エラー: 'sumThursdayHrs' は定義されていません

4

4 に答える 4

3

見出しで述べたように、値は関数(ready-event-handler関数)で設定されます。ただし、JavaScriptには関数スコープがあり、キーワードsumThursdayHrsを使用してローカル(「プライベート」とは言わない)変数であると宣言したため、外部からは定義されていません。var2つの可能性:

  • sumThursdayHrsをグローバル変数にします(「var」を削除します)(そして最終的には外部で宣言します)。名前の競合や共同作業を排除するために、可能な限りグローバル変数を回避する必要があることに注意してください。
  • または、それを使用するすべての関数を同じスコープに取り込みます。注意してください。そうすると、これらの関数もグローバルに使用できなくなるため、同じコンテキストでブラー/フォーカスハンドラーを設定する必要があります(Patrick Scottが提案したように)。
于 2012-04-17T21:15:57.683 に答える
2

すでにjqueryを使用している場合、イベントをjqueryでバインドしてみませんか?

$('span[id$="txtThursdayHrs"]:first').on("focus", FocusThursdayHrs)
          .on("blur", BlurThursdayHrs);

sumThursdayHrsまた、関数を呼び出す代わりに、同じ場所で匿名関数にアクセスしたり使用したりできるように、これらの関数を doc ready 関数内で宣言します。

元:

$(document).ready(function () {
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last();
    var tempThursdayHrs = 0.0;
    $('span[id$="txtThursdayHrs"]:first').on("focus", function() {
        sumThursdayHrs.text(tempThursdayHrs + $(this).val());
    })
    .on("blur", function() {
        tempThursdayHrs = sumThursdayHrs.text() - $(this).val();
    });
});

またはsumThursdayHrs、グローバルオブジェクトに移動します... 正気を保つために、ウィンドウに配置しないことをお勧めします。

代わりに、グローバル名前空間を定義して、アプリ固有のグローバル変数を保持します。これは、地球規模の削減と呼ばれます。

元。

var MyApp = {};
$(document).ready(function () {
    MyApp.sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last();
    //...

--

MyApp.tempThursdayHrs = 0.0;
function BlurThursdayHrs(sender, args) { MyApp.sumThursdayHrs.text(MyApp.tempThursdayHrs + sender.get_value()); }
function FocusThursdayHrs(sender, args) { MyApp.tempThursdayHrs = MyApp.sumThursdayHrs.text() - sender.get_value(); }
于 2012-04-17T21:05:41.010 に答える
1

エラーはスコーピングが原因です:

$(document).ready(function () {
    // sumThursdayHrs is a *local* variable to the function
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last()
});

// ... so this will fail because it is trying to use
// window.sumThursdayHrs (the property sumThursdayHrs on the window object),
// which is not set and thus the Reference Error
function BlurThursdayHrs(sender, args) {
    sumThursdayHrs.text(tempThursdayHrs + sender.get_value());
}

「簡単な修正」(有効な場合と無効な場合があります)は次のとおりです。

$(document).ready(function () {
    // Set the "global variable" sumThursdayHrs
    // "window." isn't technically required, but it is to show a point.
    window.sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last()
});

ハッピーコーディング。

于 2012-04-17T21:14:50.807 に答える
0

あなたが与えたコード例が同じバッグにあるかどうかはわかりませんが、 内で変数を定義した場合$(document).ready()は、変数がクロージャー内にあることを知ってください。それ以外では、未定義になります。

それでは、なぜこれをしないのですか:

$(document).ready(function () {
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last();

    var tempThursdayHrs = 0.0;

    function BlurThursdayHrs(sender, args) {
        sumThursdayHrs.text(tempThursdayHrs + sender.get_value());
    }

    function FocusThursdayHrs(sender, args) {
        tempThursdayHrs = sumThursdayHrs.text() - sender.get_value();
    } 
});

$(document).ready()上記のコードでは、すべてがクロージャー内にあるため、意図した値を取得する必要があります。さらに、jquery オブジェクトを$('span[id*="lblThursdayHrs"]')変数に割り当てたので、外部ではなく jquery 環境内で使用する必要があります...一言で言えば、jquery を使用している場合は、jquery 環境に保管してください。

あなたがしたことは、あなたが実行することによってすべてのメソッドとプロパティを使用するというjqueryとの契約に署名したことですvar sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last(). を使用したら$(something)、それだけです。jquery 環境内で使用する必要があります。

于 2012-04-17T21:27:15.377 に答える